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