Author: ArcRiley
Date: 2009-02-25 21:25:06 -0500 (Wed, 25 Feb 2009)
New Revision: 1521

Modified:
   trunk/concordance/include/concordance.sockets.h
   trunk/concordance/src/sockets/Client.c
   trunk/concordance/src/sockets/Socket.c
Log:
started work on domain handling, sockets now implement mapping protocol

Modified: trunk/concordance/include/concordance.sockets.h
===================================================================
--- trunk/concordance/include/concordance.sockets.h     2009-02-25 11:35:30 UTC 
(rev 1520)
+++ trunk/concordance/include/concordance.sockets.h     2009-02-26 02:25:06 UTC 
(rev 1521)
@@ -40,6 +40,7 @@
   PyObject*             module;        /* reference to our own module */
   GMainContext*         context;       /* Concordance's Glib context */
   Gsasl*                saslCntx;      /* Concordance's SASL context */
+  GHashTable*           domains;       /* domain->service lookup */
   const gchar*          addr;
   gushort               port;
   int                   sock;
@@ -53,6 +54,7 @@
   PyObject*             module;        /* reference to our own module */
   GMainContext*         context;       /* Concordance's Glib context */
   Gsasl*                saslCntx;      /* Concordance's SASL context */
+  GHashTable*           domains;       /* domain->service lookup */
   const gchar*          addr;
   gushort               port;
   int                   sock;

Modified: trunk/concordance/src/sockets/Client.c
===================================================================
--- trunk/concordance/src/sockets/Client.c      2009-02-25 11:35:30 UTC (rev 
1520)
+++ trunk/concordance/src/sockets/Client.c      2009-02-26 02:25:06 UTC (rev 
1521)
@@ -341,14 +341,16 @@
 
 
   static void
-  _reply_stream(socketsClient_Data* session, gchar* version) {            /*\
+  _reply_stream(socketsClient_Data* session, gchar* to, gchar* version) { /*\
     cdef :                                                                \*/
       socketsClient_Object* self = session->self;
       GString*              buff;
+      gchar*                from;
       guint                 major, minor;
       gchar**               versions;
       gchar*                error = NULL;
 
+    
 
     /* initialize response buffer
 
@@ -538,7 +540,9 @@
         */
         if (g_ascii_strcasecmp(name,
                                "http://etherx.jabber.org/streams stream") == 0)
-          _reply_stream(session, concordFindAttr(atts, "version"));
+          _reply_stream(session,
+                        concordFindAttr(atts, "to"),
+                        concordFindAttr(atts, "version"));
         else
           session->state = CONCORD_E_CLOSE;
         break;

Modified: trunk/concordance/src/sockets/Socket.c
===================================================================
--- trunk/concordance/src/sockets/Socket.c      2009-02-25 11:35:30 UTC (rev 
1520)
+++ trunk/concordance/src/sockets/Socket.c      2009-02-26 02:25:06 UTC (rev 
1521)
@@ -285,7 +285,19 @@
     self->context = ((concordGlobals*)
                      PyModule_GetState(state->_core))->context;
     self->saslCntx = state->saslCntx;
+    
+    /* create new domains hashtable
 
+       GHashTable*      g_hash_table_new_full    (GHashFunc hash_func,
+                                                  GEqualFunc key_equal_func,
+                                             GDestroyNotify key_destroy_func,
+                                             GDestroyNotify 
value_destroy_func);
+    */
+    self->domains = g_hash_table_new_full(g_str_hash,
+                                          g_str_equal,
+                                          g_free,
+                                          (GDestroyNotify) Py_DecRef);
+
     /* return self */
     return (PyObject*) self;
   }
@@ -300,6 +312,12 @@
     if (self->sock > -1)
       close(self->sock);
 
+    /* destroy domains hashtable
+
+       void             g_hash_table_destroy     (GHashTable *hash_table);
+    */
+    g_hash_table_destroy(self->domains);
+
     /* decref our module handle, which may in-turn decref _core */
     if (self->module)
       Py_DECREF(self->module);
@@ -307,6 +325,97 @@
     /* lastly delete the object */  
     PyObject_Del(self);
   }  
+
+  /*
+  #
+  ###########################################################################
+  #
+  # mapping methods
+  #                                                                        */
+  static Py_ssize_t
+  _length(PyObject* s) {                                                  /*\
+    cdef :                                                                \*/
+      socketsSocket_Object*      self = (socketsSocket_Object*) s;
+
+    /* return number of domains
+    
+       guint            g_hash_table_size        (GHashTable *hash_table);
+    */
+    return (Py_ssize_t) g_hash_table_size(self->domains);
+  }
+
+
+  static PyObject*
+  _subscript(PyObject* s, PyObject* k) {                                  /*\
+    cdef :                                                                \*/
+      socketsSocket_Object*      self = (socketsSocket_Object*) s;
+      gchar*                     key;
+      PyObject*                  val;
+
+    if (!PyUnicode_Check(k)) {
+      PyErr_SetString(PyExc_TypeError, "key must be a string");
+      return NULL;
+    }
+
+    /* get the UTF8 key */
+    key = concordPyUnicodeToUTF8(k);
+    
+    /* lookup value in domains table
+
+       gpointer         g_hash_table_lookup      (GHashTable *hash_table,
+                                                  gconstpointer key);
+    */
+    val = (PyObject*) g_hash_table_lookup(self->domains, (gconstpointer) key);
+    if (!val)
+      PyErr_SetString(PyExc_KeyError, "domain not found");
+
+    /* free key, return val as either a PyObject* or NULL */
+    g_free(key);
+    return val;
+  }
+
+
+  static int
+  _ass_subscript(PyObject* s, PyObject* k, PyObject* val) {               /*\
+    cdef :                                                                \*/
+      socketsSocket_Object*      self = (socketsSocket_Object*) s;
+      gchar*                     key;
+
+    if (!PyUnicode_Check(k)) {
+      PyErr_SetString(PyExc_TypeError, "key must be a string");
+      return -1;
+    }
+    /* test value */
+
+    /* get the UTF8 key */
+    key = concordPyUnicodeToUTF8(k);
+
+    if (val) {
+      /* insert key:value into table, freeing existing value if needed
+    
+         void           g_hash_table_insert      (GHashTable *hash_table,
+                                                  gpointer key,
+                                                  gpointer value);
+      */
+      g_hash_table_insert(self->domains, (gpointer) key, (gpointer) val);
+    }
+    else {
+      /* delete key from table
+      
+         gboolean       g_hash_table_remove      (GHashTable *hash_table,
+                                                  gconstpointer key);
+      */
+      if (g_hash_table_remove(self->domains, (gpointer) key)) {
+        g_free(key);
+      }
+      else {
+        g_free(key);
+        PyErr_SetString(PyExc_KeyError, "domain not found");
+        return -1;
+      }      
+    }
+    return 0;
+  }
   
   /*
   #
@@ -315,6 +424,13 @@
   # global structs
   #                                                                        */
 
+  static PyMappingMethods socketsSocket_Mapping = {
+    _length,                                     /*mp_length*/
+    _subscript,                                  /*mp_subscript*/
+    _ass_subscript,                              /*mp_ass_subscript*/
+  };
+
+
   static PyMethodDef socketsSocket_Methods[] = {
     { NULL, NULL },                              /* sentinel */
   };
@@ -332,7 +448,7 @@
     0,                                           /*tp_repr*/
     0,                                           /*tp_as_number*/
     0,                                           /*tp_as_sequence*/
-    0,                                           /*tp_as_mapping*/
+    &socketsSocket_Mapping,                      /*tp_as_mapping*/
     0,                                           /*tp_hash*/
     0,                                           /*tp_call*/
     0,                                           /*tp_str*/
@@ -364,5 +480,3 @@
     /* cdef classes */
     _gioNew,
   };
-  
-  

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

Reply via email to