/** * z_policy_call: * @handler: Python object whose method shall be called * @name: Method name * @args: Arguments to pass to the method * @called: Flag to store into whether the call succeeded or not (may be NULL) * @session_id: Session ID for logging * * If the requested method exists and is callable, calls it. * If @called is not NULL, it will be set if the call succeeded, cleared if not. * * Returns: * The return value of the call */ PyObject * z_policy_call(PyObject *handler, char *name, PyObject *args, gboolean *called, gchar *session_id) { PyObject *attr; PyObject *res; z_enter(); g_assert(PyThreadState_GET()); attr = PyObject_GetAttrString(handler, name); if (!attr || !PyCallable_Check(attr)) { if (attr) { Py_XDECREF(attr); PyErr_Format(PyExc_TypeError, "Event must be callable: %s", name); PyErr_Print(); /* produce a backtrace, and handle it immediately */ } PyErr_Clear(); Py_XDECREF(args); res = NULL; z_trace(NULL, "Cannot find function; name='%s'", name); if (called) *called = FALSE; } else { if (called) *called = TRUE; res = z_policy_call_object(attr, args, session_id); z_trace(NULL, "Function called; name='%s'", name); Py_XDECREF(attr); } z_return(res); }
static GIOStatus pop3_transfer_src_read(ZTransfer2 *s, ZStream *stream, gchar *buf, gsize count, gsize *bytes_read, GError **err) { GIOStatus ret; Pop3Transfer *self = Z_CAST(s, Pop3Transfer); Pop3Proxy *owner = Z_CAST(s->owner, Pop3Proxy); ret = Z_SUPER(s, ZTransfer2)->src_read(s, stream, buf, count, bytes_read, err); if (self->header_state < POP3_HEADER_END && (ret == G_IO_STATUS_NORMAL || (ret == G_IO_STATUS_AGAIN && *bytes_read > 0))) { if (*bytes_read == 0) { self->header_state = POP3_HEADER_END; } else { gsize bytes_need = *bytes_read; if (buf[0] != ' ' && buf[0] != '\t') { self->header_state = POP3_HEADER_NONE; self->actual_header = NULL; } while (buf[bytes_need - 1] == '\n' || buf[bytes_need - 1] == '\r' || buf[bytes_need - 1] == ' ') bytes_need--; z_trace(NULL, "Read header line; line='%.*s'", (gint) bytes_need, buf); if (self->header_state == POP3_HEADER_NONE) { if (g_ascii_strncasecmp(buf, FROM, MIN(__builtin_strlen(FROM), bytes_need)) == 0) { if (owner->from == NULL) { self->header_state = POP3_HEADER_INSIDE; owner->from = g_string_new_len(buf + __builtin_strlen(FROM), bytes_need - __builtin_strlen(FROM)); self->actual_header = owner->from; } else { /* FIXME: Log */ } } else if (g_ascii_strncasecmp(buf, TO, MIN(__builtin_strlen(TO), bytes_need)) == 0) { if (owner->to == NULL) { self->header_state = POP3_HEADER_INSIDE; owner->to = g_string_new_len(buf + __builtin_strlen(TO), bytes_need - __builtin_strlen(TO)); self->actual_header = owner->to; } else { /* FIXME: Log */ } } else if (g_ascii_strncasecmp(buf, SUBJECT, MIN(__builtin_strlen(SUBJECT), bytes_need)) == 0) { if (owner->subject == NULL) { self->header_state = POP3_HEADER_INSIDE; owner->subject = g_string_new_len(buf + __builtin_strlen(SUBJECT), bytes_need - __builtin_strlen(SUBJECT)); self->actual_header = owner->subject; } else { /* FIXME: Log */ } } } else { g_string_append(self->actual_header, "\r\n"); g_string_append_len(self->actual_header, buf, bytes_need); } } } return ret; }