static void close_cb (PecanNode *conn, MsnNotification *notification) { char *tmp; { const char *reason = NULL; if (conn->error) { reason = conn->error->message; pecan_error ("connection error: (NS):reason=[%s]", reason); tmp = pecan_strdup_printf (_("Error on notification server:\n%s"), reason); g_clear_error (&conn->error); } else { pecan_error ("connection error: (NS)"); tmp = pecan_strdup_printf (_("Error on notification server:\nUnknown")); } } pecan_node_close (PECAN_NODE (notification->conn)); notification->closed = TRUE; msn_session_set_error (notification->session, MSN_ERROR_SERVCONN, tmp); g_free (tmp); }
void msn_notification_close(MsnNotification *notification) { g_return_if_fail(notification != NULL); if (!notification->closed) { msn_cmdproc_send_quick (notification->cmdproc, "OUT", NULL, NULL); pecan_node_close (PECAN_NODE (notification->conn)); } }
static void read_impl (PecanNode *conn) { MsnBuffer *read_buffer; int r; read_buffer = conn->read_buffer; read_buffer->size = MSN_BUF_SIZE; if (conn->payload) { msn_buffer_prepare (conn->buffer, conn->payload->size); } else { msn_buffer_prepare (conn->buffer, read_buffer->size); } read_buffer->data = conn->buffer->data + conn->buffer->filled; r = conn_end_object_read (conn->end, read_buffer->data, read_buffer->size, NULL, NULL); if (r == 0) { /* connection closed */ pecan_node_close (conn); return; } if (r < 0) { /* connection error */ pecan_node_close (conn); return; } read_buffer->filled = r; /* pecan_print ("read [%b]\n", read_buffer); */ conn->buffer->filled += read_buffer->filled; while (conn->parse_pos < conn->buffer->filled) { if (conn->payload) { guint size; size = MIN (conn->payload->size - conn->payload->filled, conn->buffer->filled - conn->parse_pos); conn->payload->filled += size; conn->parse_pos += size; if (conn->payload->filled == conn->payload->size) { if (conn->payload_cb) { conn->payload->data = conn->buffer->data + conn->last_parse_pos; conn->payload_cb (conn, conn->payload); } msn_buffer_free (conn->payload); conn->payload = NULL; conn->parsed = TRUE; conn->last_parse_pos = conn->parse_pos; } } else { /* PECAN_NODE_GET_CLASS (conn)->parse (conn); */ } /** @todo only if parsed? yes indeed! */ if (conn->parsed) { if (conn->parse_pos == conn->buffer->filled) { /* g_debug ("reset\n"); */ conn->buffer->filled = 0; conn->parse_pos = 0; conn->last_parse_pos = 0; } conn->parsed = FALSE; } } }
void pecan_session_disconnect (PecanSession *session) { pecan_node_close (PECAN_NODE (session->priv->ns)); }