static void
instance_init (GTypeInstance *instance,
               gpointer g_class)
{
    PecanCmdServer *conn = CMD_PECAN_NODE (instance);

    conn->cmdproc = msn_cmdproc_new ();
}
static void
dispose (GObject *obj)
{
    PecanCmdServer *cmd_conn = CMD_PECAN_NODE (obj);

    pecan_log ("begin");

    if (cmd_conn->cmdproc)
    {
        msn_cmdproc_destroy (cmd_conn->cmdproc);
        cmd_conn->cmdproc = NULL;
    }

    G_OBJECT_CLASS (parent_class)->dispose (obj);

    pecan_log ("end");
}
PecanCmdServer *
pecan_cmd_server_new (const gchar *name,
                      PecanNodeType type)
{
    PecanCmdServer *conn;

    pecan_log ("begin");

    conn = CMD_PECAN_NODE (g_type_create_instance (CMD_PECAN_NODE_TYPE));

    {
        PecanNode *tmp = PECAN_NODE (conn);
        tmp->name = g_strdup (name);
        tmp->type = type;
    }

    pecan_log ("end");

    return conn;
}
static void
close_impl (PecanNode *conn)
{
    PecanCmdServer *cmd_conn;

    pecan_log ("begin");

    cmd_conn = CMD_PECAN_NODE (conn);

    g_free (cmd_conn->rx_buf);
    cmd_conn->rx_buf = NULL;
    cmd_conn->rx_len = 0;
    cmd_conn->payload_len = 0;

    if (cmd_conn->cmdproc)
        msn_cmdproc_flush (cmd_conn->cmdproc);

    PECAN_NODE_CLASS (parent_class)->close (conn);

    pecan_log ("end");
}
Exemple #5
0
static void
open_cb (PecanNode *conn,
         MsnNotification *notification)
{
    MsnSession *session;
    PecanCmdServer *cmd_conn;

    g_return_if_fail (conn != NULL);

    pecan_log ("begin");

    session = conn->session;
    cmd_conn = CMD_PECAN_NODE (conn);

    if (session->login_step == PECAN_LOGIN_STEP_START)
        msn_session_set_login_step (session, PECAN_LOGIN_STEP_HANDSHAKE);
    else
        msn_session_set_login_step (session, PECAN_LOGIN_STEP_HANDSHAKE2);

    msn_cmdproc_send (cmd_conn->cmdproc, "VER", "MSNP12 CVR0");

    pecan_log ("end");
}
/** @todo add extensive tests for this */
static void
parse_impl (PecanNode *base_conn,
            gchar *buf,
            gsize bytes_read)
{
    PecanCmdServer *cmd_conn;
    gchar *cur, *end, *old_rx_buf;
    gint cur_len;

    pecan_log ("begin");

    pecan_debug ("conn=%p,name=%s", base_conn, base_conn->name);

    cmd_conn = CMD_PECAN_NODE (base_conn);

    buf[bytes_read] = '\0';

    cmd_conn->rx_buf = g_realloc (cmd_conn->rx_buf, bytes_read + cmd_conn->rx_len + 1);
    memcpy (cmd_conn->rx_buf + cmd_conn->rx_len, buf, bytes_read + 1);
    cmd_conn->rx_len += bytes_read;

    end = old_rx_buf = cmd_conn->rx_buf;
    cmd_conn->rx_buf = NULL;

    do
    {
        cur = end;

        if (cmd_conn->payload_len)
        {
            if (cmd_conn->payload_len > cmd_conn->rx_len)
                /* The payload is still not complete. */
                break;

            cur_len = cmd_conn->payload_len;
            end += cur_len;
        }
        else
        {
            end = strstr(cur, "\r\n");

            if (end == NULL)
                /* The command is still not complete. */
                break;

            *end = '\0';
            end += 2;
            cur_len = end - cur;
        }

        cmd_conn->rx_len -= cur_len;

        if (cmd_conn->cmdproc)
        {
            if (cmd_conn->payload_len)
            {
                msn_cmdproc_process_payload (cmd_conn->cmdproc, cur, cur_len);
                cmd_conn->payload_len = 0;
            }
            else
            {
                msn_cmdproc_process_cmd_text (cmd_conn->cmdproc, cur);
                cmd_conn->payload_len = cmd_conn->cmdproc->last_cmd->payload_len;
            }
        }
    } while (cmd_conn->rx_len > 0);

    if (cmd_conn->rx_len > 0)
        cmd_conn->rx_buf = g_memdup (cur, cmd_conn->rx_len);
    else
        cmd_conn->rx_buf = NULL;

    g_free (old_rx_buf);

    pecan_log ("end");
}