1 #include <stdio.h>
2 #include <stdlib.h>
3 
4 #include <string.h>
5 
6 #include <glib.h>
7 
8 #include <gio/gio.h>
9 #include <wocky/wocky.h>
10 
11 GMainLoop *mainloop;
12 char *recipient;
13 char *message;
14 
15 static void
closed_cb(GObject * source,GAsyncResult * res,gpointer user_data)16 closed_cb (
17     GObject *source,
18     GAsyncResult *res,
19     gpointer user_data)
20 {
21   WockyPorter *porter = WOCKY_PORTER (source);
22   WockySession *session = WOCKY_SESSION (user_data);
23   GError *error = NULL;
24 
25   if (wocky_porter_close_finish (porter, res, &error))
26     {
27       g_print ("Signed out\n");
28     }
29   else
30     {
31       g_warning ("Couldn't sign out cleanly: %s\n", error->message);
32       g_clear_error (&error);
33     }
34 
35   /* Either way, we're done. */
36   g_object_unref (session);
37   g_main_loop_quit (mainloop);
38 }
39 
40 static void
message_sent_cb(GObject * source,GAsyncResult * res,gpointer user_data)41 message_sent_cb (
42     GObject *source,
43     GAsyncResult *res,
44     gpointer user_data)
45 {
46   WockyPorter *porter = WOCKY_PORTER (source);
47   WockySession *session = WOCKY_SESSION (user_data);
48   GError *error = NULL;
49 
50   if (wocky_porter_send_finish (porter, res, &error))
51     {
52       g_print ("Sent '%s' to %s\n", message, recipient);
53     }
54   else
55     {
56       g_warning ("Couldn't send message: %s\n", error->message);
57       g_clear_error (&error);
58     }
59 
60   /* Sign out. */
61   wocky_porter_close_async (porter, NULL, closed_cb, session);
62 }
63 
64 static void
connected_cb(GObject * source,GAsyncResult * res,gpointer user_data)65 connected_cb (
66     GObject *source,
67     GAsyncResult *res,
68     gpointer user_data)
69 {
70   WockyConnector *connector = WOCKY_CONNECTOR (source);
71   WockyXmppConnection *connection;
72   gchar *jid = NULL;
73   GError *error = NULL;
74 
75   connection = wocky_connector_connect_finish (connector, res, &jid, NULL,
76       &error);
77 
78   if (connection == NULL)
79     {
80       g_warning ("Couldn't connect: %s", error->message);
81       g_clear_error (&error);
82       g_main_loop_quit (mainloop);
83     }
84   else
85     {
86       WockySession *session = wocky_session_new_with_connection (connection, jid);
87       WockyPorter *porter = wocky_session_get_porter (session);
88       WockyStanza *stanza = wocky_stanza_build (WOCKY_STANZA_TYPE_MESSAGE,
89           WOCKY_STANZA_SUB_TYPE_NONE, NULL, recipient,
90           '(', "body",
91             '$', message,
92           ')', NULL);
93 
94       g_print ("Connected as %s\n", jid);
95 
96       wocky_porter_start (porter);
97       wocky_porter_send_async (porter, stanza, NULL, message_sent_cb, session);
98 
99       g_object_unref (stanza);
100       g_free (jid);
101     }
102 }
103 
104 int
main(int argc,char ** argv)105 main (int argc,
106     char **argv)
107 {
108   char *jid, *password;
109   WockyConnector *connector;
110 
111   g_type_init ();
112   wocky_init ();
113 
114   if (argc != 5)
115     {
116       printf ("Usage: %s <jid> <password> <recipient> <message>\n", argv[0]);
117       return -1;
118     }
119 
120   jid = argv[1];
121   password = argv[2];
122   recipient = argv[3];
123   message = argv[4];
124 
125   mainloop = g_main_loop_new (NULL, FALSE);
126   connector = wocky_connector_new (jid, password, NULL, NULL, NULL);
127   wocky_connector_connect_async (connector, NULL, connected_cb, NULL);
128 
129   g_main_loop_run (mainloop);
130 
131   g_object_unref (connector);
132   g_main_loop_unref (mainloop);
133   return 0;
134 }
135