Ejemplo n.º 1
0
static void pn_encoder_initialize(void *obj)
{
  pn_encoder_t *encoder = (pn_encoder_t *) obj;
  encoder->output = NULL;
  encoder->size = 0;
  encoder->position = NULL;
  encoder->error = pn_error();
}
Ejemplo n.º 2
0
static void
close_impl (PnNode *conn)
{
    g_return_if_fail (conn);

    if (conn->status == PN_NODE_STATUS_CLOSED) {
        pn_log ("already closed: %p", conn);
        return;
    }

    pn_log ("begin");

    pn_info ("closing '%s'", conn->name);
    pn_debug ("conn=%p,name=%s", conn, conn->name);

    conn->status = PN_NODE_STATUS_CLOSED;

    g_free (conn->hostname);
    conn->hostname = NULL;

    if (conn->next) {
        pn_node_close (conn->next);
        goto leave;
    }

#if defined(USE_GIO)
    if (conn->socket_conn) {
        g_object_unref(conn->socket_conn);
        conn->socket_conn = NULL;
    }
#else
#if defined(HAVE_LIBPURPLE)
    if (conn->connect_data) {
        purple_proxy_connect_cancel (conn->connect_data);
        conn->connect_data = NULL;
    }
#endif
    if (conn->read_watch)
    {
        g_source_remove (conn->read_watch);
        conn->read_watch = 0;
    }
#endif

    if (conn->stream)
    {
        pn_info ("stream shutdown: %p", conn->stream);
        pn_stream_free (conn->stream);
        conn->stream = NULL;
    }
    else
        pn_error ("not connected: conn=%p", conn);

leave:
    conn->status = PN_NODE_STATUS_CLOSED;

    pn_log ("end");
}
Ejemplo n.º 3
0
pn_scanner_t *pn_scanner()
{
  pn_scanner_t *scanner = (pn_scanner_t *) malloc(sizeof(pn_scanner_t));
  if (scanner) {
    scanner->input = NULL;
    scanner->error = pn_error();
  }
  return scanner;
}
Ejemplo n.º 4
0
void pn_selector_initialize(void *obj)
{
  pn_selector_t *selector = (pn_selector_t *) obj;
  selector->iocp = NULL;
  selector->selectables = pn_list(PN_WEAKREF, 0);
  selector->iocp_descriptors = pn_list(PN_OBJECT, 0);
  selector->current = 0;
  selector->current_triggered = NULL;
  selector->awoken = 0;
  selector->error = pn_error();
  selector->triggered_list_head = NULL;
  selector->triggered_list_tail = NULL;
  selector->deadlines_head = NULL;
  selector->deadlines_tail = NULL;
}
Ejemplo n.º 5
0
static GIOStatus
read_impl (PnNode *conn,
           gchar *buf,
           gsize count,
           gsize *ret_bytes_read,
           GError **error)
{
    GIOStatus status = G_IO_STATUS_NORMAL;

    pn_debug ("name=%s", conn->name);

    if (conn->next)
    {
        pn_error ("whaaat");
        conn->next->prev = conn;
        status = pn_node_read (conn->next, buf, count, ret_bytes_read, error);
        conn->next->prev = NULL;
    }
    else
    {
        GError *tmp_error = NULL;
        gsize bytes_read = 0;

        pn_debug ("stream=%p", conn->stream);

        status = pn_stream_read (conn->stream, buf, count, &bytes_read, &tmp_error);

        if (status != G_IO_STATUS_NORMAL)
        {
            pn_info ("not normal: status=%d (%s)",
                     status, status_to_str (status));
        }

        pn_log ("bytes_read=%zu", bytes_read);

        if (ret_bytes_read)
            *ret_bytes_read = bytes_read;

        if (tmp_error)
        {
            conn->error = g_error_copy (tmp_error);
            g_propagate_error (error, tmp_error);
        }
    }

    return status;
}
Ejemplo n.º 6
0
void pn_io_initialize(void *obj)
{
  pn_io_t *io = (pn_io_t *) obj;
  io->error = pn_error();
  io->wouldblock = false;
  io->trace = pn_env_bool("PN_TRACE_DRV");

  /* Request WinSock 2.2 */
  WORD wsa_ver = MAKEWORD(2, 2);
  WSADATA unused;
  int err = WSAStartup(wsa_ver, &unused);
  if (err) {
    pni_win32_error(io->error, "WSAStartup", WSAGetLastError());
    fprintf(stderr, "Can't load WinSock: %s\n", pn_error_text(io->error));
  }
  io->iocp = pni_iocp();
}
Ejemplo n.º 7
0
pn_messenger_t *pn_messenger(const char *name)
{
  pn_messenger_t *m = malloc(sizeof(pn_messenger_t));

  if (m) {
    m->name = build_name(name);
    m->timeout = -1;
    m->driver = pn_driver();
    m->size = 0;
    m->listeners = 0;
    m->credit = 0;
    m->next_tag = 0;
    m->error = pn_error();
  }

  return m;
}
Ejemplo n.º 8
0
iocpdesc_t *pni_iocpdesc_create(iocp_t *iocp, pn_socket_t s, bool external) {
  assert (s != INVALID_SOCKET);
  assert(!pni_iocpdesc_map_get(iocp, s));
  bool listening = is_listener_socket(s);
  iocpdesc_t *iocpd = pni_iocpdesc(s);
  iocpd->iocp = iocp;
  if (iocpd) {
    iocpd->external = external;
    iocpd->error = pn_error();
    if (listening) {
      iocpd->acceptor = pni_acceptor(iocpd);
    } else {
      iocpd->pipeline = pni_write_pipeline(iocpd);
      iocpd->read_result = read_result(iocpd);
    }
    pni_iocpdesc_map_push(iocpd);
  }
  return iocpd;
}
Ejemplo n.º 9
0
static inline PecanStatus
util_status_from_session (MsnSession *session)
{
    PurpleAccount *account;
    PecanStatus msnstatus;
    PurplePresence *presence;
    PurpleStatus *status;
    const gchar *status_id;

    account = msn_session_get_user_data (session);
    presence = purple_account_get_presence (account);
    status = purple_presence_get_active_status (presence);
    status_id = purple_status_get_id (status);

    if (strcmp (status_id, "available") == 0)
        msnstatus = PN_STATUS_ONLINE;
    else if (strcmp (status_id, "away") == 0)
        msnstatus = PN_STATUS_AWAY;
    else if (strcmp (status_id, "brb") == 0)
        msnstatus = PN_STATUS_BRB;
    else if (strcmp (status_id, "busy") == 0)
        msnstatus = PN_STATUS_BUSY;
    else if (strcmp (status_id, "phone") == 0)
        msnstatus = PN_STATUS_PHONE;
    else if (strcmp (status_id, "lunch") == 0)
        msnstatus = PN_STATUS_LUNCH;
    else if (strcmp (status_id, "invisible") == 0)
        msnstatus = PN_STATUS_HIDDEN;
    else if (strcmp (status_id, "online") == 0)
    {
        if (purple_presence_is_idle (presence))
            msnstatus = PN_STATUS_IDLE;
        else
            msnstatus = PN_STATUS_ONLINE;
    }
    else
    {
        pn_error ("wrong: status_id=[%s]", status_id);
        msnstatus = PN_STATUS_WRONG;
    }

    return msnstatus;
}
Ejemplo n.º 10
0
static void
lsg_cmd (MsnCmdProc *cmdproc,
         MsnCommand *cmd)
{
    MsnSession *session = cmdproc->session;
    char *name;
    const gchar *group_guid;

    name = pn_url_decode (cmd->params[0]);
    group_guid = cmd->params[1];

    if (strcmp(name, MSN_NULL_GROUP_NAME) == 0) {
        pn_error("Invalid group name, ignoring");
        goto leave;
    }

    pn_group_new (session->contactlist, name, group_guid);

    if (!purple_find_group (name))
    {
        PurpleGroup *g = purple_group_new (name);
        purple_blist_add_group (g, NULL);
    }

    /* Group of ungroupped buddies */
    if (!group_guid)
    {
        if (session->sync->total_users == 0)
        {
            cmdproc->cbs_table = session->sync->old_cbs_table;

            msn_session_finish_login (session);

            msn_sync_destroy (session->sync);
            session->sync = NULL;
        }
    }
leave:
    g_free (name);
}
Ejemplo n.º 11
0
gboolean
msn_session_connect (MsnSession *session,
                     const char *host,
                     int port)
{
    g_return_val_if_fail (session, FALSE);
    g_return_val_if_fail (!session->connected, TRUE);

    session->connected = TRUE;

    if (!session->notification)
    {
        pn_error ("this shouldn't happen");
        g_return_val_if_reached (FALSE);
    }

    if (msn_notification_connect (session->notification, host, port))
    {
        return TRUE;
    }

    return FALSE;
}
Ejemplo n.º 12
0
static GIOStatus
write_impl (PnNode *conn,
            const gchar *buf,
            gsize count,
            gsize *ret_bytes_written,
            GError **error)
{
    GIOStatus status = G_IO_STATUS_NORMAL;

    pn_debug ("name=%s", conn->name);

    if (conn->next)
    {
        PnNode *next;

        next = conn->next;

        /* conn->next has already a ref from conn, but let's just be sure and
         * ref anyway */
        g_object_ref (next);
        next->prev = conn;
        status = pn_node_write (next, buf, count, ret_bytes_written, error);
        next->prev = NULL;
        g_object_unref (next);
    }
    else
    {
        GError *tmp_error = NULL;
        gsize bytes_written = 0;

        pn_debug ("stream=%p", conn->stream);

        status = pn_stream_write_full (conn->stream, buf, count, &bytes_written, &tmp_error);

        pn_log ("bytes_written=%zu", bytes_written);

        if (status == G_IO_STATUS_NORMAL)
        {
            if (bytes_written < count)
            {
                /* This shouldn't happen, right? */
                /* It doesn't seem to happen, but keep checking for now. */
                pn_error ("write check: %zu < %zu", bytes_written, count);
            }
        }
        else
        {
            pn_warning ("not normal: status=%d (%s)",
                        status, status_to_str (status));
        }

        if (ret_bytes_written)
            *ret_bytes_written = bytes_written;

        if (tmp_error)
        {
            conn->error = g_error_copy (tmp_error);
            g_propagate_error (error, tmp_error);
        }
    }

    return status;
}
Ejemplo n.º 13
0
static gboolean
http_poll (gpointer data)
{
    PnNode *conn;
    PnHttpServer *http_conn;
    GIOStatus status = G_IO_STATUS_NORMAL;
    GError *tmp_error = NULL;
    gsize bytes_written = 0;
    static guint count = 0;

    gchar *header;
    gchar *params;
    gchar *auth = NULL;

    g_return_val_if_fail (data != NULL, FALSE);

    conn = PN_NODE (data);
    http_conn = PN_HTTP_SERVER (data);

    pn_debug ("stream=%p", conn->stream);

    if (!http_conn->cur)
        return TRUE;

    g_return_val_if_fail (http_conn->cur, FALSE);

    count++;

    /* Don't poll if we already sent something, unless we have been waiting for
     * too long; a disconnection might have happened. */
    if (http_conn->waiting_response && count < 10)
    {
        /* There's no need to poll if we're already waiting for a response */
        pn_debug ("waiting for response");
        return TRUE;
    }

#ifdef HAVE_LIBPURPLE
    auth = get_auth(conn);
#endif /* HAVE_LIBPURPLE */

    params = g_strdup_printf ("Action=poll&SessionID=%s",
                              (gchar *) http_conn->cur->foo_data);

    header = g_strdup_printf ("POST http://%s/gateway/gateway.dll?%s HTTP/1.1\r\n"
                              "Accept: */*\r\n"
                              "User-Agent: MSMSGS\r\n"
                              "Host: %s\r\n"
                              "%s" /* Proxy auth */
                              "Proxy-Connection: Keep-Alive\r\n"
                              "Connection: Keep-Alive\r\n"
                              "Pragma: no-cache\r\n"
                              "Cache-Control: no-cache\r\n"
                              "Content-Type: application/x-msn-messenger\r\n"
                              "Content-Length: 0\r\n\r\n",
                              http_conn->gateway,
                              params,
                              http_conn->gateway,
                              auth ? auth : "");

#ifdef PECAN_DEBUG_HTTP
    pn_debug ("header=[%s]", header);
#endif

    g_free (params);

    status = pn_stream_write_full (conn->stream, header, strlen (header), &bytes_written, &tmp_error);

    g_free (header);

    http_conn->waiting_response = TRUE;
    pn_timer_stop (http_conn->timer);

    if (status == G_IO_STATUS_NORMAL)
    {
        status = pn_stream_flush (conn->stream, &tmp_error);

        if (status == G_IO_STATUS_AGAIN) {
            http_conn->last_flush = status;
            http_conn->write_watch = g_io_add_watch(conn->stream->channel,
                                                    G_IO_OUT, write_cb, http_conn);
            /* fake status */
            status = G_IO_STATUS_NORMAL;
        }

        if (status == G_IO_STATUS_NORMAL)
            pn_log ("bytes_written=%zu", bytes_written);
    }

    if (status != G_IO_STATUS_NORMAL)
    {
        PnNodeClass *class;
        pn_error ("not normal: status=%d", status);
        class = g_type_class_peek (PN_NODE_TYPE);
        g_signal_emit (G_OBJECT (conn), class->error_sig, 0, conn);
        return FALSE;
    }
Ejemplo n.º 14
0
void pn_io_initialize(void *obj)
{
  pn_io_t *io = (pn_io_t *) obj;
  io->error = pn_error();
  io->wouldblock = false;
}