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

Reply via email to