src/protocols/msn/notification.c

changeset 10463
f2f97738b401
parent 10452
f29b5d423600
child 10481
a5d6b8e1717d
--- a/src/protocols/msn/notification.c	Fri Dec 31 15:34:18 2004 +0000
+++ b/src/protocols/msn/notification.c	Fri Dec 31 16:34:22 2004 +0000
@@ -37,9 +37,124 @@
 static MsnTable *cbs_table;
 
 /**************************************************************************
+ * Main
+ **************************************************************************/
+static void
+destroy_cb(MsnServConn *servconn)
+{
+	MsnNotification *notification;
+
+	notification = servconn->cmdproc->data;
+	g_return_if_fail(notification != NULL);
+
+	msn_notification_destroy(notification);
+}
+
+MsnNotification *
+msn_notification_new(MsnSession *session)
+{
+	MsnNotification *notification;
+	MsnServConn *servconn;
+
+	g_return_val_if_fail(session != NULL, NULL);
+
+	notification = g_new0(MsnNotification, 1);
+
+	notification->session = session;
+	notification->servconn = servconn = msn_servconn_new(session, MSN_SERVER_NS);
+	msn_servconn_set_destroy_cb(servconn, destroy_cb);
+
+	notification->cmdproc = servconn->cmdproc;
+	notification->cmdproc->data = notification;
+	notification->cmdproc->cbs_table = cbs_table;
+
+	return notification;
+}
+
+void
+msn_notification_destroy(MsnNotification *notification)
+{
+	if (notification->destroying)
+		return;
+
+	notification->destroying = TRUE;
+
+	msn_servconn_destroy(notification->servconn);
+
+	notification->session->notification = NULL;
+	g_free(notification);
+}
+
+/**************************************************************************
+ * Connect
+ **************************************************************************/
+static void
+connect_cb(MsnServConn *servconn)
+{
+	MsnCmdProc *cmdproc;
+	MsnSession *session;
+	GaimAccount *account;
+	char **a, **c, *vers;
+	int i;
+
+	g_return_if_fail(servconn != NULL);
+
+	cmdproc = servconn->cmdproc;
+	session = servconn->session;
+	account = session->account;
+
+	/* Allocate an array for CVR0, NULL, and all the versions */
+	a = c = g_new0(char *, session->protocol_ver - 8 + 3);
+
+	for (i = session->protocol_ver; i >= 8; i--)
+		*c++ = g_strdup_printf("MSNP%d", i);
+
+	*c++ = g_strdup("CVR0");
+
+	vers = g_strjoinv(" ", a);
+
+	msn_cmdproc_send(cmdproc, "VER", "%s", vers);
+
+	g_strfreev(a);
+	g_free(vers);
+
+	if (cmdproc->error)
+		return;
+
+	if (session->user == NULL)
+		session->user = msn_user_new(session->userlist,
+									 gaim_account_get_username(account), NULL);
+}
+
+gboolean
+msn_notification_connect(MsnNotification *notification, const char *host, int port)
+{
+	MsnServConn *servconn;
+
+	g_return_val_if_fail(notification != NULL, FALSE);
+
+	servconn = notification->servconn;
+
+	msn_servconn_set_connect_cb(servconn, connect_cb);
+	notification->in_use = msn_servconn_connect(servconn, host, port);
+
+	return notification->in_use;
+}
+
+void
+msn_notification_disconnect(MsnNotification *notification)
+{
+	g_return_if_fail(notification != NULL);
+	g_return_if_fail(notification->in_use);
+
+	msn_servconn_disconnect(notification->servconn);
+
+	notification->in_use = FALSE;
+}
+
+/**************************************************************************
  * Util
  **************************************************************************/
-
 static void
 group_error_helper(MsnSession *session, const char *msg, int group_id, int error)
 {
@@ -83,7 +198,6 @@
 /**************************************************************************
  * Login
  **************************************************************************/
-
 void
 msn_got_login_params(MsnSession *session, const char *login_params)
 {
@@ -266,6 +380,16 @@
 		msn_cmdproc_show_error(cmdproc, MSN_ERROR_SERVDOWN);
 }
 
+void
+msn_notification_close(MsnNotification *notification)
+{
+	g_return_if_fail(notification != NULL);
+
+	msn_cmdproc_send_quick(notification->cmdproc, "OUT", NULL, NULL);
+
+	msn_notification_disconnect(notification);
+}
+
 /**************************************************************************
  * Messages
  **************************************************************************/
@@ -1177,44 +1301,6 @@
 	g_hash_table_destroy(table);
 }
 
-static void
-connect_cb(MsnServConn *servconn)
-{
-	MsnCmdProc *cmdproc;
-	MsnSession *session;
-	GaimAccount *account;
-	char **a, **c, *vers;
-	int i;
-
-	g_return_if_fail(servconn != NULL);
-
-	cmdproc = servconn->cmdproc;
-	session = servconn->session;
-	account = session->account;
-
-	/* Allocate an array for CVR0, NULL, and all the versions */
-	a = c = g_new0(char *, session->protocol_ver - 8 + 3);
-
-	for (i = session->protocol_ver; i >= 8; i--)
-		*c++ = g_strdup_printf("MSNP%d", i);
-
-	*c++ = g_strdup("CVR0");
-
-	vers = g_strjoinv(" ", a);
-
-	msn_cmdproc_send(cmdproc, "VER", "%s", vers);
-
-	g_strfreev(a);
-	g_free(vers);
-
-	if (cmdproc->error)
-		return;
-
-	if (session->user == NULL)
-		session->user = msn_user_new(session->userlist,
-									 gaim_account_get_username(account), NULL);
-}
-
 void
 msn_notification_add_buddy(MsnNotification *notification, const char *list,
 						   const char *who, const char *store_name,
@@ -1254,6 +1340,9 @@
 	}
 }
 
+/**************************************************************************
+ * Init
+ **************************************************************************/
 void
 msn_notification_init(void)
 {
@@ -1336,57 +1425,3 @@
 {
 	msn_table_destroy(cbs_table);
 }
-
-MsnNotification *
-msn_notification_new(MsnSession *session)
-{
-	MsnNotification *notification;
-	MsnServConn *servconn;
-
-	g_return_val_if_fail(session != NULL, NULL);
-
-	notification = g_new0(MsnNotification, 1);
-
-	notification->session = session;
-	notification->servconn = servconn = msn_servconn_new(session, MSN_SERVER_NS);
-	notification->cmdproc = servconn->cmdproc;
-	msn_servconn_set_connect_cb(servconn, connect_cb);
-
-	if (session->http_method)
-		servconn->http_data->server_type = "NS";
-
-	servconn->cmdproc->cbs_table = cbs_table;
-
-	return notification;
-}
-
-void
-msn_notification_destroy(MsnNotification *notification)
-{
-	msn_servconn_destroy(notification->servconn);
-
-	g_free(notification);
-}
-
-gboolean
-msn_notification_connect(MsnNotification *notification, const char *host, int port)
-{
-	MsnServConn *servconn;
-
-	g_return_val_if_fail(notification != NULL, FALSE);
-
-	servconn = notification->servconn;
-
-	return (notification->in_use = msn_servconn_connect(servconn, host, port));
-}
-
-void
-msn_notification_disconnect(MsnNotification *notification)
-{
-	g_return_if_fail(notification != NULL);
-
-	notification->in_use = FALSE;
-
-	if (notification->servconn->connected)
-		msn_servconn_disconnect(notification->servconn);
-}

mercurial