py_pjsua update 010207

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@924 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip-apps/src/py_pjsua/py_pjsua.c b/pjsip-apps/src/py_pjsua/py_pjsua.c
index b0fa061..fda9658 100644
--- a/pjsip-apps/src/py_pjsua/py_pjsua.c
+++ b/pjsip-apps/src/py_pjsua/py_pjsua.c
@@ -21,6 +21,8 @@
 #include <pjsua-lib/pjsua.h>
 
 #define THIS_FILE    "main.c"
+#define POOL_SIZE    4000
+#define SND_DEV_NUM  64
 
 /* LIB BASE */
 
@@ -194,11 +196,11 @@
     {	
         pjsip_event_Object * obj;
 		
-	    obj =
+	obj =
 	        (pjsip_event_Object *)PyType_GenericNew(&pjsip_event_Type, 
 						    NULL, NULL);
 		
-	    obj->event = e;
+	obj->event = e;
 		
         PyObject_CallFunctionObjArgs(
             g_obj_callback->on_call_state,Py_BuildValue("i",call_id),obj,NULL
@@ -1302,12 +1304,14 @@
     if (PyList_Check(py_hdr_list)) {
         pj_list_init(hdr);
 
-        for (i = 0; i < PyList_Size(py_hdr_list); i++) { 
+        for (i = 0; i < PyList_Size(py_hdr_list); i++) 
+	{ 
             pj_str_t hname, hvalue;
 	    pjsip_generic_string_hdr * new_hdr;
             PyObject * tuple = PyList_GetItem(py_hdr_list, i);
 
-            if (PyTuple_Check(tuple)) {
+            if (PyTuple_Check(tuple)) 
+	    {
                 hname.ptr = PyString_AsString(PyTuple_GetItem(tuple,0));
                 hname.slen = strlen(PyString_AsString
 					(PyTuple_GetItem(tuple,0)));
@@ -1340,23 +1344,26 @@
 
     len = pj_list_size(hdr);
     
-    if (len > 0) {
-	p_hdr = hdr;
+    if (len > 0) 
+    {
+        p_hdr = hdr;
         Py_XDECREF(py_hdr_list);
         py_hdr_list = PyList_New(len);
 
-	for (i = 0; i < len && p_hdr != NULL; i++) {
-	    PyObject * tuple;
-	    PyObject * str;
+        for (i = 0; i < len && p_hdr != NULL; i++) 
+	{
+            PyObject * tuple;
+            PyObject * str;
 
-	    tuple = PyTuple_New(2);
+            tuple = PyTuple_New(2);
 	    
-	    str = PyString_FromStringAndSize(p_hdr->name.ptr, p_hdr->name.slen);
-	    PyTuple_SetItem(tuple, 0, str);
-	    str = PyString_FromStringAndSize(hdr->hvalue.ptr, p_hdr->hvalue.slen);
-	    PyTuple_SetItem(tuple, 1, str);
-	    PyList_SetItem(py_hdr_list, i, tuple);
-	    p_hdr = p_hdr->next;
+            str = PyString_FromStringAndSize(p_hdr->name.ptr, p_hdr->name.slen);
+            PyTuple_SetItem(tuple, 0, str);
+            str = PyString_FromStringAndSize
+		(hdr->hvalue.ptr, p_hdr->hvalue.slen);
+            PyTuple_SetItem(tuple, 1, str);
+            PyList_SetItem(py_hdr_list, i, tuple);
+            p_hdr = p_hdr->next;
 	}
     }
     
@@ -1554,8 +1561,8 @@
 {
     Py_XDECREF(self->realm);
     Py_XDECREF(self->scheme);
-	Py_XDECREF(self->username);
-	Py_XDECREF(self->data);
+    Py_XDECREF(self->username);
+    Py_XDECREF(self->data);
     self->ob_type->tp_free((PyObject*)self);
 }
 
@@ -1708,8 +1715,10 @@
 #if 0
     size = PyList_Size(py_desc);
     td = (int *)malloc(size * sizeof(int));
-    for (i = 0; i < size; i++) {
-	if (!PyArg_Parse(PyList_GetItem(py_desc,i),"i", td[i])) {
+    for (i = 0; i < size; i++) 
+    {
+	if (!PyArg_Parse(PyList_GetItem(py_desc,i),"i", td[i])) 
+	{
 	    return NULL;
 	}
     }
@@ -1740,7 +1749,7 @@
     }
     
     pjsua_logging_config_default(&cfg);
-	obj = (logging_config_Object *) logging_config_new
+    obj = (logging_config_Object *) logging_config_new
 		(&logging_config_Type,NULL,NULL);
     obj->msg_logging = cfg.msg_logging;
     obj->level = cfg.level;
@@ -1765,7 +1774,7 @@
         return NULL;
     }
     pjsua_config_default(&cfg);
-	obj = (config_Object *) config_new(&config_Type, NULL, NULL);
+    obj = (config_Object *) config_new(&config_Type, NULL, NULL);
     obj->max_calls = cfg.max_calls;
     obj->thread_cnt = cfg.thread_cnt;
     return (PyObject *)obj;
@@ -1839,7 +1848,7 @@
  */
 static PyObject *py_pjsua_reconfigure_logging(PyObject *pSelf, PyObject *pArgs)
 {
-	PyObject * logObj;
+    PyObject * logObj;
     logging_config_Object *log;
     pjsua_logging_config cfg;
     pj_status_t status;
@@ -1848,7 +1857,8 @@
     {
         return NULL;
     }
-    if (logObj != Py_None) {
+    if (logObj != Py_None) 
+    {
         log = (logging_config_Object *)logObj;
         cfg.msg_logging = log->msg_logging;
         cfg.level = log->level;
@@ -1863,7 +1873,7 @@
         status = pjsua_reconfigure_logging(&cfg);
     } else {
         status = pjsua_reconfigure_logging(NULL);
-	}
+    }
     return Py_BuildValue("i",status);
 }
 
@@ -1988,7 +1998,8 @@
     }
     status = pjsua_create();
     
-    if (status == PJ_SUCCESS) {
+    if (status == PJ_SUCCESS) 
+    {
 	status = pj_thread_local_alloc(&thread_id);
 	if (status == PJ_SUCCESS)
 	    status = pj_thread_local_set(thread_id, (void*)1);
@@ -2028,7 +2039,8 @@
     pjsua_logging_config_default(&cfg_log);
     pjsua_media_config_default(&cfg_media);
 
-    if (ua_cfgObj != Py_None) {
+    if (ua_cfgObj != Py_None) 
+    {
 	ua_cfg = (config_Object *)ua_cfgObj;
         cfg_ua.cred_count = ua_cfg->cred_count;
         for (i = 0; i < 4; i++)
@@ -2067,7 +2079,8 @@
         p_cfg_ua = NULL;
     }
 
-    if (log_cfgObj != Py_None) {
+    if (log_cfgObj != Py_None) 
+    {
         log_cfg = (logging_config_Object *)log_cfgObj;
         cfg_log.msg_logging = log_cfg->msg_logging;
         cfg_log.level = log_cfg->level;
@@ -2084,7 +2097,8 @@
         p_cfg_log = NULL;
     }
 
-    if (media_cfgObj != Py_None) {
+    if (media_cfgObj != Py_None) 
+    {
         media_cfg = (media_config_Object *)media_cfgObj;
         cfg_media.clock_rate = media_cfg->clock_rate;
         cfg_media.ec_options = media_cfg->ec_options;
@@ -2183,9 +2197,9 @@
 static char pjsua_perror_doc[] =
     "void py_pjsua.perror (string sender, string title, int status) "
     "Display error message for the specified error code. Parameters: "
-        "sender: The log sender field;  "
-        "title: Message title for the error; "
-        "status: Status code.";
+    "sender: The log sender field;  "
+    "title: Message title for the error; "
+    "status: Status code.";
 
 static char pjsua_create_doc[] =
     "int py_pjsua.create (void) "
@@ -2201,9 +2215,9 @@
     "Initialize pjsua with the specified settings. All the settings are "
     "optional, and the default values will be used when the config is not "
     "specified. Parameters: "
-        "ua_cfg : User agent configuration;  "
-        "log_cfg : Optional logging configuration; "
-        "media_cfg : Optional media configuration.";
+    "ua_cfg : User agent configuration;  "
+    "log_cfg : Optional logging configuration; "
+    "media_cfg : Optional media configuration.";
 
 static char pjsua_start_doc[] =
     "int py_pjsua.start (void) "
@@ -2221,7 +2235,7 @@
     "int py_pjsua.handle_events (int msec_timeout) "
     "Poll pjsua for events, and if necessary block the caller thread for the "
     "specified maximum interval (in miliseconds) Parameters: "
-        "msec_timeout: Maximum time to wait, in miliseconds. "
+    "msec_timeout: Maximum time to wait, in miliseconds. "
     "Returns: The number of events that have been handled during the poll. "
     "Negative value indicates error, and application can retrieve the error "
     "as (err = -return_value).";
@@ -2229,15 +2243,15 @@
 static char pjsua_verify_sip_url_doc[] =
     "int py_pjsua.verify_sip_url (string c_url) "
     "Verify that valid SIP url is given Parameters: "
-        "c_url: The URL, as NULL terminated string.";
+    "c_url: The URL, as NULL terminated string.";
 
 static char pjsua_pool_create_doc[] =
     "py_pjsua.PJ_Pool py_pjsua.pool_create (string name, int init_size, "
                                             "int increment) "
     "Create memory pool Parameters: "
-        "name: Optional pool name; "
-        "init_size: Initial size of the pool;  "
-        "increment: Increment size.";
+    "name: Optional pool name; "
+    "init_size: Initial size of the pool;  "
+    "increment: Increment size.";
 
 static char pjsua_get_pjsip_endpt_doc[] =
     "py_pjsua.PJSIP_Endpoint py_pjsua.get_pjsip_endpt (void) "
@@ -2259,7 +2273,7 @@
     "int py_pjsua.reconfigure_logging (py_pjsua.Logging_Config c) "
     "Application can call this function at any time (after pjsua_create(), of "
     "course) to change logging settings. Parameters: "
-        "c: Logging configuration.";
+    "c: Logging configuration.";
 
 static char pjsua_logging_config_default_doc[] =
     "py_pjsua.Logging_Config py_pjsua.logging_config_default  ()  "
@@ -2459,7 +2473,7 @@
     self = (transport_config_Object *)type->tp_alloc(type, 0);
     if (self != NULL)
     {
-		self->public_addr = PyString_FromString("");
+        self->public_addr = PyString_FromString("");
         if (self->public_addr == NULL)
     	{
             Py_DECREF(self);
@@ -2718,7 +2732,7 @@
     PyObject_HEAD
     /* Type-specific fields go here. */
     PyObject * host;
-	int port;
+    int port;
 } host_port_Object;
 
 /*
@@ -3059,7 +3073,7 @@
     }
 	
     pjsua_stun_config_default(&cfg);
-	obj = (stun_config_Object *)stun_config_new(&stun_config_Type, NULL, NULL);
+    obj = (stun_config_Object *)stun_config_new(&stun_config_Type, NULL, NULL);
     obj->stun_port1 = cfg.stun_port1;
     obj->stun_port2 = cfg.stun_port2;
     Py_XDECREF(obj->stun_srv1);
@@ -3086,7 +3100,7 @@
         return NULL;
     }
     pjsua_transport_config_default(&cfg);
-	obj = (transport_config_Object *)transport_config_new
+    obj = (transport_config_Object *)transport_config_new
 		(&transport_config_Type,NULL,NULL);
     obj->public_addr = 
         PyString_FromStringAndSize(cfg.public_addr.ptr, cfg.public_addr.slen);
@@ -3116,7 +3130,7 @@
 static PyObject *py_pjsua_normalize_stun_config
 (PyObject *pSelf, PyObject *pArgs)
 {
-	PyObject * tmpObj;
+    PyObject * tmpObj;
     stun_config_Object *obj;
     pjsua_stun_config *cfg;
 
@@ -3124,9 +3138,9 @@
     {
         return NULL;
     }
-	if (tmpObj != Py_None)
-	{
-		obj = (stun_config_Object *) tmpObj;
+    if (tmpObj != Py_None)
+    {
+        obj = (stun_config_Object *) tmpObj;
         cfg = (pjsua_stun_config *)malloc(sizeof(pjsua_stun_config));
         cfg->stun_port1 = obj->stun_port1;
         cfg->stun_port2 = obj->stun_port2;
@@ -3134,9 +3148,9 @@
         cfg->stun_srv1.slen = strlen(PyString_AsString(obj->stun_srv1));
         cfg->stun_srv2.ptr = PyString_AsString(obj->stun_srv2);
         cfg->stun_srv2.slen = strlen(PyString_AsString(obj->stun_srv2));
-	} else {
-		cfg = NULL;
-	}
+    } else {
+        cfg = NULL;
+    }
     pjsua_normalize_stun_config(cfg);
     obj->stun_port1 = cfg->stun_port1;
     obj->stun_port2 = cfg->stun_port2;
@@ -3160,7 +3174,7 @@
     pj_status_t status;
     int type;
     
-	PyObject * tmpObj;
+    PyObject * tmpObj;
     transport_config_Object *obj;
     pjsua_transport_config cfg;
     pjsua_transport_id id;
@@ -3168,8 +3182,8 @@
     {
         return NULL;
     }
-	if (tmpObj != Py_None)
-	{
+    if (tmpObj != Py_None)
+    {
         obj = (transport_config_Object *)tmpObj;
         cfg.public_addr.ptr = PyString_AsString(obj->public_addr);
         cfg.public_addr.slen = strlen(PyString_AsString(obj->public_addr));
@@ -3188,9 +3202,9 @@
         cfg.stun_config.stun_srv2.slen = 
             strlen(PyString_AsString(obj->stun_config->stun_srv2));
         status = pjsua_transport_create(type, &cfg, &id);
-	} else {
+    } else {
         status = pjsua_transport_create(type, NULL, &id);
-	}
+    }
     
     
     return Py_BuildValue("ii",status,id);
@@ -3203,7 +3217,7 @@
 static PyObject *py_pjsua_transport_register(PyObject *pSelf, PyObject *pArgs)
 {
     pj_status_t status;	    
-	PyObject * tmpObj;
+    PyObject * tmpObj;
     pjsip_transport_Object *obj;	
     pjsua_transport_id id;
     if (!PyArg_ParseTuple(pArgs, "O", &tmpObj))
@@ -3211,7 +3225,7 @@
         return NULL;
     }
     if (tmpObj != Py_None)
-	{
+    {
         obj = (pjsip_transport_Object *)tmpObj;
         status = pjsua_transport_register(obj->tp, &id);
     } else {
@@ -3682,7 +3696,7 @@
         s = PyString_AsString(str);
         if (s[0]) 
         {
-        self->buf_[idx] = s[0];
+            self->buf_[idx] = s[0];
         }	 
 	else 
         {
@@ -3828,7 +3842,7 @@
     pjsua_acc_config_default(&cfg);
     obj = (acc_config_Object *)acc_config_new(&acc_config_Type, NULL, NULL);
     obj->cred_count = cfg.cred_count;
-    for (i = 0; i < 8; i++) 
+    for (i = 0; i < PJSUA_MAX_ACC; i++) 
     {
         /*obj->cred_info[i] = cfg.cred_info[i];*/
 	int ret;
@@ -3862,7 +3876,7 @@
     obj->reg_uri = 
         PyString_FromStringAndSize(cfg.reg_uri.ptr, cfg.reg_uri.slen);
     obj->proxy_cnt = cfg.proxy_cnt;
-    for (i = 0; i < 8; i++) 
+    for (i = 0; i < PJSUA_MAX_ACC; i++) 
     {
 	PyObject * str;
 	int ret;
@@ -3955,7 +3969,7 @@
 (PyObject *pSelf, PyObject *pArgs)
 {    
     int is_default;
-	PyObject * acObj;
+    PyObject * acObj;
     acc_config_Object * ac;
     pjsua_acc_config cfg;
     
@@ -3970,34 +3984,35 @@
 
     pjsua_acc_config_default(&cfg);
     if (acObj != Py_None)
-	{
+    {
         ac = (acc_config_Object *)acObj;
         cfg.cred_count = ac->cred_count;
-        for (i = 0; i < 8; i++) 
+        for (i = 0; i < PJSUA_MAX_ACC; i++) 
 	{
             /*cfg.cred_info[i] = ac->cred_info[i];*/
-	        pjsip_cred_info_Object * ci = (pjsip_cred_info_Object *)
+            pjsip_cred_info_Object * ci = (pjsip_cred_info_Object *)
 				PyList_GetItem((PyObject *)ac->cred_info,i);
-	        cfg.cred_info[i].data.ptr = PyString_AsString(ci->data);
-	        cfg.cred_info[i].data.slen = strlen(PyString_AsString(ci->data));
-	        cfg.cred_info[i].realm.ptr = PyString_AsString(ci->realm);
-	        cfg.cred_info[i].realm.slen = strlen(PyString_AsString(ci->realm));
-	        cfg.cred_info[i].scheme.ptr = PyString_AsString(ci->scheme);
-	        cfg.cred_info[i].scheme.slen = strlen
+            cfg.cred_info[i].data.ptr = PyString_AsString(ci->data);
+            cfg.cred_info[i].data.slen = strlen(PyString_AsString(ci->data));
+            cfg.cred_info[i].realm.ptr = PyString_AsString(ci->realm);
+            cfg.cred_info[i].realm.slen = strlen(PyString_AsString(ci->realm));
+            cfg.cred_info[i].scheme.ptr = PyString_AsString(ci->scheme);
+            cfg.cred_info[i].scheme.slen = strlen
 				(PyString_AsString(ci->scheme));
-	        cfg.cred_info[i].username.ptr = PyString_AsString(ci->username);
-	        cfg.cred_info[i].username.slen = strlen
+            cfg.cred_info[i].username.ptr = PyString_AsString(ci->username);
+            cfg.cred_info[i].username.slen = strlen
 				(PyString_AsString(ci->username));
-	        cfg.cred_info[i].data_type = ci->data_type;
+            cfg.cred_info[i].data_type = ci->data_type;
 	}
         cfg.force_contact.ptr = PyString_AsString(ac->force_contact);
         cfg.force_contact.slen = strlen(PyString_AsString(ac->force_contact));
         cfg.id.ptr = PyString_AsString(ac->id);
         cfg.id.slen = strlen(PyString_AsString(ac->id));
         cfg.priority = ac->priority;
-        for (i = 0; i < 8; i++) {
+        for (i = 0; i < PJSUA_MAX_ACC; i++) 
+	{
             /*cfg.proxy[i] = ac->proxy[i];*/
-	        cfg.proxy[i].ptr = PyString_AsString
+            cfg.proxy[i].ptr = PyString_AsString
 				(PyList_GetItem((PyObject *)ac->proxy,i));
 	}
         cfg.proxy_cnt = ac->proxy_cnt;
@@ -4009,7 +4024,7 @@
         status = pjsua_acc_add(&cfg, is_default, &p_acc_id);
     } else {
         status = pjsua_acc_add(NULL, is_default, &p_acc_id);
-	}
+    }
     
     return Py_BuildValue("ii", status, p_acc_id);
 }
@@ -4064,7 +4079,7 @@
 static PyObject *py_pjsua_acc_modify
 (PyObject *pSelf, PyObject *pArgs)
 {    	
-	PyObject * acObj;
+    PyObject * acObj;
     acc_config_Object * ac;
     pjsua_acc_config cfg;	
     int acc_id;
@@ -4076,11 +4091,11 @@
         return NULL;
     }
     if (acObj != Py_None)
-	{
-		ac = (acc_config_Object *)acObj;
+    {
+        ac = (acc_config_Object *)acObj;
         cfg.cred_count = ac->cred_count;
-        for (i = 0; i < 8; i++) 
-		{
+        for (i = 0; i < PJSUA_MAX_ACC; i++) 
+	{
             /*cfg.cred_info[i] = ac->cred_info[i];*/
             pjsip_cred_info_Object * ci = (pjsip_cred_info_Object *)
 				PyList_GetItem((PyObject *)ac->cred_info,i);
@@ -4094,26 +4109,27 @@
             cfg.cred_info[i].username.ptr = PyString_AsString(ci->username);
             cfg.cred_info[i].username.slen = strlen
 				(PyString_AsString(ci->username));
-		}
+	}
         cfg.force_contact.ptr = PyString_AsString(ac->force_contact);
         cfg.force_contact.slen = strlen(PyString_AsString(ac->force_contact));
         cfg.id.ptr = PyString_AsString(ac->id);
         cfg.id.slen = strlen(PyString_AsString(ac->id));
         cfg.priority = ac->priority;
-        for (i = 0; i < 8; i++) {
+        for (i = 0; i < PJSUA_MAX_ACC; i++) 
+	{
             /*cfg.proxy[i] = ac->proxy[i];*/
-	        cfg.proxy[i].ptr = PyString_AsString
+             cfg.proxy[i].ptr = PyString_AsString
 				(PyList_GetItem((PyObject *)ac->proxy,i));
-		}
+	}
         cfg.proxy_cnt = ac->proxy_cnt;
         cfg.publish_enabled = ac->publish_enabled;
         cfg.reg_timeout = ac->reg_timeout;
         cfg.reg_uri.ptr = PyString_AsString(ac->reg_uri);
         cfg.reg_uri.slen = strlen(PyString_AsString(ac->reg_uri));	
         status = pjsua_acc_modify(acc_id, &cfg);
-	} else {
-		status = pjsua_acc_modify(acc_id, NULL);
-	}
+    } else {
+        status = pjsua_acc_modify(acc_id, NULL);
+    }
     return Py_BuildValue("i", status);
 }
 
@@ -4177,12 +4193,14 @@
 	
     
     status = pjsua_acc_get_info(acc_id, &info);
-    if (status == PJ_SUCCESS) {
+    if (status == PJ_SUCCESS) 
+    {
 	obj = (acc_info_Object *)acc_info_new(&acc_info_Type,NULL, NULL);
         obj->acc_uri =
             PyString_FromStringAndSize(info.acc_uri.ptr, 
             info.acc_uri.slen);
-        for (i = 0; i < PJ_ERR_MSG_SIZE; i++) {
+        for (i = 0; i < PJ_ERR_MSG_SIZE; i++) 
+	{
             obj->buf_[i] = info.buf_[i];
 	}
         obj->expires = info.expires;
@@ -4221,9 +4239,11 @@
     status = pjsua_enum_accs(id, &c);
     
     list = PyList_New(c);
-    for (i = 0; i < c; i++) {
+    for (i = 0; i < c; i++) 
+    {
         int ret = PyList_SetItem(list, i, Py_BuildValue("i", id[i]));
-        if (ret == -1) {
+        if (ret == -1) 
+	{
             return NULL;
         }
     }
@@ -4251,27 +4271,29 @@
     status = pjsua_acc_enum_info(info, &c);
     
     list = PyList_New(c);
-    for (i = 0; i < c; i++) {
+    for (i = 0; i < c; i++) 
+    {
         int ret;
-	int j;
-	acc_info_Object *obj;
-	obj = (acc_info_Object *)acc_info_new(&acc_info_Type,NULL,NULL);
-	obj->acc_uri = PyString_FromStringAndSize
+        int j;
+        acc_info_Object *obj;
+        obj = (acc_info_Object *)acc_info_new(&acc_info_Type,NULL,NULL);
+        obj->acc_uri = PyString_FromStringAndSize
 	    (info[i].acc_uri.ptr, info[i].acc_uri.slen);
-	for(j = 0; j < PJ_ERR_MSG_SIZE; j++) {
-	    obj->buf_[j] = info[i].buf_[j];
+        for(j = 0; j < PJ_ERR_MSG_SIZE; j++) 
+	{
+            obj->buf_[j] = info[i].buf_[j];
 	}
-	obj->expires = info[i].expires;
-	obj->has_registration = info[i].has_registration;
-	obj->id = info[i].id;
-	obj->is_default = info[i].is_default;
-	obj->online_status = info[i].online_status;
-	obj->status = info[i].status;
-	obj->status_text = PyString_FromStringAndSize(info[i].status_text.ptr,
+        obj->expires = info[i].expires;
+        obj->has_registration = info[i].has_registration;
+        obj->id = info[i].id;
+        obj->is_default = info[i].is_default;
+        obj->online_status = info[i].online_status;
+        obj->status = info[i].status;
+        obj->status_text = PyString_FromStringAndSize(info[i].status_text.ptr,
 	    info[i].status_text.slen);
-	ret = PyList_SetItem(list, i, (PyObject *)obj);
+        ret = PyList_SetItem(list, i, (PyObject *)obj);
         if (ret == -1) {
-	    return NULL;
+            return NULL;
         }
     }
     
@@ -4308,7 +4330,7 @@
 (PyObject *pSelf, PyObject *pArgs)
 {    	
     int acc_id;	
-	PyObject * tmpObj;
+    PyObject * tmpObj;
     pjsip_rx_data_Object * obj;
     pjsip_rx_data * rdata;
 
@@ -4317,13 +4339,13 @@
         return NULL;
     }
     if (tmpObj != Py_None)
-	{
+    {
         obj = (pjsip_rx_data_Object *)tmpObj;
         rdata = obj->rdata;
         acc_id = pjsua_acc_find_for_incoming(rdata);
-	} else {
+    } else {
         acc_id = pjsua_acc_find_for_incoming(NULL);
-	}
+    }
     return Py_BuildValue("i", acc_id);
 }
 
@@ -4336,7 +4358,7 @@
 {    	
     int status;
     int acc_id;
-	PyObject * pObj;
+    PyObject * pObj;
     pj_pool_Object * p;
     pj_pool_t * pool;
     PyObject * strc;
@@ -4349,15 +4371,15 @@
         return NULL;
     }
     if (pObj != Py_None)
-	{
+    {
         p = (pj_pool_Object *)pObj;
         pool = p->pool;    
         uri.ptr = PyString_AsString(stru);
         uri.slen = strlen(PyString_AsString(stru));
         status = pjsua_acc_create_uac_contact(pool, &contact, acc_id, &uri);
-	} else {
+    } else {
         status = pjsua_acc_create_uac_contact(NULL, &contact, acc_id, &uri);
-	}
+    }
     strc = PyString_FromStringAndSize(contact.ptr, contact.slen);
 	
     return Py_BuildValue("O", strc);
@@ -4372,12 +4394,12 @@
 {    	
     int status;
     int acc_id;	
-	PyObject * pObj;
+    PyObject * pObj;
     pj_pool_Object * p;
     pj_pool_t * pool;
     PyObject * strc;
     pj_str_t contact;
-	PyObject * rObj;
+    PyObject * rObj;
     pjsip_rx_data_Object * objr;
     pjsip_rx_data * rdata;
 
@@ -4386,19 +4408,19 @@
         return NULL;
     }
     if (pObj != Py_None)
-	{
+    {
         p = (pj_pool_Object *)pObj;
         pool = p->pool;
     } else {
 		pool = NULL;
-	}
+    }
     if (rObj != Py_None)
-	{
-		objr = (pjsip_rx_data_Object *)rObj;
+    {
+        objr = (pjsip_rx_data_Object *)rObj;
         rdata = objr->rdata;
-	} else {
+    } else {
         rdata = NULL;
-	}
+    }
     status = pjsua_acc_create_uas_contact(pool, &contact, acc_id, rdata);
     strc = PyString_FromStringAndSize(contact.ptr, contact.slen);
 	
@@ -4761,6 +4783,31 @@
 };
 
 /*
+ * py_pjsua_buddy_config_default
+ */
+static PyObject *py_pjsua_buddy_config_default
+(PyObject *pSelf, PyObject *pArgs)
+{    
+    buddy_config_Object *obj;	
+    pjsua_buddy_config cfg;
+
+    if (!PyArg_ParseTuple(pArgs, ""))
+    {
+        return NULL;
+    }
+    
+    pjsua_buddy_config_default(&cfg);
+    obj = (buddy_config_Object *) buddy_config_new
+		(&buddy_config_Type,NULL,NULL);
+    obj->uri = PyString_FromStringAndSize(
+        cfg.uri.ptr, cfg.uri.slen
+    );
+    obj->subscribe = cfg.subscribe;
+    
+    return (PyObject *)obj;
+}
+
+/*
  * py_pjsua_get_buddy_count
  */
 static PyObject *py_pjsua_get_buddy_count
@@ -4813,9 +4860,11 @@
     c = PJ_ARRAY_SIZE(id);
     status = pjsua_enum_buddies(id, &c);
     list = PyList_New(c);
-    for (i = 0; i < c; i++) {
+    for (i = 0; i < c; i++) 
+    {
         int ret = PyList_SetItem(list, i, Py_BuildValue("i", id[i]));
-        if (ret == -1) {
+        if (ret == -1) 
+	{
             return NULL;
 	}
     }
@@ -4843,7 +4892,8 @@
 	
     
     status = pjsua_buddy_get_info(buddy_id, &info);
-    if (status == PJ_SUCCESS) {
+    if (status == PJ_SUCCESS) 
+    {
 	obj = (buddy_info_Object *)buddy_info_new(&buddy_info_Type,NULL,NULL);
         obj->id = info.id;
         Py_XDECREF(obj->uri);
@@ -4860,7 +4910,8 @@
             PyString_FromStringAndSize(info.status_text.ptr, 
             info.status_text.slen);
         obj->monitor_pres = info.monitor_pres;
-        for (i = 0; i < 256; i++) {
+        for (i = 0; i < 256; i++) 
+	{
 	    
             obj->buf_[i] = info.buf_[i];
 	}
@@ -4892,15 +4943,15 @@
         return NULL;
     }
     if (bcObj != Py_None)
-	{
-		bc = (buddy_config_Object *)bcObj;
+    {
+        bc = (buddy_config_Object *)bcObj;
 
         cfg.subscribe = bc->subscribe;
         cfg.uri.ptr = PyString_AsString(bc->uri);
         cfg.uri.slen = strlen(PyString_AsString(bc->uri));    
     
         status = pjsua_buddy_add(&cfg, &p_buddy_id);
-	} else {
+    } else {
         status = pjsua_buddy_add(NULL, &p_buddy_id);
     }
     return Py_BuildValue("ii", status, p_buddy_id);
@@ -4973,30 +5024,39 @@
 {    
     int status;
     int acc_id;
-    pj_str_t to, mime_type, content;
+    pj_str_t * mime_type;
+    pj_str_t to, content;
     PyObject * st;
     PyObject * smt;
     PyObject * sc;
     pjsua_msg_data msg_data;
     PyObject * omdObj;
     msg_data_Object * omd;
+    
     int user_data;
     pj_pool_t *pool;
 
+   
     if (!PyArg_ParseTuple(pArgs, "iOOOOi", &acc_id, 
 		&st, &smt, &sc, &omdObj, &user_data))
     {
         return NULL;
     }
-	
+    if (smt != NULL)
+    {
+        mime_type = (pj_str_t *)malloc(sizeof(pj_str_t));
+        mime_type->ptr = PyString_AsString(smt);
+        mime_type->slen = strlen(PyString_AsString(smt));
+    } else {
+        mime_type = NULL;
+    }
     to.ptr = PyString_AsString(st);
     to.slen = strlen(PyString_AsString(st));
-    mime_type.ptr = PyString_AsString(smt);
-    mime_type.slen = strlen(PyString_AsString(smt));
+    
     content.ptr = PyString_AsString(sc);
     content.slen = strlen(PyString_AsString(sc));
     if (omdObj != Py_None)
-	{
+    {
 		
         omd = (msg_data_Object *)omdObj;
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
@@ -5004,18 +5064,21 @@
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
 
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
-        status = pjsua_im_send(acc_id, &to, &mime_type, 
-			&content, &msg_data, &user_data);	
+        status = pjsua_im_send(acc_id, &to, mime_type, 
+			&content, &msg_data, (void *)user_data);	
         pj_pool_release(pool);
-	} else {
+    } else {
 		
-        status = pjsua_im_send(acc_id, &to, NULL, 
+        status = pjsua_im_send(acc_id, &to, mime_type, 
 			&content, NULL, NULL);	
-	}
-	
+    }
+    if (mime_type != NULL)
+    {
+        free(mime_type);
+    }
     return Py_BuildValue("i",status);
 }
 
@@ -5031,7 +5094,7 @@
     PyObject * st;
     int is_typing;
     pjsua_msg_data msg_data;
-	PyObject * omdObj;
+    PyObject * omdObj;
     msg_data_Object * omd;
     pj_pool_t * pool;
 
@@ -5043,24 +5106,27 @@
     to.ptr = PyString_AsString(st);
     to.slen = strlen(PyString_AsString(st));    
     if (omdObj != Py_None)
-	{
+    {
         omd = (msg_data_Object *)omdObj;
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
         msg_data.content_type.slen = strlen
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
 
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
         status = pjsua_im_typing(acc_id, &to, is_typing, &msg_data);	
         pj_pool_release(pool);
-	} else {
+    } else {
         status = pjsua_im_typing(acc_id, &to, is_typing, NULL);
-	}
+    }
     return Py_BuildValue("i",status);
 }
 
+static char pjsua_buddy_config_default_doc[] =
+    "py_pjsua.Buddy_Config py_pjsua.buddy_config_default () "
+    "Set default values to the buddy config.";
 static char pjsua_get_buddy_count_doc[] =
     "int py_pjsua.get_buddy_count () "
     "Get total number of buddies.";
@@ -5280,7 +5346,7 @@
             return NULL;
         }        
 	
-	self->listeners = (PyListObject *)PyList_New(254);
+	self->listeners = (PyListObject *)PyList_New(PJSUA_MAX_CONF_PORTS);
         if (self->listeners == NULL)
     	{
             Py_DECREF(self);
@@ -5472,7 +5538,7 @@
     self = (pjmedia_snd_dev_info_Object *)type->tp_alloc(type, 0);
     if (self != NULL)
     {
-        self->name = (PyListObject *)PyList_New(64);
+        self->name = (PyListObject *)PyList_New(SND_DEV_NUM);
         if (self->name == NULL)
     	{
             Py_DECREF(self);
@@ -5967,9 +6033,11 @@
     status = pjsua_enum_conf_ports(id, &c);
     
     list = PyList_New(c);
-    for (i = 0; i < c; i++) {
+    for (i = 0; i < c; i++) 
+    {
         int ret = PyList_SetItem(list, i, Py_BuildValue("i", id[i]));
-        if (ret == -1) {
+        if (ret == -1) 
+	{
             return NULL;
 	}
     }
@@ -6006,7 +6074,7 @@
     obj->samples_per_frame = info.samples_per_frame;
     obj->slot_id = info.slot_id;
     
-    for (i = 0; i < 254; i++) {
+    for (i = 0; i < PJSUA_MAX_CONF_PORTS; i++) {
 	PyObject * item = Py_BuildValue("i",info.listeners[i]);
 	PyList_SetItem((PyObject *)obj->listeners, i, item);
     }
@@ -6020,12 +6088,12 @@
 (PyObject *pSelf, PyObject *pArgs)
 {    	
     int p_id;
-	PyObject * oportObj;
+    PyObject * oportObj;
     pjmedia_port_Object * oport;
-	pjmedia_port * port;
-	PyObject * opoolObj;
+    pjmedia_port * port;
+    PyObject * opoolObj;
     pj_pool_Object * opool;
-	pj_pool_t * pool;
+    pj_pool_t * pool;
     
     int status;	
     
@@ -6035,20 +6103,20 @@
         return NULL;
     }
     if (opoolObj != Py_None)
-	{
+    {
         opool = (pj_pool_Object *)opoolObj;
 		pool = opool->pool;
-	} else {
-		opool = NULL;
-		pool = NULL;
+    } else {
+       opool = NULL;
+       pool = NULL;
     }
     if (oportObj != Py_None)
-	{
+    {
         oport = (pjmedia_port_Object *)oportObj;
 		port = oport->port;
-	} else {
+    } else {
         oport = NULL;
-		port = NULL;
+        port = NULL;
     }
 
     status = pjsua_conf_add_port(pool, port, &p_id);
@@ -6221,7 +6289,7 @@
     PyObject * filename;
     pj_str_t str;
     PyObject * enc_param;
-	pj_str_t strparam;
+    pj_str_t strparam;
     int enc_type;
     
     int status;	
@@ -6234,8 +6302,8 @@
     }	
     str.ptr = PyString_AsString(filename);
     str.slen = strlen(PyString_AsString(filename));
-	strparam.ptr = PyString_AsString(enc_param);
-	strparam.slen = strlen(PyString_AsString(enc_param));
+    strparam.ptr = PyString_AsString(enc_param);
+    strparam.slen = strlen(PyString_AsString(enc_param));
     status = pjsua_recorder_create
 		(&str, enc_type, NULL, max_size, options, &p_id);
     
@@ -6292,7 +6360,7 @@
     pj_status_t status;
     PyObject *list;
     
-    pjmedia_snd_dev_info info[64];
+    pjmedia_snd_dev_info info[SND_DEV_NUM];
     unsigned c, i;
     if (!PyArg_ParseTuple(pArgs, ""))
     {
@@ -6303,27 +6371,29 @@
     status = pjsua_enum_snd_devs(info, &c);
     
     list = PyList_New(c);
-    for (i = 0; i < c; i++) {
+    for (i = 0; i < c; i++) 
+    {
         int ret;
-	int j;
+        int j;
         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 < 64; j++)
+        for (j = 0; j < SND_DEV_NUM; j++)
 	{
-	    PyObject * ostr;
-	    char * str;
-	    str = (char *)malloc(sizeof(char));
-	    str[0] = info[i].name[j];
-	    ostr = PyString_FromStringAndSize(str,1);
+            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);
+            free(str);
 	}
         ret = PyList_SetItem(list, i, (PyObject *)obj);
-        if (ret == -1) {
+        if (ret == -1) 
+	{
             return NULL;
 	}
     }
@@ -6477,7 +6547,8 @@
     status = pjsua_enum_codecs(info, &c);
     
     list = PyList_New(c);
-    for (i = 0; i < c; i++) {
+    for (i = 0; i < c; i++) 
+    {
         int ret;
         int j;
         codec_info_Object * obj;
@@ -6575,7 +6646,7 @@
     PyObject * id;
     pj_str_t str;
     pjmedia_codec_param param;
-	PyObject * tmpObj;
+    PyObject * tmpObj;
     pjmedia_codec_param_Object *obj;
     
     
@@ -6587,7 +6658,7 @@
     str.ptr = PyString_AsString(id);
     str.slen = strlen(PyString_AsString(id));
     if (tmpObj != Py_None)
-	{
+    {
         obj = (pjmedia_codec_param_Object *)tmpObj;
         param.info.avg_bps = obj->info->avg_bps;
         param.info.channel_cnt = obj->info->channel_cnt;
@@ -6606,7 +6677,7 @@
         status = pjsua_codec_set_param(&str, &param);
     } else {
         status = pjsua_codec_set_param(&str, NULL);
-	}
+    }
     return Py_BuildValue("i", status);
 }
 
@@ -7157,7 +7228,7 @@
     PyObject * sd;
     unsigned options;
     pjsua_msg_data msg_data;
-	PyObject * omdObj;
+    PyObject * omdObj;
     msg_data_Object * omd;
     int user_data;
     int call_id;
@@ -7171,14 +7242,15 @@
 	
     dst_uri.ptr = PyString_AsString(sd);
     dst_uri.slen = strlen(PyString_AsString(sd));
-    if (omdObj != Py_None) {
-	omd = (msg_data_Object *)omdObj;
+    if (omdObj != Py_None) 
+    {
+        omd = (msg_data_Object *)omdObj;
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
         msg_data.content_type.slen = strlen
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
         status = pjsua_call_make_call(acc_id, &dst_uri, 
 			options, (void*)user_data, &msg_data, &call_id);	
@@ -7277,18 +7349,20 @@
     {
         oi = (call_info_Object *)call_info_new(&call_info_Type, NULL, NULL);
         oi->acc_id = info.acc_id;
-	pj_ansi_snprintf(oi->buf_.call_id, sizeof(oi->buf_.call_id),
-			 "%.*s", (int)info.call_id.slen, info.call_id.ptr);
-	pj_ansi_snprintf(oi->buf_.last_status_text, sizeof(oi->buf_.last_status_text),
-			 "%.*s", (int)info.last_status_text.slen, info.last_status_text.ptr);
-	pj_ansi_snprintf(oi->buf_.local_contact, sizeof(oi->buf_.local_contact),
-			 "%.*s", (int)info.local_contact.slen, info.local_contact.ptr);
-	pj_ansi_snprintf(oi->buf_.local_info, sizeof(oi->buf_.local_info),
-			 "%.*s", (int)info.local_info.slen, info.local_info.ptr);
-	pj_ansi_snprintf(oi->buf_.remote_contact, sizeof(oi->buf_.remote_contact),
-			 "%.*s", (int)info.remote_contact.slen, info.remote_contact.ptr);
-	pj_ansi_snprintf(oi->buf_.remote_info, sizeof(oi->buf_.remote_info),
-			 "%.*s", (int)info.remote_info.slen, info.remote_info.ptr);
+        pj_ansi_snprintf(oi->buf_.call_id, sizeof(oi->buf_.call_id),
+	    "%.*s", (int)info.call_id.slen, info.call_id.ptr);
+        pj_ansi_snprintf(oi->buf_.last_status_text, 
+	    sizeof(oi->buf_.last_status_text),
+	    "%.*s", (int)info.last_status_text.slen, info.last_status_text.ptr);
+        pj_ansi_snprintf(oi->buf_.local_contact, sizeof(oi->buf_.local_contact),
+	    "%.*s", (int)info.local_contact.slen, info.local_contact.ptr);
+        pj_ansi_snprintf(oi->buf_.local_info, sizeof(oi->buf_.local_info),
+	    "%.*s", (int)info.local_info.slen, info.local_info.ptr);
+        pj_ansi_snprintf(oi->buf_.remote_contact,
+	    sizeof(oi->buf_.remote_contact),
+	    "%.*s", (int)info.remote_contact.slen, info.remote_contact.ptr);
+        pj_ansi_snprintf(oi->buf_.remote_info, sizeof(oi->buf_.remote_info),
+	    "%.*s", (int)info.remote_info.slen, info.remote_info.ptr);
 
         oi->call_id = PyString_FromStringAndSize(info.call_id.ptr, 
 	    info.call_id.slen);
@@ -7373,11 +7447,11 @@
 {    
     int status;
     int call_id;
-    pj_str_t reason;
+    pj_str_t * reason;
     PyObject * sr;
     unsigned code;
     pjsua_msg_data msg_data;
-	PyObject * omdObj;
+    PyObject * omdObj;
     msg_data_Object * omd;    
     pj_pool_t * pool;
 
@@ -7385,26 +7459,36 @@
     {
         return NULL;
     }
-
-    reason.ptr = PyString_AsString(sr);
-    reason.slen = strlen(PyString_AsString(sr));
-    if (omdObj != Py_None) {
+    if (sr == Py_None) 
+    {
+        reason = NULL;
+    } else {
+	reason = (pj_str_t *)malloc(sizeof(pj_str_t));
+        reason->ptr = PyString_AsString(sr);
+        reason->slen = strlen(PyString_AsString(sr));
+    }
+    if (omdObj != Py_None) 
+    {
         omd = (msg_data_Object *)omdObj;
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
         msg_data.content_type.slen = strlen
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
 	
-        status = pjsua_call_answer(call_id, code, &reason, &msg_data);	
+        status = pjsua_call_answer(call_id, code, reason, &msg_data);	
     
         pj_pool_release(pool);
     } else {
 	
-        status = pjsua_call_answer(call_id, code, &reason, NULL);	
-	}
+        status = pjsua_call_answer(call_id, code, reason, NULL);	
+    }
+    if (reason != NULL)
+    {
+        free(reason);
+    }
     return Py_BuildValue("i",status);
 }
 
@@ -7416,11 +7500,11 @@
 {    
     int status;
     int call_id;
-    pj_str_t reason;
+    pj_str_t * reason;
     PyObject * sr;
     unsigned code;
     pjsua_msg_data msg_data;
-	PyObject * omdObj;
+    PyObject * omdObj;
     msg_data_Object * omd;    
     pj_pool_t * pool = NULL;
 
@@ -7428,22 +7512,32 @@
     {
         return NULL;
     }
-	
-    reason.ptr = PyString_AsString(sr);
-    reason.slen = strlen(PyString_AsString(sr));
-    if (omdObj != Py_None) {
+    if (sr != Py_None)
+    {
+        reason = NULL;
+    } else {
+        reason = (pj_str_t *)malloc(sizeof(pj_str_t));
+        reason->ptr = PyString_AsString(sr);
+        reason->slen = strlen(PyString_AsString(sr));
+    }
+    if (omdObj != Py_None) 
+    {
         omd = (msg_data_Object *)omdObj;
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
         msg_data.content_type.slen = strlen
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
-        status = pjsua_call_hangup(call_id, code, &reason, &msg_data);	
+        status = pjsua_call_hangup(call_id, code, reason, &msg_data);	
         pj_pool_release(pool);
     } else {
-        status = pjsua_call_hangup(call_id, code, &reason, NULL);	
+        status = pjsua_call_hangup(call_id, code, reason, NULL);	
+    }
+    if (reason != NULL)
+    {
+        free(reason);
     }
     return Py_BuildValue("i",status);
 }
@@ -7466,20 +7560,21 @@
         return NULL;
     }
 
-    if (omdObj != Py_None) {
+    if (omdObj != Py_None) 
+    {
         omd = (msg_data_Object *)omdObj;
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
         msg_data.content_type.slen = strlen
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
         status = pjsua_call_set_hold(call_id, &msg_data);	
         pj_pool_release(pool);
-	} else {
+    } else {
         status = pjsua_call_set_hold(call_id, NULL);	
-	}
+    }
     return Py_BuildValue("i",status);
 }
 
@@ -7503,14 +7598,14 @@
     }
 
     if (omdObj != Py_None)
-	{
+    {
         omd = (msg_data_Object *)omdObj;
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
         msg_data.content_type.slen = strlen
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
         status = pjsua_call_reinvite(call_id, unhold, &msg_data);	
         pj_pool_release(pool);
@@ -7544,20 +7639,20 @@
     dest.slen = strlen(PyString_AsString(sd));
     
     if (omdObj != Py_None)
-	{
+    {
         omd = (msg_data_Object *)omdObj;
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
         msg_data.content_type.slen = strlen
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
         status = pjsua_call_xfer(call_id, &dest, &msg_data);	
         pj_pool_release(pool);
-	} else {
+    } else {
         status = pjsua_call_xfer(call_id, &dest, NULL);	
-	}
+    }
     return Py_BuildValue("i",status);
 }
 
@@ -7583,21 +7678,21 @@
     }
 	
     if (omdObj != Py_None)
-	{
+    {
         omd = (msg_data_Object *)omdObj;    
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
         msg_data.content_type.slen = strlen
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
         status = pjsua_call_xfer_replaces
 			(call_id, dest_call_id, options, &msg_data);	
         pj_pool_release(pool);
-	} else {
+    } else {
         status = pjsua_call_xfer_replaces(call_id, dest_call_id,options, NULL);	
-	}
+    }
     return Py_BuildValue("i",status);
 }
 
@@ -7631,7 +7726,8 @@
 {    
     int status;
     int call_id;
-    pj_str_t mime_type, content;
+    pj_str_t content;
+    pj_str_t * mime_type;
     PyObject * sm;
     PyObject * sc;
     pjsua_msg_data msg_data;
@@ -7645,29 +7741,38 @@
     {
         return NULL;
     }
-	
-    mime_type.ptr = PyString_AsString(sm);
-    mime_type.slen = strlen(PyString_AsString(sm));
+    if (sm == Py_None)
+    {
+        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));
+    }
     content.ptr = PyString_AsString(sc);
     content.slen = strlen(PyString_AsString(sc));
     
     if (omdObj != Py_None)
-	{
+    {
         omd = (msg_data_Object *)omdObj;
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
         msg_data.content_type.slen = strlen
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
         status = pjsua_call_send_im
-			(call_id, &mime_type, &content, &msg_data, &user_data);	
+		(call_id, mime_type, &content, &msg_data, (void *)user_data);	
         pj_pool_release(pool);
-	} else {
+    } else {
         status = pjsua_call_send_im
-			(call_id, &mime_type, &content, NULL, &user_data);	
-	}
+			(call_id, mime_type, &content, NULL, (void *)user_data);	
+    }
+    if (mime_type != NULL)
+    {
+        free(mime_type);
+    }
     return Py_BuildValue("i",status);
 }
 
@@ -7691,20 +7796,20 @@
     }
 	
     if (omdObj != Py_None)
-	{
+    {
         omd = (msg_data_Object *)omdObj;
         msg_data.content_type.ptr = PyString_AsString(omd->content_type);
         msg_data.content_type.slen = strlen
 			(PyString_AsString(omd->content_type));
         msg_data.msg_body.ptr = PyString_AsString(omd->msg_body);
         msg_data.msg_body.slen = strlen(PyString_AsString(omd->msg_body));
-        pool = pjsua_pool_create("pjsua", 4000, 4000);
+        pool = pjsua_pool_create("pjsua", POOL_SIZE, POOL_SIZE);
         translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
         status = pjsua_call_send_typing_ind(call_id, is_typing, &msg_data);	
         pj_pool_release(pool);
-	} else {
+    } else {
         status = pjsua_call_send_typing_ind(call_id, is_typing, NULL);	
-	}
+    }
     return Py_BuildValue("i",status);
 }
 
@@ -7750,6 +7855,7 @@
     
     status = pjsua_call_dump(call_id, with_media, buffer, maxlen, indent);
     sb = PyString_FromStringAndSize(buffer, maxlen);
+    free(buffer);
     return Py_BuildValue("O", sb);
 }
 
@@ -8015,6 +8121,10 @@
         pjsua_acc_create_uas_contact_doc
     },
     {
+        "buddy_config_default", py_pjsua_buddy_config_default, METH_VARARGS,
+        pjsua_buddy_config_default_doc
+    },
+    {
         "get_buddy_count", py_pjsua_get_buddy_count, METH_VARARGS,
         pjsua_get_buddy_count_doc
     },
@@ -8025,7 +8135,7 @@
     {
         "enum_buddies", py_pjsua_enum_buddies, METH_VARARGS,
         pjsua_enum_buddies_doc
-    },
+    },    
     {
         "buddy_get_info", py_pjsua_buddy_get_info, METH_VARARGS,
         pjsua_buddy_get_info_doc