py_pjsuaupdated 020207

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@926 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip-apps/src/py_pjsua/pjsua_app.py b/pjsip-apps/src/py_pjsua/pjsua_app.py
index 5c8e6ed..7aa7d3e 100644
--- a/pjsip-apps/src/py_pjsua/pjsua_app.py
+++ b/pjsip-apps/src/py_pjsua/pjsua_app.py
@@ -73,6 +73,20 @@
 		write_log(3, "Account successfully (un)registered")
 
 
+def on_buddy_state(buddy_id):
+	write_log(3, "On Buddy state called")
+	buddy_info = py_pjsua.buddy_get_info(buddy_id)
+	if buddy_info.status != 0 and buddy_info.status != 200:
+		write_log(3, "Status of " + `buddy_info.uri` + " is " + `buddy_info.status_text`)
+	else:
+		write_log(3, "Status : " + `buddy_info.status`)
+		
+def on_pager(call_id, strfrom, strto, contact, mime_type, text):
+	write_log(3, "MESSAGE from " + `strfrom` + " : " + `text`)
+	
+def on_pager_status(call_id, strto, body, user_data, status, reason):
+	write_log(3, "MESSAGE to " + `strto` + " status " + `status` + " reason " + `reason`)
+
 # Utility: display PJ error and exit
 #
 def err_exit(title, rc):
@@ -117,6 +131,10 @@
 	ua_cfg.cb.on_call_media_state = on_call_media_state
 	ua_cfg.cb.on_reg_state = on_reg_state
 	ua_cfg.cb.on_call_state = on_call_state
+	ua_cfg.cb.on_buddy_state = on_buddy_state
+	ua_cfg.cb.on_pager = on_pager
+	ua_cfg.cb.on_pager_status = on_pager_status
+	
 
 	# Create and initialize media config
 	med_cfg = py_pjsua.media_config_default()
diff --git a/pjsip-apps/src/py_pjsua/py_pjsua.c b/pjsip-apps/src/py_pjsua/py_pjsua.c
index 9c14a31..77649f1 100644
--- a/pjsip-apps/src/py_pjsua/py_pjsua.c
+++ b/pjsip-apps/src/py_pjsua/py_pjsua.c
@@ -23,6 +23,7 @@
 #define THIS_FILE    "main.c"
 #define POOL_SIZE    4000
 #define SND_DEV_NUM  64
+#define SND_NAME_LEN  64
 
 /* LIB BASE */
 
@@ -403,7 +404,7 @@
 
 /*
  * cb_on_pager
- * * declares method on_pager for callback struct
+ * declares method on_pager for callback struct
  */
 static void cb_on_pager(pjsua_call_id call_id, const pj_str_t *from,
                         const pj_str_t *to, const pj_str_t *contact,
@@ -3160,7 +3161,10 @@
     Py_XDECREF(obj->stun_srv2);
     obj->stun_srv2 = 
         PyString_FromStringAndSize(cfg->stun_srv2.ptr, cfg->stun_srv2.slen);
-    free(cfg);
+    if (cfg != NULL)
+    {
+        free(cfg);
+    }
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -5024,7 +5028,7 @@
 {    
     int status;
     int acc_id;
-    pj_str_t * mime_type;
+    pj_str_t * mime_type, tmp_mime_type;
     pj_str_t to, content;
     PyObject * st;
     PyObject * smt;
@@ -5042,11 +5046,11 @@
     {
         return NULL;
     }
-    if (smt != NULL)
+    if (smt != Py_None)
     {
-        mime_type = (pj_str_t *)malloc(sizeof(pj_str_t));
-        mime_type->ptr = PyString_AsString(smt);
-        mime_type->slen = strlen(PyString_AsString(smt));
+        mime_type = &tmp_mime_type;
+        tmp_mime_type.ptr = PyString_AsString(smt);
+        tmp_mime_type.slen = strlen(PyString_AsString(smt));
     } else {
         mime_type = NULL;
     }
@@ -5075,10 +5079,7 @@
         status = pjsua_im_send(acc_id, &to, mime_type, 
 			&content, NULL, NULL);	
     }
-    if (mime_type != NULL)
-    {
-        free(mime_type);
-    }
+    
     return Py_BuildValue("i",status);
 }
 
@@ -5510,7 +5511,7 @@
     unsigned  input_count;
     unsigned  output_count;
     unsigned  default_samples_per_sec;    
-    PyListObject * name;
+    PyObject * name;
 
 } pjmedia_snd_dev_info_Object;
 
@@ -5538,7 +5539,7 @@
     self = (pjmedia_snd_dev_info_Object *)type->tp_alloc(type, 0);
     if (self != NULL)
     {
-        self->name = (PyListObject *)PyList_New(SND_DEV_NUM);
+        self->name = PyString_FromString("");
         if (self->name == NULL)
     	{
             Py_DECREF(self);
@@ -6375,22 +6376,22 @@
     {
         int ret;
         int j;
+        char * str;
+	
         pjmedia_snd_dev_info_Object * obj;
         obj = (pjmedia_snd_dev_info_Object *)pjmedia_snd_dev_info_new
 	    (&pjmedia_snd_dev_info_Type, NULL, NULL);
         obj->default_samples_per_sec = info[i].default_samples_per_sec;
         obj->input_count = info[i].input_count;
         obj->output_count = info[i].output_count;
-        for (j = 0; j < SND_DEV_NUM; j++)
+        str = (char *)malloc(SND_NAME_LEN * sizeof(char));
+        memset(str, 0, SND_NAME_LEN);
+        for (j = 0; j < SND_NAME_LEN; j++)
 	{
-            PyObject * ostr;
-            char * str;
-            str = (char *)malloc(sizeof(char));
-            str[0] = info[i].name[j];
-            ostr = PyString_FromStringAndSize(str,1);
-            PyList_SetItem((PyObject *)obj->name, j, ostr);
-            free(str);
+            str[j] = info[i].name[j];
 	}
+        obj->name = PyString_FromStringAndSize(str, SND_NAME_LEN);
+        free(str);
         ret = PyList_SetItem(list, i, (PyObject *)obj);
         if (ret == -1) 
 	{
@@ -7447,7 +7448,7 @@
 {    
     int status;
     int call_id;
-    pj_str_t * reason;
+    pj_str_t * reason, tmp_reason;
     PyObject * sr;
     unsigned code;
     pjsua_msg_data msg_data;
@@ -7463,9 +7464,9 @@
     {
         reason = NULL;
     } else {
-	reason = (pj_str_t *)malloc(sizeof(pj_str_t));
-        reason->ptr = PyString_AsString(sr);
-        reason->slen = strlen(PyString_AsString(sr));
+	reason = &tmp_reason;
+        tmp_reason.ptr = PyString_AsString(sr);
+        tmp_reason.slen = strlen(PyString_AsString(sr));
     }
     if (omdObj != Py_None) 
     {
@@ -7485,10 +7486,7 @@
 	
         status = pjsua_call_answer(call_id, code, reason, NULL);	
     }
-    if (reason != NULL)
-    {
-        free(reason);
-    }
+    
     return Py_BuildValue("i",status);
 }
 
@@ -7500,7 +7498,7 @@
 {    
     int status;
     int call_id;
-    pj_str_t * reason;
+    pj_str_t * reason, tmp_reason;
     PyObject * sr;
     unsigned code;
     pjsua_msg_data msg_data;
@@ -7516,9 +7514,9 @@
     {
         reason = NULL;
     } else {
-        reason = (pj_str_t *)malloc(sizeof(pj_str_t));
-        reason->ptr = PyString_AsString(sr);
-        reason->slen = strlen(PyString_AsString(sr));
+        reason = &tmp_reason;
+        tmp_reason.ptr = PyString_AsString(sr);
+        tmp_reason.slen = strlen(PyString_AsString(sr));
     }
     if (omdObj != Py_None) 
     {
@@ -7535,10 +7533,7 @@
     } else {
         status = pjsua_call_hangup(call_id, code, reason, NULL);	
     }
-    if (reason != NULL)
-    {
-        free(reason);
-    }
+    
     return Py_BuildValue("i",status);
 }
 
@@ -7727,7 +7722,7 @@
     int status;
     int call_id;
     pj_str_t content;
-    pj_str_t * mime_type;
+    pj_str_t * mime_type, tmp_mime_type;
     PyObject * sm;
     PyObject * sc;
     pjsua_msg_data msg_data;
@@ -7745,9 +7740,9 @@
     {
         mime_type = NULL;
     } else {
-        mime_type = (pj_str_t *)malloc(sizeof(pj_str_t));
-        mime_type->ptr = PyString_AsString(sm);
-        mime_type->slen = strlen(PyString_AsString(sm));
+        mime_type = &tmp_mime_type;
+        tmp_mime_type.ptr = PyString_AsString(sm);
+        tmp_mime_type.slen = strlen(PyString_AsString(sm));
     }
     content.ptr = PyString_AsString(sc);
     content.slen = strlen(PyString_AsString(sc));
@@ -7769,10 +7764,7 @@
         status = pjsua_call_send_im
 			(call_id, mime_type, &content, NULL, (void *)user_data);	
     }
-    if (mime_type != NULL)
-    {
-        free(mime_type);
-    }
+    
     return Py_BuildValue("i",status);
 }