Esempio n. 1
0
/**
 * 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);
}
Esempio n. 2
0
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;
}