Author: ArcRiley
Date: 2009-03-04 01:25:26 -0500 (Wed, 04 Mar 2009)
New Revision: 1547

Modified:
   trunk/concordance/examples/echo.py
   trunk/concordance/include/concordance.sockets.h
   trunk/concordance/src/sockets/Client.c
   trunk/concordance/src/sockets/Socket.c
Log:
xmlReturn messages now work again

Modified: trunk/concordance/examples/echo.py
===================================================================
--- trunk/concordance/examples/echo.py  2009-03-04 04:35:06 UTC (rev 1546)
+++ trunk/concordance/examples/echo.py  2009-03-04 06:25:26 UTC (rev 1547)
@@ -32,7 +32,7 @@
 class EchoService(concordance.services.Service) :
   def xml(self, input) :
     print(":%s" % ElementTree.tostring(input))
-    return
+    return ElementTree.tostring(input)
 
 client = concordance.sockets.Client()
 client[host] = EchoService(host)

Modified: trunk/concordance/include/concordance.sockets.h
===================================================================
--- trunk/concordance/include/concordance.sockets.h     2009-03-04 04:35:06 UTC 
(rev 1546)
+++ trunk/concordance/include/concordance.sockets.h     2009-03-04 06:25:26 UTC 
(rev 1547)
@@ -41,7 +41,8 @@
   GMainContext*         context;       /* Concordance's Glib context */
   Gsasl*                saslCntx;      /* Concordance's SASL context */
   GAsyncQueue*          queueCall;     /* callback queue input (global) */
-  GAsyncQueue*          queueSasl;     /* callback queue output for SASL */
+  GAsyncQueue*          queueRetn;     /* callback queue output for SASL */
+  GSource*              queueSource;   /* callback return queue source */
   GHashTable*           domains;       /* domain->service lookup */
   const gchar*          addr;
   gushort               port;
@@ -57,7 +58,8 @@
   GMainContext*         context;       /* Concordance's Glib context */
   Gsasl*                saslCntx;      /* Concordance's SASL context */
   GAsyncQueue*          queueCall;     /* callback Call queue */
-  GAsyncQueue*          queueSasl;     /* callback queue output for SASL */
+  GAsyncQueue*          queueRetn;     /* callback return queue for XMPP */
+  GSource*              queueSource;   /* callback return queue source */
   GHashTable*           domains;       /* domain->service lookup */
   const gchar*          addr;
   gushort               port;
@@ -84,7 +86,6 @@
   GString*              ebuff;         /* element buffer */
   GString*              efrom;         /* JID of origin */
   GString*              eto;           /* JID of destination */
-  GAsyncQueue*          queue;         /* callback return queue for XMPP */
 } socketsClient_Data;
 typedef struct {
   PyTypeObject          base;

Modified: trunk/concordance/src/sockets/Client.c
===================================================================
--- trunk/concordance/src/sockets/Client.c      2009-03-04 04:35:06 UTC (rev 
1546)
+++ trunk/concordance/src/sockets/Client.c      2009-03-04 06:25:26 UTC (rev 
1547)
@@ -135,12 +135,6 @@
     session->efrom = g_string_new("");      /* element origin */
     session->eto   = g_string_new("");      /* element destination */
 
-    /* create callback return queue for XMPP messages
-
-       GAsyncQueue*     g_async_queue_new        (void);
-    */
-    session->queue = g_async_queue_new();
-
     /* initialize session state */
     session->state = CONCORD_E_OPEN;
     session->depth = 0;
@@ -370,6 +364,78 @@
 
     return ret;
   }
+
+  /*
+  #
+  ###########################################################################
+  #
+  # Queue Source Callbacks
+  #                                                                        */
+  typedef struct {
+    GSource               base;
+    socketsClient_Object* self;
+  } _QueueSource;
+
+  static gboolean
+  _queueSourcePrepare(GSource* source, gint* timeout) {                   /*\
+    cdef :                                                                \*/
+      socketsClient_Object*  self = ((_QueueSource*) source)->self;
+
+    /* poll timeout 1/25th of a second */
+    *timeout = 40;
+
+    /* return TRUE if there is data queued
+
+       gint             g_async_queue_length     (GAsyncQueue *queue);
+    */
+    return (g_async_queue_length(self->queueRetn) > 0);
+  }
+
+  static gboolean
+  _queueSourceCheck(GSource* source) {                                    /*\
+    cdef :                                                                \*/
+      socketsClient_Object*  self = ((_QueueSource*) source)->self;
+
+    /* return TRUE if there is data queued
+
+       gint             g_async_queue_length     (GAsyncQueue *queue);
+    */
+    return (g_async_queue_length(self->queueRetn) > 0);
+  }
+
+  static gboolean
+  _queueSourceDispatch(GSource* source, GSourceFunc callback,
+                       gpointer user_data) {                              /*\
+    cdef :                                                                \*/
+      socketsClient_Object*  self = ((_QueueSource*) source)->self;
+      concordMsg_xmlReturn*  message;
+
+    /* get the next callback reply and send it
+
+       gpointer         g_async_queue_pop  (GAsyncQueue *queue);
+    */
+    message = g_async_queue_pop(self->queueRetn);
+    _gioSend((socketsClient_Data*) message->data,
+             message->mesg->str, message->mesg->len);
+
+    /* free message and return
+
+       gchar*           g_string_free            (GString *string,
+                                                  gboolean free_segment);
+       void             g_free                   (gpointer mem);
+    */
+    g_string_free(message->mesg, TRUE);
+    g_free(message);
+    return TRUE;
+  }
+
+  static GSourceFuncs _queueSourceFuncs = {
+    _queueSourcePrepare,                         /*prepare*/
+    _queueSourceCheck,                           /*check*/
+    _queueSourceDispatch,                        /*dispatch*/
+    NULL,                                        /*finalize*/
+  };
+
   
   /*
   #
@@ -851,7 +917,7 @@
             pmsgc->tree = &session->tree;
             pmsgc->self = session->srvc;
             pmsgc->data = session;
-            pmsgc->retn = session->queue;
+            pmsgc->retn = self->queueRetn;
 
             /* push both messages onto queue */
             g_async_queue_push(self->queueCall, pmsge);
@@ -964,6 +1030,17 @@
     */
     self->port = 5222;
 
+    /* add our sending asyncqueue as an event source
+
+       GSource*         g_source_new             (GSourceFuncs *source_funcs,
+                                                  guint struct_size);
+       guint            g_source_attach          (GSource *source,
+                                                  GMainContext *context);
+    */
+    self->queueSource = g_source_new(&_queueSourceFuncs, sizeof(_QueueSource));
+    ((_QueueSource*) self->queueSource)->self = self;
+    g_source_attach(self->queueSource, self->context);
+
     /* return self */
     return (PyObject*) self;
   }

Modified: trunk/concordance/src/sockets/Socket.c
===================================================================
--- trunk/concordance/src/sockets/Socket.c      2009-03-04 04:35:06 UTC (rev 
1546)
+++ trunk/concordance/src/sockets/Socket.c      2009-03-04 06:25:26 UTC (rev 
1547)
@@ -288,11 +288,11 @@
     self->queueCall = ((concordGlobals*)
                        PyModule_GetState(state->_core))->queueCall;
 
-    /* create callback return queue for SASL authentication
+    /* create callback return queue
 
        GAsyncQueue*     g_async_queue_new        (void);
     */
-    self->queueSasl = g_async_queue_new();
+    self->queueRetn = g_async_queue_new();
     
     /* create new domains hashtable
 

_______________________________________________
PySoy-SVN mailing list
PySoy-SVN@pysoy.org
http://www.pysoy.org/mailman/listinfo/pysoy-svn

Reply via email to