Author: ArcRiley Date: 2009-03-03 23:34:57 -0500 (Tue, 03 Mar 2009) New Revision: 1543
Modified: trunk/concordance/examples/echo.py trunk/concordance/include/concordance.h trunk/concordance/include/concordance.sockets.h trunk/concordance/src/_core/__init__.c trunk/concordance/src/_core/step.c trunk/concordance/src/sockets/Client.c Log: a good deal of work on XML callbacks Modified: trunk/concordance/examples/echo.py =================================================================== --- trunk/concordance/examples/echo.py 2009-03-04 04:34:53 UTC (rev 1542) +++ trunk/concordance/examples/echo.py 2009-03-04 04:34:57 UTC (rev 1543) @@ -25,11 +25,17 @@ import concordance +import xml.etree.cElementTree as ElementTree -class newcore(concordance.Core) : - def clientHandle(self, input) : - print(":%s" % input) +host = 'selket.apogean.org' + +class EchoService(concordance.services.Service) : + def xml(self, input) : + print(":%s" % ElementTree.tostring(input)) return -nc = newcore() -nc() +client = concordance.sockets.Client() +client[host] = EchoService(host) + +while True : + concordance._core.step() Modified: trunk/concordance/include/concordance.h =================================================================== --- trunk/concordance/include/concordance.h 2009-03-04 04:34:53 UTC (rev 1542) +++ trunk/concordance/include/concordance.h 2009-03-04 04:34:57 UTC (rev 1543) @@ -60,27 +60,27 @@ typedef struct { gint type; /* type CONCORD_MT_XMLSTART */ - PyObject* tree; /* cElementTree.TreeBuilder */ + PyObject** tree; /* cElementTree.TreeBuilder */ const XML_Char* name; - const XML_Char** atts; + XML_Char** atts; } concordMsg_xmlStart; typedef struct { gint type; /* type CONCORD_MT_XMLEND */ - PyObject* tree; /* cElementTree.TreeBuilder */ + PyObject** tree; /* cElementTree.TreeBuilder */ const XML_Char* name; } concordMsg_xmlEnd; typedef struct { gint type; /* type CONCORD_MT_XMLCHARDATA */ - PyObject* tree; /* cElementTree.TreeBuilder */ + PyObject** tree; /* cElementTree.TreeBuilder */ const XML_Char* str; gint str_len; } concordMsg_xmlCharData; typedef struct { gint type; /* type CONCORD_MT_XMLCHARDATA */ - PyObject* tree; /* cElementTree.TreeBuilder */ + PyObject** tree; /* cElementTree.TreeBuilder */ PyObject* self; /* self for callback method */ gpointer data; /* pointer to session data */ GAsyncQueue* retn; /* callback queue input */ Modified: trunk/concordance/include/concordance.sockets.h =================================================================== --- trunk/concordance/include/concordance.sockets.h 2009-03-04 04:34:53 UTC (rev 1542) +++ trunk/concordance/include/concordance.sockets.h 2009-03-04 04:34:57 UTC (rev 1543) @@ -90,7 +90,7 @@ gboolean (* _gioNew ) (GIOChannel*, GIOCondition, gpointer); gboolean (* _gioRead ) (GIOChannel*, GIOCondition, gpointer); gboolean (* _gioWrite ) (GIOChannel*, GIOCondition, gpointer); - void (* _gioSend ) (socketsClient_Data, gchar*, gint); + void (* _gioSend ) (socketsClient_Data*, gchar*, gint); } socketsClient_TypeObject; extern socketsClient_TypeObject socketsClient_Type; Modified: trunk/concordance/src/_core/__init__.c =================================================================== --- trunk/concordance/src/_core/__init__.c 2009-03-04 04:34:53 UTC (rev 1542) +++ trunk/concordance/src/_core/__init__.c 2009-03-04 04:34:57 UTC (rev 1543) @@ -38,7 +38,7 @@ static PyMethodDef concord_Methods[] = { - { "step", concordStep, 0, NULL }, + { "step", concordStep, METH_VARARGS, NULL }, { NULL, NULL } }; Modified: trunk/concordance/src/_core/step.c =================================================================== --- trunk/concordance/src/_core/step.c 2009-03-04 04:34:53 UTC (rev 1542) +++ trunk/concordance/src/_core/step.c 2009-03-04 04:34:57 UTC (rev 1543) @@ -25,7 +25,7 @@ PyObject* -concordStep() { /*\ +concordStep(PyObject* self, PyObject *args) { /*\ cdef : \*/ gint i; gint err = 0; @@ -81,14 +81,14 @@ case CONCORD_MT_XMLSTART : { /*\ cdef : \*/ concordMsg_xmlStart* msg = (concordMsg_xmlStart*) pmsg; - + /* create a TreeBuilder if one wasn't provided */ - if (!msg->tree) { + if (!*msg->tree) { if (!(temp = PyImport_ImportModule("xml.etree.cElementTree"))) BREAKNULL - msg->tree = PyEval_CallMethod(temp, "TreeBuilder", ""); + *msg->tree = PyEval_CallMethod(temp, "TreeBuilder", "()"); Py_DECREF(temp); - if (!msg->tree) + if (!*msg->tree) BREAKNULL } @@ -106,10 +106,10 @@ decref return value since we don't want/need it yet. */ - Py_DECREF(PyEval_CallMethod(msg->tree, "start", "UO", msg->name, attr)); + Py_DECREF(PyEval_CallMethod(*msg->tree, "start", "(UO)", msg->name, atts)); /* remove local reference to attr dict */ - Py_DECREF(attr); + Py_DECREF(atts); break; } @@ -118,7 +118,7 @@ concordMsg_xmlEnd* msg = (concordMsg_xmlEnd*) pmsg; /* end element in tree */ - temp = PyEval_CallMethod(msg->tree, "end", "U", msg->name); + temp = PyEval_CallMethod(*msg->tree, "end", "(U)", msg->name); if (!temp) BREAKNULL @@ -132,7 +132,7 @@ concordMsg_xmlCharData* msg = (concordMsg_xmlCharData*) pmsg; /* pass character data to tree */ - temp = PyEval_CallMethod(msg->tree, "data", "U#", msg->str, msg->str_len); + temp = PyEval_CallMethod(*msg->tree, "data", "(U#)", msg->str, msg->str_len); if (!temp) BREAKNULL @@ -145,12 +145,14 @@ cdef : \*/ concordMsg_xmlClose* msg = (concordMsg_xmlClose*) pmsg; + printf("close-----------------------\n"); + /* get root element from TreeBuilder's close */ - temp = PyEval_CallMethod(msg->tree, "close", ""); + temp = PyEval_CallMethod(*msg->tree, "close", ""); if (!temp) break; - output = PyEval_CallMethod(msg->self, "xml", "O", temp); + output = PyEval_CallMethod(msg->self, "xml", "(O)", temp); if (!output) BREAKNULL Modified: trunk/concordance/src/sockets/Client.c =================================================================== --- trunk/concordance/src/sockets/Client.c 2009-03-04 04:34:53 UTC (rev 1542) +++ trunk/concordance/src/sockets/Client.c 2009-03-04 04:34:57 UTC (rev 1543) @@ -665,7 +665,7 @@ in the _gioRead function just after the XMLParse call (below). */ if (g_ascii_strcasecmp(name, - "http://etherx.jabber.org/streams stream") == 0) + "http://etherx.jabber.org/streams}stream") == 0) _reply_stream(session, concordFindAttr(atts, "to"), concordFindAttr(atts, "version")); @@ -698,16 +698,16 @@ attr = ""; session->eto = g_string_assign(session->eto, attr); - if (attr[0] == 0) { + //if (attr[0] == 0) { concordMsg_xmlStart* pmsg; pmsg = (concordMsg_xmlStart*) g_malloc(sizeof(concordMsg_xmlStart)); pmsg->type = CONCORD_MT_XMLSTART; - pmsg->tree = session->tree; + pmsg->tree = &session->tree; pmsg->name = g_strdup(name); pmsg->atts = g_strdupv((gchar**) atts); g_async_queue_push(self->queueCall, pmsg); - } + //} /* copy element and attributes to ebuff @@ -717,13 +717,14 @@ void g_string_append_printf (GString *string, const gchar *format, ...); - */ + g_string_printf(session->ebuff, "<%s xmlns='%s'", element[1], element[0]); for (i = 0; atts[i]; i += 2) g_string_append_printf(session->ebuff, " %s='%s'", atts[i], atts[i+1]); g_string_append_printf(session->ebuff, ">"); + */ } else _reply_streamError(session, "invalid-xml", @@ -766,18 +767,29 @@ default : { /* process inner tags depending on state */ if (session->state == CONCORD_E_CLIENT) { + //if bla bla { + concordMsg_xmlStart* pmsg; + pmsg = (concordMsg_xmlStart*) + g_malloc(sizeof(concordMsg_xmlStart)); + pmsg->type = CONCORD_MT_XMLSTART; + pmsg->tree = &session->tree; + pmsg->name = g_strdup(name); + pmsg->atts = g_strdupv((gchar**) atts); + g_async_queue_push(self->queueCall, pmsg); + // } /* copy element and attributes to ebuff void g_string_append_printf (GString *string, const gchar *format, ...); - */ + g_string_append_printf(session->ebuff, "<%s xmlns='%s'", element[1], element[0]); for (i = 0; atts[i]; i += 2) g_string_append_printf(session->ebuff, " %s='%s'", atts[i], atts[i+1]); g_string_append_printf(session->ebuff, ">"); + */ } break; } @@ -798,13 +810,15 @@ _xmlEnd(gpointer data, const XML_Char* name) { /*\ cdef : \*/ socketsClient_Data* session = (socketsClient_Data*) data; + socketsClient_Object* self = session->self; gchar** element; gint i; + concordMsg_xmlEnd* pmsge; + concordMsg_xmlClose* pmsgc; /* decrease XML depth */ session->depth--; - /* split name by namespace and element gchar** g_strsplit (const gchar *string, @@ -822,14 +836,23 @@ case 1 : { switch (session->state) { case CONCORD_E_CLIENT : { - /* copy final element close to ebuff + /* create _xmlEnd message */ + pmsge = (concordMsg_xmlEnd*) g_malloc(sizeof(concordMsg_xmlEnd)); + pmsge->type = CONCORD_MT_XMLEND; + pmsge->tree = &session->tree; + pmsge->name = g_strdup(name); - void g_string_append_printf (GString *string, - const gchar *format, - ...); - */ - g_string_append_printf(session->ebuff, "</%s>", element[1]); - // !!! concordCore_queuePush(session->core, session); + /* create _xmlClose message */ + pmsgc = (concordMsg_xmlClose*) g_malloc(sizeof(concordMsg_xmlClose)); + pmsgc->type = CONCORD_MT_XMLCLOSE; + pmsgc->tree = &session->tree; + pmsgc->self = (PyObject*) self; + pmsgc->data = session; + pmsgc->retn = session->queue; + + /* push both messages onto queue */ + g_async_queue_push(self->queueCall, pmsge); + g_async_queue_push(self->queueCall, pmsgc); break; } case CONCORD_E_SASL : { @@ -850,13 +873,14 @@ } default : { if (session->state == CONCORD_E_CLIENT) { - /* copy element close to ebuff - - void g_string_append_printf (GString *string, - const gchar *format, - ...); - */ - g_string_append_printf(session->ebuff, "</%s>", element[1]); + /* create _xmlEnd message */ + pmsge = (concordMsg_xmlEnd*) g_malloc(sizeof(concordMsg_xmlEnd)); + pmsge->type = CONCORD_MT_XMLEND; + pmsge->tree = &session->tree; + pmsge->name = g_strdup(name); + + /* push message onto queue */ + g_async_queue_push(self->queueCall, pmsge); } break; } @@ -873,13 +897,25 @@ static void _xmlCharData(gpointer data, const XML_Char* str, gint str_len) { /*\ cdef : \*/ - socketsClient_Data* session = (socketsClient_Data*) data; - gint i; + socketsClient_Data* session = (socketsClient_Data*) data; + socketsClient_Object* self = session->self; + concordMsg_xmlCharData* pmsg; + gint i; if (session->state == CONCORD_E_OPEN) /* character data should be ignored at the stream level */ return; + if (session->state == CONCORD_E_CLIENT) { + pmsg = (concordMsg_xmlCharData*) g_malloc(sizeof(concordMsg_xmlCharData)); + pmsg->type = CONCORD_MT_XMLCHARDATA; + pmsg->tree = &session->tree; + pmsg->str = g_strdup(str); + pmsg->str_len = str_len; + g_async_queue_push(self->queueCall, pmsg); + return; + } + /* append character data to element buffer GString* g_string_append_len (GString *string, _______________________________________________ PySoy-SVN mailing list PySoy-SVN@pysoy.org http://www.pysoy.org/mailman/listinfo/pysoy-svn