Author: liori
Date: 2007-08-12 02:16:54 +0200 (Sun, 12 Aug 2007)
New Revision: 8490
Modified:
branches/jingle/src/common/farsight/farsight.defs
branches/jingle/src/common/farsight/farsight.override
branches/jingle/src/common/jingle.py
Log:
Jingle: better farsight wrappers
Modified: branches/jingle/src/common/farsight/farsight.defs
===================================================================
--- branches/jingle/src/common/farsight/farsight.defs 2007-08-11 21:47:53 UTC (rev 8489)
+++ branches/jingle/src/common/farsight/farsight.defs 2007-08-12 00:16:54 UTC (rev 8490)
@@ -121,7 +121,7 @@
(parameters
'("int" "id")
'("const-char*" "encoding_name")
- '("FarsightMediaType" "media_type")
+ '("int" "media_type")
'("guint" "clock_rate")
)
)
@@ -205,7 +205,7 @@
(define-method get_media_type
(of-object "FarsightStream")
(c-name "farsight_stream_get_media_type")
- (return-type "FarsightMediaType")
+ (return-type "int")
)
(define-method prepare_transports
@@ -362,27 +362,21 @@
(define-method get_state
(of-object "FarsightStream")
(c-name "farsight_stream_get_state")
- (return-type "FarsightStreamState")
+ (return-type "int")
)
(define-method get_direction
(of-object "FarsightStream")
(c-name "farsight_stream_get_direction")
- (return-type "FarsightStreamDirection")
+ (return-type "int")
)
(define-method get_current_direction
(of-object "FarsightStream")
(c-name "farsight_stream_get_current_direction")
- (return-type "FarsightStreamDirection")
+ (return-type "int")
)
-(define-method get_media_type
- (of-object "FarsightStream")
- (c-name "farsight_stream_get_media_type")
- (return-type "FarsightMediaType")
-)
-
(define-method get_pipeline
(of-object "FarsightStream")
(c-name "farsight_stream_get_pipeline")
@@ -424,7 +418,7 @@
(c-name "farsight_stream_signal_error")
(return-type "none")
(parameters
- '("FarsightStreamError" "err")
+ '("int" "err")
'("const-gchar*" "mesg")
)
)
@@ -468,8 +462,8 @@
(c-name "farsight_stream_signal_state_changed")
(return-type "none")
(parameters
- '("FarsightStreamState" "state")
- '("FarsightStreamDirection" "direction")
+ '("int" "state")
+ '("int" "direction")
)
)
Modified: branches/jingle/src/common/farsight/farsight.override
===================================================================
--- branches/jingle/src/common/farsight/farsight.override 2007-08-11 21:47:53 UTC (rev 8489)
+++ branches/jingle/src/common/farsight/farsight.override 2007-08-12 00:16:54 UTC (rev 8490)
@@ -6,31 +6,168 @@
#include <farsight/farsight.h>
#include <farsight/farsight-transport.h>
-#define GetString(name) PyString_AsString(PyMapping_GetItemString(item, name))
-#define GetLong(name) PyInt_AsLong(PyMapping_GetItemString(item, name))
-#define GetFloat(name) PyFloat_AsDouble(PyMapping_GetItemString(item, name))
+/* functions to put data into dict */
+inline static void insert_long_into_dict(PyObject* dict, char* key, long value) {
+ PyObject* item=PyInt_FromLong(value);
+ PyDict_SetItemString(dict, key, item);
+ Py_DECREF(item);
+}
+inline static void insert_str_into_dict(PyObject* dict, char* key, const char* value) {
+ if (!value) return;
+ PyObject* item=PyString_FromString(value);
+ PyDict_SetItemString(dict, key, item);
+ Py_DECREF(item);
+}
+
+inline static void insert_double_into_dict(PyObject* dict, char* key, double value) {
+ PyObject* item=PyFloat_FromDouble(value);
+ PyDict_SetItemString(dict, key, item);
+ Py_DECREF(item);
+}
+
+static PyObject* farsight_transport_info_to_dict(FarsightTransportInfo* fti) {
+ PyObject* dict = PyDict_New();
+
+ insert_str_into_dict (dict, "candidate_id", fti->candidate_id);
+ insert_long_into_dict (dict, "component", fti->component);
+ insert_str_into_dict (dict, "ip", fti->ip);
+ insert_long_into_dict (dict, "port", fti->port);
+ insert_long_into_dict (dict, "proto", fti->proto);
+ insert_str_into_dict (dict, "proto_subtype", fti->proto_subtype);
+ insert_str_into_dict (dict, "proto_profile", fti->proto_profile);
+ insert_double_into_dict (dict, "preference", fti->preference);
+ insert_long_into_dict (dict, "type", fti->type);
+ insert_str_into_dict (dict, "username", fti->username);
+ insert_str_into_dict (dict, "password", fti->password);
+
+ return dict;
+}
+
static PyObject* farsight_codec_to_dict(FarsightCodec* fc) {
PyObject* dict = PyDict_New();
- PyObject* item;
- PyDict_SetItemString(dict, "id", item=PyInt_FromLong(fc->id));
- Py_DECREF(item);
+ /* these two are required */
+ insert_long_into_dict(dict, "id", fc->id);
+ insert_str_into_dict(dict, "encoding_name", fc->encoding_name);
- PyDict_SetItemString(dict, "encoding_name", item=PyString_FromString(fc->encoding_name));
- Py_DECREF(item);
+ /* next are optional */
+ if (fc->media_type) insert_long_into_dict(dict, "media_type", fc->media_type);
+ if (fc->clock_rate) insert_long_into_dict(dict, "clock_rate", fc->clock_rate);
+ if (fc->channels) insert_long_into_dict(dict, "channels", fc->channels);
- PyDict_SetItemString(dict, "media_type", item=PyInt_FromLong(fc->media_type));
- Py_DECREF(item);
+ if (fc->optional_params) {
+ PyObject* params = PyDict_New();
+ GList* list;
- PyDict_SetItemString(dict, "clock_rate", item=PyInt_FromLong(fc->clock_rate));
- Py_DECREF(item);
+ for(list=fc->optional_params; list; list=g_list_next(list)) {
+ FarsightCodecParameter *fcp=list->data;
+ insert_str_into_dict(params, fcp->name, fcp->value);
+ }
- PyDict_SetItemString(dict, "channels", item=PyInt_FromLong(fc->channels));
- Py_DECREF(item);
+ PyDict_SetItemString(dict, "params", params);
+ Py_DECREF(params);
+ }
return dict;
}
+
+/* functions to get data from dict */
+/* next three functions might raise an error */
+inline static long get_long_from_dict(PyObject* dict, char* key) {
+ PyObject* pyint=PyMapping_GetItemString(dict, key);
+ return(pyint?PyInt_AsLong(pyint):0);
+}
+
+inline static char* get_str_from_dict(PyObject* dict, char* key) {
+ PyObject* str=PyMapping_GetItemString(dict, key);
+ return(str?PyString_AsString(str):NULL);
+}
+
+inline static double get_double_from_dict(PyObject* dict, char* key) {
+ PyObject* pyfloat=PyMapping_GetItemString(dict, key);
+ return(pyfloat?PyFloat_AsDouble(pyfloat):0.0);
+}
+
+/* may raise an exception */
+static void dict_to_farsight_transport_info(PyObject* dict, FarsightTransportInfo* fti) {
+ if (!dict) return;
+
+ /* required */
+ fti->candidate_id = get_str_from_dict(dict, "candidate_id");
+ fti->component = get_long_from_dict(dict, "component");
+ fti->ip = get_str_from_dict(dict, "ip");
+ fti->port = get_long_from_dict(dict, "port");
+ fti->proto = get_long_from_dict(dict, "proto");
+ fti->proto_subtype = get_str_from_dict(dict, "proto_subtype");
+ fti->proto_profile = get_str_from_dict(dict, "proto_profile");
+ fti->preference = get_double_from_dict(dict, "preference");
+ fti->type = get_long_from_dict(dict, "type");
+
+ if (PyError_Occurred()) return;
+
+ /* optional */
+ fti->username = get_str_from_dict(dict, "username");
+ fti->password = get_str_from_dict(dict, "password");
+
+ PyError_Clear();
+}
+
+/* GArray must be freed if not NULL;
+ may raise an exception */
+static void dict_to_farsight_codec(PyObject* dict, FarsightCodec* fc, GArray** fcp) {
+ GArray* array=*fcp;
+
+ if (!dict) return;
+
+ /* required data */
+ fc->id = get_long_from_dict(dict, "id");
+ fc->encoding_name = get_str_from_dict(dict, "encoding_name");
+
+ if (PyError_Occured()) return;
+
+ /* optional data */
+ fc->media_type = get_long_from_dict(dict, "media_type");
+ fc->clock_rate = get_long_from_dict(dict, "clock_rate");
+ fc->channels = get_long_from_dict(dict, "channels");
+
+ if (PyMapping_HasKeyString(dict, "params")) {
+ PyObject* params = PyMapping_GetItemString(dict, "params");
+ if (PyDict_Check(params)) {
+ PyObject *key, *value;
+ int pos=0;
+ GList* list=NULL;
+ int i=0;
+
+ if (!array)
+ array = g_array_new(FALSE, FALSE, sizeof(FarsightCodecParameter));
+
+ while (PyDict_Next(params, &pos, &key, &value)) {
+ if (PyString_Check(key) && PyString_Check(value)) {
+ FarsightCodecParameter fcp;
+ fcp.name = PyString_AsString(key);
+ fcp.value= PyString_AsString(value);
+ g_array_append_val(array, fcp);
+ list=g_list_prepend(list,
+ &g_array_index(array, FarsightCodecParameter, i++));
+ } else {
+ /* this is not a string? not good... */
+ puts("keys and values must be strings here!");
+ }
+ }
+
+ fc->optional_params = list;
+ } else {
+ /* this is not a dictionary? fail miserably... */
+ puts("params must be a dictionary!");
+ }
+ }
+
+ PyErr_Clear();
+
+ *fcp = array;
+}
+
%%
modulename farsight
%%
@@ -91,7 +228,7 @@
{
static char* kwlist[] = {"candidate_id", NULL};
char* candidate_id;
- GList* list;
+ GList* list, *tmp;
FarsightTransportInfo* data;
PyObject* ret;
PyObject* item;
@@ -100,43 +237,16 @@
return NULL;
list = farsight_stream_get_native_candidate(FARSIGHT_STREAM(self->obj), candidate_id);
- data = list->data;
- ret = PyDict_New();
+ ret = PyList_New(0);
+ for(tmp=list;list;list=g_list_next(list)) {
+ FarsightTransportInfo *fti = tmp->data;
+ PyObject *item = farsight_transport_info_to_dict(fti);
- PyDict_SetItemString(ret, "candidate_id", item=PyString_FromString(data->candidate_id));
- Py_DECREF(item);
+ PyList_Append(ret, item);
+ Py_DECREF(item);
+ }
- PyDict_SetItemString(ret, "component", item=PyInt_FromLong(data->component));
- Py_DECREF(item);
-
- PyDict_SetItemString(ret, "ip", item=PyString_FromString(data->ip));
- Py_DECREF(item);
-
- PyDict_SetItemString(ret, "port", item=PyInt_FromLong(data->port));
- Py_DECREF(item);
-
- PyDict_SetItemString(ret, "proto", item=PyInt_FromLong(data->proto));
- Py_DECREF(item);
-
- PyDict_SetItemString(ret, "proto_subtype", item=PyString_FromString(data->proto_subtype));
- Py_DECREF(item);
-
- PyDict_SetItemString(ret, "proto_profile", item=PyString_FromString(data->proto_profile));
- Py_DECREF(item);
-
- PyDict_SetItemString(ret, "preference", item=PyFloat_FromDouble(data->preference));
- Py_DECREF(item);
-
- PyDict_SetItemString(ret, "type", item=PyInt_FromLong(data->type));
- Py_DECREF(item);
-
- PyDict_SetItemString(ret, "username", item=PyString_FromString(data->username));
- Py_DECREF(item);
-
- PyDict_SetItemString(ret, "password", item=PyString_FromString(data->password));
- Py_DECREF(item);
-
g_list_free(list);
return ret;
@@ -150,15 +260,15 @@
list=farsight_stream_get_native_candidate_list(FARSIGHT_STREAM(self->obj));
- ret=PyList_New(0);
- for (tmp=list; tmp!=NULL; tmp=g_list_next(tmp)) {
- FarsightCodec *codec = tmp->data;
- PyObject *item = pygobject_new((GObject *) codec);
+ ret = PyList_New(0);
+ for(tmp=list;list;list=g_list_next(list)) {
+ FarsightTransportInfo *fti = tmp->data;
+ PyObject *item = farsight_transport_info_to_dict(fti);
PyList_Append(ret, item);
Py_DECREF(item);
}
- // g_list_free(list); (a const list, we don't free it?)
+
return ret;
}
%%
@@ -217,33 +327,27 @@
for(i=0;i<listsize;i++) {
FarsightTransportInfo fti;
- PyObject* item = PySequence_GetItem(list, listsize-i-1);
+ dict_to_farsight_transport_info(PySequence_GetItem(list, listsize-i-1), &fti);
- fti.candidate_id=GetString("candidate_id");
- fti.component=GetLong("component");
- fti.ip=GetString("ip");
- fti.port=GetLong("port");
- fti.proto=GetLong("proto");
- fti.proto_subtype=GetString("proto_subtype");
- fti.proto_profile=GetString("proto_profile");
- fti.preference=GetFloat("preference");
- fti.type=GetLong("type");
- fti.username="";
- fti.password="";
-
g_array_append_val(candidate_array, fti);
candidate_list = g_list_prepend(candidate_list,
&g_array_index(candidate_array, FarsightTransportInfo, i));
}
- farsight_stream_set_remote_candidate_list(FARSIGHT_STREAM(self->obj), candidate_list);
+ if(!PyError_Occurred()) {
+ farsight_stream_set_remote_candidate_list(FARSIGHT_STREAM(self->obj), candidate_list);
+ }
g_array_free(candidate_array, FALSE);
g_list_free(candidate_list);
- Py_INCREF(Py_None);
- return Py_None;
+ if(!PyError_Occurred()) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ } else {
+ return NULL;
+ }
}
%%
override farsight_stream_set_remote_codecs kwargs
@@ -254,6 +358,7 @@
static char* kwlist[] = {"codecs", NULL};
PyObject* list, * item;
GArray* codecs_array;
+ GArray* fcp_array=NULL;
GList* codecs_list=NULL;
int i, listsize;
@@ -266,25 +371,26 @@
listsize=PySequence_Size(list);
for(i=0;i<listsize;i++) {
FarsightCodec fc;
- PyObject* item = PySequence_GetItem(list, listsize-i-1);
- fc.id = GetLong("id");
- fc.encoding_name = GetString("encoding_name");
- fc.media_type = GetLong("media_type");
- fc.clock_rate = GetLong("clock_rate");
- fc.channels = GetLong("channels");
- fc.optional_params = NULL;
+ dict_to_farsight_codec(PySequence_GetItem(list, listsize-i-1), &fc, &fcp_array);
g_array_append_val(codecs_array, fc);
codecs_list = g_list_prepend(codecs_list,
&g_array_index(codecs_array, FarsightCodec, i));
}
- farsight_stream_set_remote_codecs(FARSIGHT_STREAM(self->obj), codecs_list);
+ if (!PyError_Occurred()) {
+ farsight_stream_set_remote_codecs(FARSIGHT_STREAM(self->obj), codecs_list);
+ }
+ g_array_free(fcp_array, FALSE);
g_array_free(codecs_array, FALSE);
g_list_free(codecs_list);
- Py_INCREF(Py_None);
- return Py_None;
+ if (!PyError_Occurred()) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ } else {
+ return NULL;
+ }
}
Modified: branches/jingle/src/common/jingle.py
===================================================================
--- branches/jingle/src/common/jingle.py 2007-08-11 21:47:53 UTC (rev 8489)
+++ branches/jingle/src/common/jingle.py 2007-08-12 00:16:54 UTC (rev 8490)
@@ -408,7 +408,10 @@
def on_p2pstream_codec_changed(self, *whatever): pass
def on_p2pstream_native_candidates_prepared(self, *whatever): pass
def on_p2pstream_state_changed(self, *whatever): pass
- def on_p2pstream_new_native_candidate(self, *whatever): pass
+ def on_p2pstream_new_native_candidate(self, p2pstream, candidate_id):
+ candidate = p2pstream.get_native_candidate(candidate_id)
+
+
def getCodecs(self):
codecs=self.p2pstream.get_local_codecs()
return (xmpp.Node('payload', attrs=a) for a in codecs)