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