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"); }
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"); }