/* $Id$ */
/* 
 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#include "_pjsua.h"

#define THIS_FILE    "main.c"
#define POOL_SIZE    512
#define SND_DEV_NUM  64
#define SND_NAME_LEN  64

/* LIB BASE */

static PyObject* g_obj_log_cb;
static long g_thread_id;
static struct py_thread_desc
{
    struct py_thread_desc *next;
    pj_thread_desc	   desc;
} *py_thread_desc;

/*
 * The global callback object.
 */
static PyObj_pjsua_callback * g_obj_callback;

/* Set this to 1 if all threads are created by Python */
#define NO_PJSIP_THREAD 1

#if NO_PJSIP_THREAD
#   define ENTER_PYTHON()
#   define LEAVE_PYTHON()
#else
#   define ENTER_PYTHON()   PyGILState_STATE state = PyGILState_Ensure()
#   define LEAVE_PYTHON()   PyGILState_Release(state)
#endif


static void clear_py_thread_desc(void)
{
    while (py_thread_desc) {
	struct py_thread_desc *next = py_thread_desc->next;
	free(py_thread_desc);
	py_thread_desc = next;
    }
}


/*
 * cb_log_cb
 * declares method for reconfiguring logging process for callback struct
 */
static void cb_log_cb(int level, const char *data, int len)
{
	
    /* Ignore if this callback is called from alien thread context,
     * or otherwise it will crash Python.
     */
    if (pj_thread_local_get(g_thread_id) == 0)
	return;

    if (PyCallable_Check(g_obj_log_cb)) {
	PyObject *param_data;

	ENTER_PYTHON();

	param_data = PyString_FromStringAndSize(data, len);

        PyObject_CallFunction(
            g_obj_log_cb, 
	    "iOi",
	    level,
            param_data, 
	    len, 
	    NULL
        );

	Py_DECREF(param_data);

	LEAVE_PYTHON();
    }
}

/*
 * cb_on_call_state
 * declares method on_call_state for callback struct
 */
static void cb_on_call_state(pjsua_call_id call_id, pjsip_event *e)
{
    PJ_UNUSED_ARG(e);

    if (PyCallable_Check(g_obj_callback->on_call_state)) {	
        PyObject * obj;

	ENTER_PYTHON();

	obj = Py_BuildValue("");
		
        PyObject_CallFunction(
            g_obj_callback->on_call_state,
	    "iO",
	    call_id,
	    obj,
	    NULL
        );

	Py_DECREF(obj);

	LEAVE_PYTHON();
    }
}


/*
 * cb_on_incoming_call
 * declares method on_incoming_call for callback struct
 */
static void cb_on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id,
                                pjsip_rx_data *rdata)
{
    PJ_UNUSED_ARG(rdata);

    if (PyCallable_Check(g_obj_callback->on_incoming_call)) {
	PyObject *obj;

	ENTER_PYTHON();

	obj = Py_BuildValue("");

        PyObject_CallFunction(
                g_obj_callback->on_incoming_call,
		"iiO",
		acc_id,
                call_id,
		obj,
		NULL
        );

	Py_DECREF(obj);

	LEAVE_PYTHON();
    }
}


/*
 * cb_on_call_media_state
 * declares method on_call_media_state for callback struct
 */
static void cb_on_call_media_state(pjsua_call_id call_id)
{
    if (PyCallable_Check(g_obj_callback->on_call_media_state)) {

	ENTER_PYTHON();

        PyObject_CallFunction(
	    g_obj_callback->on_call_media_state,
	    "i",
	    call_id,
	    NULL
	);

	LEAVE_PYTHON();
    }
}


/*
 * cb_on_dtmf_digit()
 * Callback from PJSUA-LIB on receiving DTMF digit
 */
static void cb_on_dtmf_digit(pjsua_call_id call_id, int digit)
{
    if (PyCallable_Check(g_obj_callback->on_dtmf_digit)) {
	char digit_str[10];

	PyGILState_STATE state = PyGILState_Ensure();

	pj_ansi_snprintf(digit_str, sizeof(digit_str), "%c", digit);

        PyObject_CallFunction(
	    g_obj_callback->on_dtmf_digit,
	    "is",
	    call_id,
	    digit_str,
	    NULL
	);

	PyGILState_Release(state);
    }
}


/*
 * Notify application on call being transfered.
 * !modified @061206
 */
static void cb_on_call_transfer_request(pjsua_call_id call_id,
				        const pj_str_t *dst,
				        pjsip_status_code *code)
{
    if (PyCallable_Check(g_obj_callback->on_call_transfer_request)) {
	PyObject *ret, *param_dst;
	int cd;

	ENTER_PYTHON();

	param_dst = PyString_FromPJ(dst);

        ret = PyObject_CallFunction(
		    g_obj_callback->on_call_transfer_request,
		    "iOi",
		    call_id,
		    param_dst,
		    *code,
		    NULL
		);

	Py_DECREF(param_dst);

	if (ret != NULL) {
	    if (ret != Py_None) {
		if (PyArg_Parse(ret,"i",&cd)) {
		    *code = cd;
		}
	    }
	    Py_DECREF(ret);
	}

	LEAVE_PYTHON();
    }
}


/*
 * Notify application of the status of previously sent call
 * transfer request. Application can monitor the status of the
 * call transfer request, for example to decide whether to 
 * terminate existing call.
 * !modified @061206
 */
static void cb_on_call_transfer_status( pjsua_call_id call_id,
					int status_code,
					const pj_str_t *status_text,
					pj_bool_t final,
					pj_bool_t *p_cont)
{
    if (PyCallable_Check(g_obj_callback->on_call_transfer_status)) {
	PyObject *ret, *param_reason;

	ENTER_PYTHON();

	param_reason = PyString_FromPJ(status_text);

        ret = PyObject_CallFunction(
		    g_obj_callback->on_call_transfer_status,
		    "iiOii",
		    call_id,
		    status_code,
		    param_reason,
		    final,
		    *p_cont,
		    NULL
		);

	Py_DECREF(param_reason);

	if (ret != NULL) {
	    if (ret != Py_None) {
		int cnt;
		if (PyArg_Parse(ret,"i",&cnt)) {
		    *p_cont = cnt;
		}
	    }
	    Py_DECREF(ret);
	}

	LEAVE_PYTHON();
    }
}


/*
 * Notify application about incoming INVITE with Replaces header.
 * Application may reject the request by setting non-2xx code.
 * !modified @061206
 */
static void cb_on_call_replace_request( pjsua_call_id call_id,
					pjsip_rx_data *rdata,
					int *st_code,
					pj_str_t *st_text)
{
    PJ_UNUSED_ARG(rdata);

    if (PyCallable_Check(g_obj_callback->on_call_replace_request)) {
	PyObject *ret, *param_reason, *param_rdata;
	int cd;

	ENTER_PYTHON();

	param_reason = PyString_FromPJ(st_text);
	param_rdata = Py_BuildValue("");

        ret = PyObject_CallFunction(
		    g_obj_callback->on_call_replace_request,
		    "iOiO",
		    call_id,
		    param_rdata,
		    *st_code,
		    param_reason,
		    NULL
		);

	Py_DECREF(param_rdata);
	Py_DECREF(param_reason);

	if (ret != NULL) {
	    if (ret != Py_None) {
		PyObject * txt;
		if (PyArg_ParseTuple(ret,"iO",&cd, &txt)) {
		    *st_code = cd;
		    *st_text = PyString_ToPJ(txt);
		}
	    }
	    Py_DECREF(ret);
	}

	LEAVE_PYTHON();
    }
}


/*
 * Notify application that an existing call has been replaced with
 * a new call. This happens when PJSUA-API receives incoming INVITE
 * request with Replaces header.
 */
static void cb_on_call_replaced(pjsua_call_id old_call_id,
				pjsua_call_id new_call_id)
{
    if (PyCallable_Check(g_obj_callback->on_call_replaced)) {
	ENTER_PYTHON();

        PyObject_CallFunction(
            g_obj_callback->on_call_replaced,
	    "ii",
	    old_call_id,
	    new_call_id,
	    NULL
        );

	LEAVE_PYTHON();
    }
}


/*
 * cb_on_reg_state
 * declares method on_reg_state for callback struct
 */
static void cb_on_reg_state(pjsua_acc_id acc_id)
{
    if (PyCallable_Check(g_obj_callback->on_reg_state)) {
	ENTER_PYTHON();

        PyObject_CallFunction(
	    g_obj_callback->on_reg_state,
	    "i",
	    acc_id,
	    NULL
	);

	LEAVE_PYTHON();
    }
}

/* 
 * cb_on_incoming_subscribe
 */
static void cb_on_incoming_subscribe( pjsua_acc_id acc_id,
				      pjsua_srv_pres *srv_pres,
				      pjsua_buddy_id buddy_id,
				      const pj_str_t *from,
				      pjsip_rx_data *rdata,
				      pjsip_status_code *code,
				      pj_str_t *reason,
				      pjsua_msg_data *msg_data)
{
    static char reason_buf[64];

    PJ_UNUSED_ARG(rdata);
    PJ_UNUSED_ARG(msg_data);

    if (PyCallable_Check(g_obj_callback->on_incoming_subscribe)) {
	PyObject *ret, *param_from, *param_contact, *param_srv_pres;
	pjsip_contact_hdr *contact_hdr;
	pj_pool_t *pool = NULL;

	ENTER_PYTHON();

	param_from = PyString_FromPJ(from);
	param_srv_pres = PyLong_FromLong((long)srv_pres);

	contact_hdr = (pjsip_contact_hdr*)
		      pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT,
					 NULL);
	if (contact_hdr) {
	    char *contact;
	    int len;

	    pool = pjsua_pool_create("pytmp", 512, 512);
	    contact = (char*) pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE+1);
	    len = pjsip_uri_print(PJSIP_URI_IN_CONTACT_HDR, contact_hdr->uri, 
				  contact, PJSIP_MAX_URL_SIZE);
	    if (len < 1)
		len = 0;
	    contact[len] = '\0';

	    param_contact = PyString_FromStringAndSize(contact, len);
	} else {
	    param_contact = Py_BuildValue("");
	}

        ret = PyObject_CallFunction(
		    g_obj_callback->on_incoming_subscribe,
		    "iiOOO",
		    acc_id,
		    buddy_id,
		    param_from,
		    param_contact,
		    param_srv_pres,
		    NULL
		);

	if (pool)
	    pj_pool_release(pool);

	Py_DECREF(param_from);
	Py_DECREF(param_contact);
	Py_DECREF(param_srv_pres);

	if (ret && PyTuple_Check(ret)) {
	    if (PyTuple_Size(ret) >= 1)
		*code = (int)PyInt_AsLong(PyTuple_GetItem(ret, 0));
	    if (PyTuple_Size(ret) >= 2) {
		if (PyTuple_GetItem(ret, 1) != Py_None) {
		    pj_str_t tmp;
		    tmp = PyString_ToPJ(PyTuple_GetItem(ret, 1));
		    reason->ptr = reason_buf;
		    pj_strncpy(reason, &tmp, sizeof(reason_buf));
		} else {
		    reason->slen = 0;
		}
	    }
	    Py_XDECREF(ret);
	} else if (ret) {
	    Py_XDECREF(ret);
	}

	LEAVE_PYTHON();
    }
}

/*
 * cb_on_buddy_state
 * declares method on_buddy state for callback struct
 */
static void cb_on_buddy_state(pjsua_buddy_id buddy_id)
{
    if (PyCallable_Check(g_obj_callback->on_buddy_state)) {
	ENTER_PYTHON();

        PyObject_CallFunction(
	    g_obj_callback->on_buddy_state,
	    "i",
	    buddy_id,
	    NULL
	);

	LEAVE_PYTHON();
    }
}

/*
 * cb_on_pager
 * 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,
                        const pj_str_t *mime_type, const pj_str_t *body,
			pjsip_rx_data *rdata, pjsua_acc_id acc_id)
{
    PJ_UNUSED_ARG(rdata);

    if (PyCallable_Check(g_obj_callback->on_pager)) {
	PyObject *param_from, *param_to, *param_contact, *param_mime_type,
		 *param_body;

	ENTER_PYTHON();

	param_from = PyString_FromPJ(from);
	param_to = PyString_FromPJ(to);
	param_contact = PyString_FromPJ(contact);
	param_mime_type = PyString_FromPJ(mime_type);
	param_body = PyString_FromPJ(body);

        PyObject_CallFunction(
		g_obj_callback->on_pager,
		"iOOOOOi",
		call_id,
		param_from,
		param_to,
		param_contact,
		param_mime_type,
		param_body, 
		acc_id,
		NULL
	    );

	Py_DECREF(param_body);
	Py_DECREF(param_mime_type);
	Py_DECREF(param_contact);
	Py_DECREF(param_to);
	Py_DECREF(param_from);

	LEAVE_PYTHON();
    }
}


/*
 * cb_on_pager_status
 * declares method on_pager_status for callback struct
 */
static void cb_on_pager_status(pjsua_call_id call_id, const pj_str_t *to,
                                const pj_str_t *body, void *user_data,
                                pjsip_status_code status,
                                const pj_str_t *reason,
				pjsip_tx_data *tdata,
				pjsip_rx_data *rdata,
				pjsua_acc_id acc_id)
{
    if (PyCallable_Check(g_obj_callback->on_pager)) {
	PyObject *param_call_id, *param_to, *param_body,
		 *param_user_data, *param_status, *param_reason,
		 *param_acc_id;

	ENTER_PYTHON();

	PJ_UNUSED_ARG(tdata);
	PJ_UNUSED_ARG(rdata);

        PyObject_CallFunctionObjArgs(
		g_obj_callback->on_pager_status,
		param_call_id	= Py_BuildValue("i",call_id),
		param_to	= PyString_FromPJ(to),
		param_body	= PyString_FromPJ(body), 
		param_user_data = Py_BuildValue("i", user_data),
		param_status	= Py_BuildValue("i",status),
		param_reason	= PyString_FromPJ(reason),
		param_acc_id	= Py_BuildValue("i",acc_id),
		NULL
	    );

	Py_DECREF(param_call_id);
	Py_DECREF(param_to);
	Py_DECREF(param_body);
	Py_DECREF(param_user_data);
	Py_DECREF(param_status);
	Py_DECREF(param_reason);
	Py_DECREF(param_acc_id);

	LEAVE_PYTHON();
    }
}


/*
 * cb_on_typing
 * declares method on_typing for callback struct
 */
static void cb_on_typing(pjsua_call_id call_id, const pj_str_t *from,
                            const pj_str_t *to, const pj_str_t *contact,
                            pj_bool_t is_typing, pjsip_rx_data *rdata,
			    pjsua_acc_id acc_id)
{
    if (PyCallable_Check(g_obj_callback->on_typing)) {
	PyObject *param_call_id, *param_from, *param_to, *param_contact,
		 *param_is_typing, *param_acc_id;

	ENTER_PYTHON();

	PJ_UNUSED_ARG(rdata);

        PyObject_CallFunctionObjArgs(
		g_obj_callback->on_typing,
		param_call_id	= Py_BuildValue("i",call_id),
		param_from	= PyString_FromPJ(from),
		param_to	= PyString_FromPJ(to),
		param_contact	= PyString_FromPJ(contact),
		param_is_typing = Py_BuildValue("i",is_typing),
		param_acc_id	= Py_BuildValue("i",acc_id),
		NULL
	    );

	Py_DECREF(param_call_id);
	Py_DECREF(param_from);
	Py_DECREF(param_to);
	Py_DECREF(param_contact);
	Py_DECREF(param_is_typing); 
	Py_DECREF(param_acc_id);

	LEAVE_PYTHON();
    }
}



/* 
 * translate_hdr
 * internal function 
 * translate from hdr_list to pjsip_generic_string_hdr
 */
void translate_hdr(pj_pool_t *pool, pjsip_hdr *hdr, PyObject *py_hdr_list)
{
    pj_list_init(hdr);

    if (PyList_Check(py_hdr_list)) {
	int 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_Size(tuple) >= 1)
		    hname = PyString_ToPJ(PyTuple_GetItem(tuple,0));
		else
		    hname.slen = 0;
		if (PyTuple_Size(tuple) >= 2)
		    hvalue = PyString_ToPJ(PyTuple_GetItem(tuple,1));
		else
		    hvalue.slen = 0;
            } else {
		hname.ptr = "";
		hname.slen = 0;
		hvalue.ptr = "";
		hvalue.slen = 0;
            }  
            new_hdr = pjsip_generic_string_hdr_create(pool, &hname, &hvalue);
            pj_list_push_back((pj_list_type *)hdr, (pj_list_type *)new_hdr);
	}     
    }
}

/*
 * py_pjsua_thread_register
 */
static PyObject *py_pjsua_thread_register(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;	
    const char *name;
    PyObject *py_desc;
    pj_thread_t *thread;
    struct py_thread_desc *thread_desc;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "sO", &name, &py_desc)) {
         return NULL;
    }
    thread_desc = (struct py_thread_desc*)
		  malloc(sizeof(struct py_thread_desc));
    thread_desc->next = py_thread_desc;
    py_thread_desc = thread_desc;

    status = pj_thread_register(name, thread_desc->desc, &thread);

    if (status == PJ_SUCCESS)
	status = pj_thread_local_set(g_thread_id, (void*)1);

    return Py_BuildValue("i",status);
}

/*
 * py_pjsua_logging_config_default
 */
static PyObject *py_pjsua_logging_config_default(PyObject *pSelf,
                                                 PyObject *pArgs)
{
    PyObj_pjsua_logging_config *obj;	
    pjsua_logging_config cfg;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    pjsua_logging_config_default(&cfg);
    obj = (PyObj_pjsua_logging_config*) 
	  PyObj_pjsua_logging_config_new(&PyTyp_pjsua_logging_config, 
					 NULL, NULL);
    PyObj_pjsua_logging_config_import(obj, &cfg);
    
    return (PyObject*)obj;
}


/*
 * py_pjsua_config_default
 */
static PyObject *py_pjsua_config_default(PyObject *pSelf, PyObject *pArgs)
{
    PyObj_pjsua_config *obj;
    pjsua_config cfg;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    pjsua_config_default(&cfg);
    obj = (PyObj_pjsua_config *) PyObj_pjsua_config_new(&PyTyp_pjsua_config, 
							NULL, NULL);
    PyObj_pjsua_config_import(obj, &cfg);

    return (PyObject*)obj;
}


/*
 * py_pjsua_media_config_default
 */
static PyObject * py_pjsua_media_config_default(PyObject *pSelf,
                                                PyObject *pArgs)
{
    PyObj_pjsua_media_config *obj;
    pjsua_media_config cfg;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    pjsua_media_config_default(&cfg);
    obj = (PyObj_pjsua_media_config *)
	  PyType_GenericNew(&PyTyp_pjsua_media_config, NULL, NULL);
    PyObj_pjsua_media_config_import(obj, &cfg);

    return (PyObject *)obj;
}


/*
 * py_pjsua_msg_data_init
 */
static PyObject *py_pjsua_msg_data_init(PyObject *pSelf, PyObject *pArgs)
{
    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    return (PyObject *)PyObj_pjsua_msg_data_new(&PyTyp_pjsua_msg_data, 
						NULL, NULL);
}


/*
 * py_pjsua_reconfigure_logging
 */
static PyObject *py_pjsua_reconfigure_logging(PyObject *pSelf, 
					      PyObject *pArgs)
{
    PyObject *logObj;
    pj_status_t status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "O", &logObj)) {
        return NULL;
    }

    if (logObj != Py_None) {
	PyObj_pjsua_logging_config *log;
	pjsua_logging_config cfg;

        log = (PyObj_pjsua_logging_config*)logObj;
        cfg.msg_logging = log->msg_logging;
        cfg.level = log->level;
        cfg.console_level = log->console_level;
        cfg.decor = log->decor;
        cfg.log_filename = PyString_ToPJ(log->log_filename);
        Py_XDECREF(g_obj_log_cb);
        g_obj_log_cb = log->cb;
        Py_INCREF(g_obj_log_cb);
        cfg.cb = &cb_log_cb;
        status = pjsua_reconfigure_logging(&cfg);
    } else {
        status = pjsua_reconfigure_logging(NULL);
    }

    return Py_BuildValue("i",status);
}


/*
 * py_pjsua_perror
 */
static PyObject *py_pjsua_perror(PyObject *pSelf, PyObject *pArgs)
{
    const char *sender;
    const char *title;
    pj_status_t status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ssi", &sender, &title, &status)) {
        return NULL;
    }
	
    pjsua_perror(sender, title, status);

    return Py_BuildValue("");
}


/*
 * py_pjsua_create
 */
static PyObject *py_pjsua_create(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    status = pjsua_create();
    
    if (status == PJ_SUCCESS)  {
	status = pj_thread_local_alloc(&g_thread_id);
	if (status == PJ_SUCCESS)
	    status = pj_thread_local_set(g_thread_id, (void*)1);

	pj_atexit(&clear_py_thread_desc);
    }

    return Py_BuildValue("i",status);
}


/*
 * py_pjsua_init
 */
static PyObject *py_pjsua_init(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    PyObject *o_ua_cfg, *o_log_cfg, *o_media_cfg;
    pjsua_config cfg_ua, *p_cfg_ua;
    pjsua_logging_config cfg_log, *p_cfg_log;
    pjsua_media_config cfg_media, *p_cfg_media;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "OOO", &o_ua_cfg, &o_log_cfg, &o_media_cfg)) {
        return NULL;
    }
    
    pjsua_config_default(&cfg_ua);
    pjsua_logging_config_default(&cfg_log);
    pjsua_media_config_default(&cfg_media);

    if (o_ua_cfg != Py_None) {
	PyObj_pjsua_config *obj_ua_cfg = (PyObj_pjsua_config*)o_ua_cfg;

	PyObj_pjsua_config_export(&cfg_ua, obj_ua_cfg);

	Py_XDECREF(g_obj_callback);
    	g_obj_callback = obj_ua_cfg->cb;
    	Py_INCREF(g_obj_callback);

    	cfg_ua.cb.on_call_state = &cb_on_call_state;
    	cfg_ua.cb.on_incoming_call = &cb_on_incoming_call;
    	cfg_ua.cb.on_call_media_state = &cb_on_call_media_state;
	cfg_ua.cb.on_dtmf_digit = &cb_on_dtmf_digit;
    	cfg_ua.cb.on_call_transfer_request = &cb_on_call_transfer_request;
    	cfg_ua.cb.on_call_transfer_status = &cb_on_call_transfer_status;
    	cfg_ua.cb.on_call_replace_request = &cb_on_call_replace_request;
    	cfg_ua.cb.on_call_replaced = &cb_on_call_replaced;
    	cfg_ua.cb.on_reg_state = &cb_on_reg_state;
	cfg_ua.cb.on_incoming_subscribe = &cb_on_incoming_subscribe;
    	cfg_ua.cb.on_buddy_state = &cb_on_buddy_state;
    	cfg_ua.cb.on_pager2 = &cb_on_pager;
    	cfg_ua.cb.on_pager_status2 = &cb_on_pager_status;
    	cfg_ua.cb.on_typing2 = &cb_on_typing;

        p_cfg_ua = &cfg_ua;

    } else {
        p_cfg_ua = NULL;
    }

    if (o_log_cfg != Py_None)  {
	PyObj_pjsua_logging_config * obj_log;

        obj_log = (PyObj_pjsua_logging_config *)o_log_cfg;
        
        PyObj_pjsua_logging_config_export(&cfg_log, obj_log);

        Py_XDECREF(g_obj_log_cb);
        g_obj_log_cb = obj_log->cb;
        Py_INCREF(g_obj_log_cb);

        cfg_log.cb = &cb_log_cb;
        p_cfg_log = &cfg_log;

    } else {
        p_cfg_log = NULL;
    }

    if (o_media_cfg != Py_None) {
	PyObj_pjsua_media_config_export(&cfg_media, 
				        (PyObj_pjsua_media_config*)o_media_cfg);
	p_cfg_media = &cfg_media;

    } else {
        p_cfg_media = NULL;
    }

    status = pjsua_init(p_cfg_ua, p_cfg_log, p_cfg_media);

    return Py_BuildValue("i", status);
}


/*
 * py_pjsua_start
 */
static PyObject *py_pjsua_start(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    status = pjsua_start();
    
    return Py_BuildValue("i", status);
}


/*
 * py_pjsua_destroy
 */
static PyObject *py_pjsua_destroy(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    status = pjsua_destroy();
    
    return Py_BuildValue("i", status);
}


/*
 * py_pjsua_handle_events
 */
static PyObject *py_pjsua_handle_events(PyObject *pSelf, PyObject *pArgs)
{
    int ret;
    int msec;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &msec)) {
        return NULL;
    }

    if (msec < 0)
	msec = 0;

#if !NO_PJSIP_THREAD
    /* Since handle_events() will block, we must wrap it with ALLOW_THREADS
     * construct, or otherwise many Python blocking functions (such as
     * time.sleep(), readline(), etc.) may hang/block indefinitely.
     * See http://www.python.org/doc/current/api/threads.html for more info.
     */
    Py_BEGIN_ALLOW_THREADS
#endif

    ret = pjsua_handle_events(msec);

#if !NO_PJSIP_THREAD
    Py_END_ALLOW_THREADS
#endif
    
    return Py_BuildValue("i", ret);
}


/*
 * py_pjsua_verify_sip_url
 */
static PyObject *py_pjsua_verify_sip_url(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    const char *url;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "s", &url)) {
        return NULL;
    }

    status = pjsua_verify_sip_url(url);
    
    return Py_BuildValue("i", status);
}


/*
 * function doc
 */

static char pjsua_thread_register_doc[] =
    "int _pjsua.thread_register(string name, int[] desc)";
static char pjsua_perror_doc[] =
    "void _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.";

static char pjsua_create_doc[] =
    "int _pjsua.create (void) "
    "Instantiate pjsua application. Application "
    "must call this function before calling any other functions, to make sure "
    "that the underlying libraries are properly initialized. Once this "
    "function has returned success, application must call pjsua_destroy() "
    "before quitting.";

static char pjsua_init_doc[] =
    "int _pjsua.init (_pjsua.Config obj_ua_cfg, "
        "_pjsua.Logging_Config log_cfg, _pjsua.Media_Config media_cfg) "
    "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: "
    "obj_ua_cfg : User agent configuration;  "
    "log_cfg : Optional logging configuration; "
    "media_cfg : Optional media configuration.";

static char pjsua_start_doc[] =
    "int _pjsua.start (void) "
    "Application is recommended to call this function after all "
    "initialization is done, so that the library can do additional checking "
    "set up additional";

static char pjsua_destroy_doc[] =
    "int _pjsua.destroy (void) "
    "Destroy pjsua This function must be called once PJSUA is created. To "
    "make it easier for application, application may call this function "
    "several times with no danger.";

static char pjsua_handle_events_doc[] =
    "int _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. "
    "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).";

static char pjsua_verify_sip_url_doc[] =
    "int _pjsua.verify_sip_url (string c_url) "
    "Verify that valid SIP url is given Parameters: "
    "c_url: The URL, as NULL terminated string.";

static char pjsua_reconfigure_logging_doc[] =
    "int _pjsua.reconfigure_logging (_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.";

static char pjsua_logging_config_default_doc[] =
    "_pjsua.Logging_Config _pjsua.logging_config_default  ()  "
    "Use this function to initialize logging config.";

static char pjsua_config_default_doc[] =
    "_pjsua.Config _pjsua.config_default (). Use this function to "
    "initialize pjsua config. ";

static char pjsua_media_config_default_doc[] =
    "_pjsua.Media_Config _pjsua.media_config_default (). "
    "Use this function to initialize media config.";

static char pjsua_msg_data_init_doc[] =
    "_pjsua.Msg_Data void _pjsua.msg_data_init () "
    "Initialize message data ";
        

/* END OF LIB BASE */

/* LIB TRANSPORT */

/*
 * py_pjsua_transport_config_default
 */
static PyObject *py_pjsua_transport_config_default(PyObject *pSelf, 
						   PyObject *pArgs)
{
    PyObj_pjsua_transport_config *obj;
    pjsua_transport_config cfg;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    pjsua_transport_config_default(&cfg);
    obj = (PyObj_pjsua_transport_config*)
	  PyObj_pjsua_transport_config_new(&PyTyp_pjsua_transport_config,
					   NULL, NULL);
    PyObj_pjsua_transport_config_import(obj, &cfg);

    return (PyObject *)obj;
}

/*
 * py_pjsua_transport_create
 */
static PyObject *py_pjsua_transport_create(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    int type;
    PyObject *pCfg;
    pjsua_transport_config cfg;
    pjsua_transport_id id;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iO", &type, &pCfg)) {
        return NULL;
    }

    if (pCfg != Py_None) {
	PyObj_pjsua_transport_config *obj;

        obj = (PyObj_pjsua_transport_config*)pCfg;
	PyObj_pjsua_transport_config_export(&cfg, obj);
        status = pjsua_transport_create(type, &cfg, &id);
    } else {
        status = pjsua_transport_create(type, NULL, &id);
    }
    
    
    return Py_BuildValue("ii", status, id);
}

/*
 * py_pjsua_enum_transports
 */
static PyObject *py_pjsua_enum_transports(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    PyObject *list;
    pjsua_transport_id id[PJSIP_MAX_TRANSPORTS];
    unsigned c, i;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    c = PJ_ARRAY_SIZE(id);
    status = pjsua_enum_transports(id, &c);
    
    list = PyList_New(c);
    for (i = 0; i < c; i++) {     
        PyList_SetItem(list, i, Py_BuildValue("i", id[i]));
    }
    
    return (PyObject*)list;
}

/*
 * py_pjsua_transport_get_info
 * !modified @ 051206
 */
static PyObject *py_pjsua_transport_get_info(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    int id;
    pjsua_transport_info info;
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &id)) {
        return NULL;
    }	
    
    status = pjsua_transport_get_info(id, &info);	
    if (status == PJ_SUCCESS) {
	PyObj_pjsua_transport_info *obj;
        obj = (PyObj_pjsua_transport_info *) 
	      PyObj_pjsua_transport_info_new(&PyTyp_pjsua_transport_info, 
					     NULL, NULL);
	PyObj_pjsua_transport_info_import(obj, &info);
        return (PyObject*)obj;
    } else {
        return Py_BuildValue("");
    }
}

/*
 * py_pjsua_transport_set_enable
 */
static PyObject *py_pjsua_transport_set_enable(PyObject *pSelf, 
					       PyObject *pArgs)
{
    pj_status_t status;
    int id;
    int enabled;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &id, &enabled)) {
        return NULL;
    }
    status = pjsua_transport_set_enable(id, enabled);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_transport_close
 */
static PyObject *py_pjsua_transport_close(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    int id;
    int force;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &id, &force)) {
        return NULL;
    }	
    status = pjsua_transport_close(id, force);	
    
    return Py_BuildValue("i", status);
}

static char pjsua_transport_config_default_doc[] =
    "_pjsua.Transport_Config _pjsua.transport_config_default () "
    "Call this function to initialize UDP config with default values.";
static char pjsua_transport_create_doc[] =
    "int, int _pjsua.transport_create (int type, "
    "_pjsua.Transport_Config cfg) "
    "Create SIP transport.";
static char pjsua_enum_transports_doc[] =
    "int[] _pjsua.enum_transports () "
    "Enumerate all transports currently created in the system.";
static char pjsua_transport_get_info_doc[] =
    "void _pjsua.transport_get_info "
    "(_pjsua.Transport_ID id, _pjsua.Transport_Info info) "
    "Get information about transports.";
static char pjsua_transport_set_enable_doc[] =
    "void _pjsua.transport_set_enable "
    "(_pjsua.Transport_ID id, int enabled) "
    "Disable a transport or re-enable it. "
    "By default transport is always enabled after it is created. "
    "Disabling a transport does not necessarily close the socket, "
    "it will only discard incoming messages and prevent the transport "
    "from being used to send outgoing messages.";
static char pjsua_transport_close_doc[] =
    "void _pjsua.transport_close (_pjsua.Transport_ID id, int force) "
    "Close the transport. If transport is forcefully closed, "
    "it will be immediately closed, and any pending transactions "
    "that are using the transport may not terminate properly. "
    "Otherwise, the system will wait until all transactions are closed "
    "while preventing new users from using the transport, and will close "
    "the transport when it is safe to do so.";

/* END OF LIB TRANSPORT */

/* LIB ACCOUNT */


/*
 * py_pjsua_acc_config_default
 */
static PyObject *py_pjsua_acc_config_default(PyObject *pSelf, PyObject *pArgs)
{
    PyObj_pjsua_acc_config *obj;
    pjsua_acc_config cfg;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    if (!PyArg_ParseTuple(pArgs, "")) {
        return NULL;
    }

    pjsua_acc_config_default(&cfg);
    obj = (PyObj_pjsua_acc_config *)
	  PyObj_pjsua_acc_config_new(&PyTyp_pjsua_acc_config, 
				     NULL, NULL);
    PyObj_pjsua_acc_config_import(obj, &cfg);
    return (PyObject *)obj;
}

/*
 * py_pjsua_acc_get_count
 */
static PyObject *py_pjsua_acc_get_count(PyObject *pSelf, PyObject *pArgs)
{
    int count;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    count = pjsua_acc_get_count();
    return Py_BuildValue("i", count);
}

/*
 * py_pjsua_acc_is_valid
 */
static PyObject *py_pjsua_acc_is_valid(PyObject *pSelf, PyObject *pArgs)
{    
    int id;
    int is_valid;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &id)) {
        return NULL;
    }

    is_valid = pjsua_acc_is_valid(id);	
    return Py_BuildValue("i", is_valid);
}

/*
 * py_pjsua_acc_set_default
 */
static PyObject *py_pjsua_acc_set_default(PyObject *pSelf, PyObject *pArgs)
{    
    int id;
    int status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &id)) {
        return NULL;
    }
    status = pjsua_acc_set_default(id);
	
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_acc_get_default
 */
static PyObject *py_pjsua_acc_get_default(PyObject *pSelf, PyObject *pArgs)
{    
    int id;
	
    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    id = pjsua_acc_get_default();
	
    return Py_BuildValue("i", id);
}

/*
 * py_pjsua_acc_add
 */
static PyObject *py_pjsua_acc_add(PyObject *pSelf, PyObject *pArgs)
{    
    int is_default;
    PyObject *pCfg;
    int acc_id;
    int status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "Oi", &pCfg, &is_default)) {
        return NULL;
    }
    
    if (pCfg != Py_None) {
	pjsua_acc_config cfg;
	PyObj_pjsua_acc_config *ac;

	pjsua_acc_config_default(&cfg);
        ac = (PyObj_pjsua_acc_config *)pCfg;
        PyObj_pjsua_acc_config_export(&cfg, ac);
        status = pjsua_acc_add(&cfg, is_default, &acc_id);
    } else {
        status = PJ_EINVAL;
	acc_id = PJSUA_INVALID_ID;
    }
    
    return Py_BuildValue("ii", status, acc_id);
}

/*
 * py_pjsua_acc_add_local
 */
static PyObject *py_pjsua_acc_add_local(PyObject *pSelf, PyObject *pArgs)
{    
    int is_default;
    int tid;
    int acc_id;
    int status;
	
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &tid, &is_default)) {
        return NULL;
    }
	
    status = pjsua_acc_add_local(tid, is_default, &acc_id);
    
    return Py_BuildValue("ii", status, acc_id);
}

/*
 * py_pjsua_acc_set_user_data
 */
static PyObject *py_pjsua_acc_set_user_data(PyObject *pSelf, PyObject *pArgs)
{    
    int acc_id;
    PyObject *pUserData, *old_user_data;
    int status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iO", &acc_id, &pUserData)) {
        return NULL;
    }

    old_user_data = (PyObject*) pjsua_acc_get_user_data(acc_id);

    status = pjsua_acc_set_user_data(acc_id, (void*)pUserData);

    if (status == PJ_SUCCESS) {
	Py_XINCREF(pUserData);
	Py_XDECREF(old_user_data);
    }

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_acc_get_user_data
 */
static PyObject *py_pjsua_acc_get_user_data(PyObject *pSelf, PyObject *pArgs)
{    
    int acc_id;
    PyObject *user_data;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &acc_id)) {
        return NULL;
    }

    user_data = (PyObject*) pjsua_acc_get_user_data(acc_id);

    return user_data ? Py_BuildValue("O", user_data) : Py_BuildValue("");
}

/*
 * py_pjsua_acc_del
 */
static PyObject *py_pjsua_acc_del(PyObject *pSelf, PyObject *pArgs)
{    
    int acc_id;
    PyObject *user_data;
    int status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &acc_id)) {
        return NULL;
    }

    user_data = (PyObject*) pjsua_acc_get_user_data(acc_id);
    Py_XDECREF(user_data);

    status = pjsua_acc_del(acc_id);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_acc_modify
 */
static PyObject *py_pjsua_acc_modify(PyObject *pSelf, PyObject *pArgs)
{    	
    PyObject *pCfg;
    PyObj_pjsua_acc_config * ac;
    int acc_id;
    int status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iO", &acc_id, &pCfg)) {
        return NULL;
    }

    if (pCfg != Py_None) {
	pjsua_acc_config cfg;	

	pjsua_acc_config_default(&cfg);
        ac = (PyObj_pjsua_acc_config*)pCfg;
        PyObj_pjsua_acc_config_export(&cfg, ac);

        status = pjsua_acc_modify(acc_id, &cfg);
    } else {
        status = PJ_EINVAL;
    }
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_acc_set_online_status
 */
static PyObject *py_pjsua_acc_set_online_status(PyObject *pSelf, 
						PyObject *pArgs)
{    
    int is_online;	
    int acc_id;
    int status;	

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &acc_id, &is_online)) {
        return NULL;
    }
	
    status = pjsua_acc_set_online_status(acc_id, is_online);
	
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_acc_set_online_status2
 */
static PyObject *py_pjsua_acc_set_online_status2(PyObject *pSelf, 
						 PyObject *pArgs)
{    
    int is_online;	
    int acc_id;
    int activity_id;
    const char *activity_text = NULL;
    const char *rpid_id = NULL;
    pjrpid_element rpid;
    pj_status_t status;	

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iiiss", &acc_id, &is_online,
			  &activity_id, &activity_text, &rpid_id)) 
    {
        return NULL;
    }

    pj_bzero(&rpid, sizeof(rpid));
    rpid.type = PJRPID_ELEMENT_TYPE_PERSON;
    rpid.activity = activity_id;
    if (activity_text)
	rpid.note = pj_str((char*)activity_text);

    if (rpid_id)
	rpid.id = pj_str((char*)rpid_id);

    status = pjsua_acc_set_online_status2(acc_id, is_online, &rpid);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_acc_set_registration
 */
static PyObject *py_pjsua_acc_set_registration(PyObject *pSelf, 
					       PyObject *pArgs)
{    
    int renew;	
    int acc_id;
    int status;	

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &acc_id, &renew)) {
        return NULL;
    }
	
    status = pjsua_acc_set_registration(acc_id, renew);
	
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_acc_get_info
 */
static PyObject *py_pjsua_acc_get_info(PyObject *pSelf, PyObject *pArgs)
{    	
    int acc_id;
    PyObj_pjsua_acc_info * obj;
    pjsua_acc_info info;
    int status;	

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &acc_id)) {
        return NULL;
    }
    
    status = pjsua_acc_get_info(acc_id, &info);
    if (status == PJ_SUCCESS) {
	obj = (PyObj_pjsua_acc_info*)
	      PyObj_pjsua_acc_info_new(&PyTyp_pjsua_acc_info, NULL, NULL);
	PyObj_pjsua_acc_info_import(obj, &info);
        return (PyObject*)obj;
    } else {
	return Py_BuildValue("");
    }
}

/*
 * py_pjsua_enum_accs
 */
static PyObject *py_pjsua_enum_accs(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    PyObject *list;
    pjsua_acc_id id[PJSUA_MAX_ACC];
    unsigned c, i;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    c = PJ_ARRAY_SIZE(id);
    status = pjsua_enum_accs(id, &c);
    if (status != PJ_SUCCESS)
	c = 0;
    
    list = PyList_New(c);
    for (i = 0; i < c; i++) {
        PyList_SetItem(list, i, Py_BuildValue("i", id[i]));
    }
    
    return (PyObject*)list;
}

/*
 * py_pjsua_acc_enum_info
 */
static PyObject *py_pjsua_acc_enum_info(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    PyObject *list;
    pjsua_acc_info info[PJSUA_MAX_ACC];
    unsigned c, i;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    if (!PyArg_ParseTuple(pArgs, "")) {
        return NULL;
    }	
    
    c = PJ_ARRAY_SIZE(info);
    status = pjsua_acc_enum_info(info, &c);
    if (status != PJ_SUCCESS)
	c = 0;

    list = PyList_New(c);
    for (i = 0; i < c; i++) {
        PyObj_pjsua_acc_info *obj;
        obj = (PyObj_pjsua_acc_info *)
	      PyObj_pjsua_acc_info_new(&PyTyp_pjsua_acc_info, NULL, NULL);

	PyObj_pjsua_acc_info_import(obj, &info[i]);

        PyList_SetItem(list, i, (PyObject*)obj);
    }
    
    return (PyObject*)list;
}

/*
 * py_pjsua_acc_set_transport
 */
static PyObject *py_pjsua_acc_set_transport(PyObject *pSelf, PyObject *pArgs)
{    	
    int acc_id, transport_id;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &acc_id, &transport_id)) {
        return NULL;
    }	
    
    status = pjsua_acc_set_transport(acc_id, transport_id);
    
    
    return Py_BuildValue("i", status);
}


/*
 * py_pjsua_acc_pres_notify
 */
static PyObject *py_pjsua_acc_pres_notify(PyObject *pSelf, 
					  PyObject *pArgs)
{
    int acc_id, state;
    PyObject *arg_pres, *arg_msg_data, *arg_reason;
    void *srv_pres;
    pjsua_msg_data msg_data;
    pj_str_t reason;
    pj_bool_t with_body;
    pj_pool_t *pool = NULL;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iOiOO", &acc_id, &arg_pres, 
			  &state, &arg_reason, &arg_msg_data))
    {
        return NULL;
    }	
    
    srv_pres = (void*) PyLong_AsLong(arg_pres);
    with_body = (state != PJSIP_EVSUB_STATE_TERMINATED);

    if (arg_reason && PyString_Check(arg_reason)) {
	reason = PyString_ToPJ(arg_reason);
    } else {
	reason = pj_str("");
    }

    pjsua_msg_data_init(&msg_data);
    if (arg_msg_data && arg_msg_data != Py_None) {
        PyObj_pjsua_msg_data *omd = (PyObj_pjsua_msg_data *)arg_msg_data;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", POOL_SIZE, POOL_SIZE);
        translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
    }

    status = pjsua_pres_notify(acc_id, (pjsua_srv_pres*)srv_pres,
			       (pjsip_evsub_state)state, NULL,
			       &reason, with_body, &msg_data);
    
    if (pool) {
	pj_pool_release(pool);
    }

    return Py_BuildValue("i", status);
}

static char pjsua_acc_config_default_doc[] =
    "_pjsua.Acc_Config _pjsua.acc_config_default () "
    "Call this function to initialize account config with default values.";
static char pjsua_acc_get_count_doc[] =
    "int _pjsua.acc_get_count () "
    "Get number of current accounts.";
static char pjsua_acc_is_valid_doc[] =
    "int _pjsua.acc_is_valid (int acc_id)  "
    "Check if the specified account ID is valid.";
static char pjsua_acc_set_default_doc[] =
    "int _pjsua.acc_set_default (int acc_id) "
    "Set default account to be used when incoming "
    "and outgoing requests doesn't match any accounts.";
static char pjsua_acc_get_default_doc[] =
    "int _pjsua.acc_get_default () "
    "Get default account.";
static char pjsua_acc_add_doc[] =
    "int, int _pjsua.acc_add (_pjsua.Acc_Config cfg, "
    "int is_default) "
    "Add a new account to pjsua. PJSUA must have been initialized "
    "(with pjsua_init()) before calling this function.";
static char pjsua_acc_add_local_doc[] =
    "int,int _pjsua.acc_add_local (int tid, "
    "int is_default) "
    "Add a local account. A local account is used to identify "
    "local endpoint instead of a specific user, and for this reason, "
    "a transport ID is needed to obtain the local address information.";
static char pjsua_acc_del_doc[] =
    "int _pjsua.acc_del (int acc_id) "
    "Delete account.";
static char pjsua_acc_modify_doc[] =
    "int _pjsua.acc_modify (int acc_id, _pjsua.Acc_Config cfg) "
    "Modify account information.";
static char pjsua_acc_set_online_status_doc[] =
    "int _pjsua.acc_set_online_status2(int acc_id, int is_online) "
    "Modify account's presence status to be advertised "
    "to remote/presence subscribers.";
static char pjsua_acc_set_online_status2_doc[] =
    "int _pjsua.acc_set_online_status (int acc_id, int is_online, "
                                         "int activity_id, string activity_text) "
    "Modify account's presence status to be advertised "
    "to remote/presence subscribers.";
static char pjsua_acc_set_registration_doc[] =
    "int _pjsua.acc_set_registration (int acc_id, int renew) "
    "Update registration or perform unregistration.";
static char pjsua_acc_get_info_doc[] =
    "_pjsua.Acc_Info _pjsua.acc_get_info (int acc_id) "
    "Get account information.";
static char pjsua_enum_accs_doc[] =
    "int[] _pjsua.enum_accs () "
    "Enum accounts all account ids.";
static char pjsua_acc_enum_info_doc[] =
    "_pjsua.Acc_Info[] _pjsua.acc_enum_info () "
    "Enum accounts info.";

/* END OF LIB ACCOUNT */

/* LIB BUDDY */



/*
 * py_pjsua_buddy_config_default
 */
static PyObject *py_pjsua_buddy_config_default(PyObject *pSelf, 
					       PyObject *pArgs)
{    
    PyObj_pjsua_buddy_config *obj;	
    pjsua_buddy_config cfg;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    pjsua_buddy_config_default(&cfg);
    obj = (PyObj_pjsua_buddy_config *) 
	  PyObj_pjsua_buddy_config_new(&PyTyp_pjsua_buddy_config, NULL, NULL);
    PyObj_pjsua_buddy_config_import(obj, &cfg);
    
    return (PyObject *)obj;
}

/*
 * py_pjsua_get_buddy_count
 */
static PyObject *py_pjsua_get_buddy_count(PyObject *pSelf, PyObject *pArgs)
{    
    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    return Py_BuildValue("i", pjsua_get_buddy_count());
}

/*
 * py_pjsua_buddy_is_valid
 */
static PyObject *py_pjsua_buddy_is_valid(PyObject *pSelf, PyObject *pArgs)
{    
    int id;
    int is_valid;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &id)) {
        return NULL;
    }
    is_valid = pjsua_buddy_is_valid(id);
	
    return Py_BuildValue("i", is_valid);
}

/*
 * py_pjsua_enum_buddies
 */
static PyObject *py_pjsua_enum_buddies(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    PyObject *list;
    pjsua_buddy_id id[PJSUA_MAX_BUDDIES];
    unsigned c, i;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    c = PJ_ARRAY_SIZE(id);
    status = pjsua_enum_buddies(id, &c);
    if (status != PJ_SUCCESS)
	c = 0;

    list = PyList_New(c);
    for (i = 0; i < c; i++) {
        PyList_SetItem(list, i, Py_BuildValue("i", id[i]));
    }
    
    return (PyObject*)list;
}

/*
 * py_pjsua_buddy_find
 */
static PyObject *py_pjsua_buddy_find(PyObject *pSelf, PyObject *pArgs)
{    
    PyObject *pURI;
    pj_str_t uri;
    pjsua_buddy_id buddy_id;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "O", &pURI)) {
        return NULL;
    }

    if (!PyString_Check(pURI))
	return Py_BuildValue("i", PJSUA_INVALID_ID);

    uri = PyString_ToPJ(pURI);
    buddy_id = pjsua_buddy_find(&uri);

    return Py_BuildValue("i", buddy_id);
}

/*
 * py_pjsua_buddy_get_info
 */
static PyObject *py_pjsua_buddy_get_info(PyObject *pSelf, PyObject *pArgs)
{    	
    int buddy_id;
    pjsua_buddy_info info;
    int status;	

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &buddy_id)) {
        return NULL;
    }

    status = pjsua_buddy_get_info(buddy_id, &info);
    if (status == PJ_SUCCESS) {
	PyObj_pjsua_buddy_info *obj;

	obj = (PyObj_pjsua_buddy_info *)
	      PyObj_pjsua_buddy_config_new(&PyTyp_pjsua_buddy_info, 
					   NULL, NULL);
	PyObj_pjsua_buddy_info_import(obj, &info);	
        return (PyObject*)obj;
    } else {
	return Py_BuildValue("");
    }
}

/*
 * py_pjsua_buddy_add
 */
static PyObject *py_pjsua_buddy_add(PyObject *pSelf, PyObject *pArgs)
{   
    PyObject *pCfg;
    int buddy_id;
    int status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "O", &pCfg)) {
        return NULL;
    }

    if (pCfg != Py_None) {
	pjsua_buddy_config cfg;
	PyObj_pjsua_buddy_config *bc;

        bc = (PyObj_pjsua_buddy_config *)pCfg;

	pjsua_buddy_config_default(&cfg);
        PyObj_pjsua_buddy_config_export(&cfg, bc);  
    
        status = pjsua_buddy_add(&cfg, &buddy_id);

    } else {
        status = PJ_EINVAL;
	buddy_id = PJSUA_INVALID_ID;
    }
    return Py_BuildValue("ii", status, buddy_id);
}

/*
 * py_pjsua_buddy_del
 */
static PyObject *py_pjsua_buddy_del(PyObject *pSelf, PyObject *pArgs)
{    
    int buddy_id;
    int status;
    PyObject *user_data;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &buddy_id)) {
        return NULL;
    }

    user_data = (PyObject*) pjsua_buddy_get_user_data(buddy_id);
    Py_XDECREF(user_data);

    status = pjsua_buddy_del(buddy_id);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_buddy_set_user_data
 */
static PyObject *py_pjsua_buddy_set_user_data(PyObject *pSelf, PyObject *pArgs)
{    
    int buddy_id;
    int status;
    PyObject *user_data, *old_user_data;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iO", &buddy_id, &user_data)) {
        return NULL;
    }

    old_user_data = (PyObject*) pjsua_buddy_get_user_data(buddy_id);

    status = pjsua_buddy_set_user_data(buddy_id, (void*)user_data);

    if (status == PJ_SUCCESS) {
	Py_XINCREF(user_data);
	Py_XDECREF(old_user_data);
    }

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_buddy_get_user_data
 */
static PyObject *py_pjsua_buddy_get_user_data(PyObject *pSelf, PyObject *pArgs)
{    
    int buddy_id;
    PyObject *user_data;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &buddy_id)) {
        return NULL;
    }

    user_data = (PyObject*) pjsua_buddy_get_user_data(buddy_id);

    return user_data? Py_BuildValue("O", user_data) : Py_BuildValue("");
}

/*
 * py_pjsua_buddy_subscribe_pres
 */
static PyObject *py_pjsua_buddy_subscribe_pres(PyObject *pSelf, 
					       PyObject *pArgs)
{
    int buddy_id;
    int status;
    int subscribe;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &buddy_id, &subscribe)) {
        return NULL;
    }

    status = pjsua_buddy_subscribe_pres(buddy_id, subscribe);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_pres_dump
 */
static PyObject *py_pjsua_pres_dump(PyObject *pSelf, PyObject *pArgs)
{    
    int verbose;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &verbose)) {
        return NULL;
    }

    pjsua_pres_dump(verbose);	

    return Py_BuildValue("");
}

/*
 * py_pjsua_im_send
 */
static PyObject *py_pjsua_im_send(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int acc_id;
    pj_str_t *mime_type, tmp_mime_type;
    pj_str_t to, content;
    PyObject *pTo;
    PyObject *pMimeType;
    PyObject *pContent;
    pjsua_msg_data msg_data;
    PyObject *pMsgData;
    int user_data;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iOOOOi", &acc_id, 
		&pTo, &pMimeType, &pContent, &pMsgData, &user_data))
    {
        return NULL;
    }

    if (pMimeType != Py_None) {
        mime_type = &tmp_mime_type;
	tmp_mime_type = PyString_ToPJ(pMimeType);
    } else {
        mime_type = NULL;
    }

    to = PyString_ToPJ(pTo);
    content = PyString_ToPJ(pContent);

    if (pMsgData != Py_None) {
	PyObj_pjsua_msg_data *omd;

        omd = (PyObj_pjsua_msg_data *)pMsgData;
	msg_data.content_type = PyString_ToPJ(omd->content_type);
	msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", 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, (void *)user_data);
    if (pool)
	pj_pool_release(pool);
    
    return Py_BuildValue("i",status);
}

/*
 * py_pjsua_im_typing
 */
static PyObject *py_pjsua_im_typing(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int acc_id;
    pj_str_t to;
    PyObject *pTo;
    int is_typing;
    pjsua_msg_data msg_data;
    PyObject *pMsgData;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iOiO", &acc_id, &pTo, &is_typing, 
			  &pMsgData)) 
    {
        return NULL;
    }
	
    to = PyString_ToPJ(pTo);

    if (pMsgData != Py_None) {
	PyObj_pjsua_msg_data *omd;

        omd = (PyObj_pjsua_msg_data *)pMsgData;
	msg_data.content_type = PyString_ToPJ(omd->content_type);
	msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", 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);

    if (pool)
	pj_pool_release(pool);

    return Py_BuildValue("i", status);
}

static char pjsua_buddy_config_default_doc[] =
    "_pjsua.Buddy_Config _pjsua.buddy_config_default () "
    "Set default values to the buddy config.";
static char pjsua_get_buddy_count_doc[] =
    "int _pjsua.get_buddy_count () "
    "Get total number of buddies.";
static char pjsua_buddy_is_valid_doc[] =
    "int _pjsua.buddy_is_valid (int buddy_id) "
    "Check if buddy ID is valid.";
static char pjsua_enum_buddies_doc[] =
    "int[] _pjsua.enum_buddies () "
    "Enum buddy IDs.";
static char pjsua_buddy_get_info_doc[] =
    "_pjsua.Buddy_Info _pjsua.buddy_get_info (int buddy_id) "
    "Get detailed buddy info.";
static char pjsua_buddy_add_doc[] =
    "int,int _pjsua.buddy_add (_pjsua.Buddy_Config cfg) "
    "Add new buddy.";
static char pjsua_buddy_del_doc[] =
    "int _pjsua.buddy_del (int buddy_id) "
    "Delete buddy.";
static char pjsua_buddy_subscribe_pres_doc[] =
    "int _pjsua.buddy_subscribe_pres (int buddy_id, int subscribe) "
    "Enable/disable buddy's presence monitoring.";
static char pjsua_pres_dump_doc[] =
    "void _pjsua.pres_dump (int verbose) "
    "Dump presence subscriptions to log file.";
static char pjsua_im_send_doc[] =
    "int _pjsua.im_send (int acc_id, string to, string mime_type, "
    "string content, _pjsua.Msg_Data msg_data, int user_data) "
    "Send instant messaging outside dialog, using the specified account "
    "for route set and authentication.";
static char pjsua_im_typing_doc[] =
    "int _pjsua.im_typing (int acc_id, string to, int is_typing, "
    "_pjsua.Msg_Data msg_data) "
    "Send typing indication outside dialog.";

/* END OF LIB BUDDY */

/* LIB MEDIA */


/*
 * py_pjsua_conf_get_max_ports
 */
static PyObject *py_pjsua_conf_get_max_ports(PyObject *pSelf, PyObject *pArgs)
{    
    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    return Py_BuildValue("i", pjsua_conf_get_max_ports());
}

/*
 * py_pjsua_conf_get_active_ports
 */
static PyObject *py_pjsua_conf_get_active_ports(PyObject *pSelf, 
						PyObject *pArgs)
{    
    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    return Py_BuildValue("i", pjsua_conf_get_active_ports());
}

/*
 * py_pjsua_enum_conf_ports
 */
static PyObject *py_pjsua_enum_conf_ports(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    PyObject *list;
    pjsua_conf_port_id id[PJSUA_MAX_CONF_PORTS];
    unsigned c, i;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    c = PJ_ARRAY_SIZE(id);
    status = pjsua_enum_conf_ports(id, &c);
    if (status != PJ_SUCCESS)
	c = 0;
    
    list = PyList_New(c);
    for (i = 0; i < c; i++) {
        PyList_SetItem(list, i, Py_BuildValue("i", id[i]));
    }
    
    return (PyObject*)list;
}

/*
 * py_pjsua_conf_get_port_info
 */
static PyObject *py_pjsua_conf_get_port_info(PyObject *pSelf, PyObject *pArgs)
{    	
    int id;
    PyObj_pjsua_conf_port_info *ret;
    pjsua_conf_port_info info;
    int status;	
    unsigned i;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &id)) {
        return NULL;
    }
    
    status = pjsua_conf_get_port_info(id, &info);
    ret = (PyObj_pjsua_conf_port_info *)
	  conf_port_info_new(&PyTyp_pjsua_conf_port_info, NULL, NULL);
    ret->bits_per_sample = info.bits_per_sample;
    ret->channel_count = info.bits_per_sample;
    ret->clock_rate = info.clock_rate;
    ret->name = PyString_FromPJ(&info.name);
    ret->samples_per_frame = info.samples_per_frame;
    ret->slot_id = info.slot_id;
    Py_XDECREF(ret->listeners);
    ret->listeners = PyList_New(info.listener_cnt);
    for (i = 0; i < info.listener_cnt; i++) {
	PyObject *item = Py_BuildValue("i",info.listeners[i]);
	PyList_SetItem(ret->listeners, i, item);
    }
    return (PyObject*)ret;
}

/*
 * py_pjsua_conf_remove_port
 */
static PyObject *py_pjsua_conf_remove_port(PyObject *pSelf, PyObject *pArgs)
{    	
    int id;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &id)) {
        return NULL;
    }	
    
    status = pjsua_conf_remove_port(id);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_conf_connect
 */
static PyObject *py_pjsua_conf_connect(PyObject *pSelf, PyObject *pArgs)
{    	
    int source, sink;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &source, &sink)) {
        return NULL;
    }	
    
    status = pjsua_conf_connect(source, sink);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_conf_disconnect
 */
static PyObject *py_pjsua_conf_disconnect(PyObject *pSelf, PyObject *pArgs)
{    	
    int source, sink;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &source, &sink)) {
        return NULL;
    }	
    
    status = pjsua_conf_disconnect(source, sink);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_conf_set_tx_level
 */
static PyObject *py_pjsua_conf_set_tx_level(PyObject *pSelf, PyObject *pArgs)
{    	
    int slot;
    float level;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "if", &slot, &level)) {
        return NULL;
    }	
    
    status = pjsua_conf_adjust_tx_level(slot, level);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_conf_set_rx_level
 */
static PyObject *py_pjsua_conf_set_rx_level(PyObject *pSelf, PyObject *pArgs)
{    	
    int slot;
    float level;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "if", &slot, &level)) {
        return NULL;
    }	
    
    status = pjsua_conf_adjust_rx_level(slot, level);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_conf_get_signal_level
 */
static PyObject *py_pjsua_conf_get_signal_level(PyObject *pSelf, 
						PyObject *pArgs)
{    	
    int slot;
    unsigned tx_level, rx_level;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &slot)) {
        return NULL;
    }	
    
    status = pjsua_conf_get_signal_level(slot, &tx_level, &rx_level);
    
    return Py_BuildValue("iff", status, (float)(tx_level/255.0), 
			 (float)(rx_level/255.0));
}

/*
 * py_pjsua_player_create
 */
static PyObject *py_pjsua_player_create(PyObject *pSelf, PyObject *pArgs)
{    	
    int id;
    int options;
    PyObject *pFilename;
    pj_str_t filename;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "Oi", &pFilename, &options)) {
        return NULL;
    }

    filename = PyString_ToPJ(pFilename);
    status = pjsua_player_create(&filename, options, &id);
    
    return Py_BuildValue("ii", status, id);
}

/*
 * py_pjsua_playlist_create
 */
static PyObject *py_pjsua_playlist_create(PyObject *pSelf, PyObject *pArgs)
{    	
    int id;
    int options;
    PyObject *pLabel, *pFileList;
    pj_str_t label;
    int count;
    pj_str_t files[64];
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "OOi", &pLabel, &pFileList, &options)) {
        return NULL;
    }

    label = PyString_ToPJ(pLabel);
    if (!PyList_Check(pFileList))
	return Py_BuildValue("ii", PJ_EINVAL, PJSUA_INVALID_ID);

    count = 0;
    for (count=0; count<PyList_Size(pFileList) && 
		  count<PJ_ARRAY_SIZE(files); ++count) 
    {
	files[count] = PyString_ToPJ(PyList_GetItem(pFileList, count));
    }

    status = pjsua_playlist_create(files, count, &label, options, &id);
    
    return Py_BuildValue("ii", status, id);
}

/*
 * py_pjsua_player_get_conf_port
 */
static PyObject *py_pjsua_player_get_conf_port(PyObject *pSelf, 
					       PyObject *pArgs)
{    	
    
    int id, port_id;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &id)) {
        return NULL;
    }	
    
    port_id = pjsua_player_get_conf_port(id);
    
    return Py_BuildValue("i", port_id);
}

/*
 * py_pjsua_player_set_pos
 */
static PyObject *py_pjsua_player_set_pos(PyObject *pSelf, PyObject *pArgs)
{    	
    int id;
    int samples;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &id, &samples)) {
        return NULL;
    }	
    
    if (samples < 0)
	samples = 0;

    status = pjsua_player_set_pos(id, samples);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_player_destroy
 */
static PyObject *py_pjsua_player_destroy(PyObject *pSelf, PyObject *pArgs)
{    	
    int id;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &id)) {
        return NULL;
    }	
    
    status = pjsua_player_destroy(id);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_recorder_create
 */
static PyObject *py_pjsua_recorder_create(PyObject *pSelf, PyObject *pArgs)
{    	
    int id, options;
    int max_size;
    PyObject *pFilename, *pEncParam;
    pj_str_t filename;
    int enc_type;
    
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "OiOii", &pFilename, &enc_type, &pEncParam,
			  &max_size, &options))
    {
        return NULL;
    }

    filename = PyString_ToPJ(pFilename);

    status = pjsua_recorder_create(&filename, enc_type, NULL, max_size,
				   options, &id);

    return Py_BuildValue("ii", status, id);
}

/*
 * py_pjsua_recorder_get_conf_port
 */
static PyObject *py_pjsua_recorder_get_conf_port(PyObject *pSelf, 
						 PyObject *pArgs)
{    	
    
    int id, port_id;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &id)) {
        return NULL;
    }	
    
    port_id = pjsua_recorder_get_conf_port(id);
    
    return Py_BuildValue("i", port_id);
}

/*
 * py_pjsua_recorder_destroy
 */
static PyObject *py_pjsua_recorder_destroy(PyObject *pSelf, PyObject *pArgs)
{    	
    int id;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &id)) {
        return NULL;
    }	
    
    status = pjsua_recorder_destroy(id);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_enum_snd_devs
 */
static PyObject *py_pjsua_enum_snd_devs(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    PyObject *ret;
    pjmedia_snd_dev_info info[SND_DEV_NUM];
    unsigned c, i;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    c = PJ_ARRAY_SIZE(info);
    status = pjsua_enum_snd_devs(info, &c);
    if (status != PJ_SUCCESS)
	c = 0;
    
    ret = PyList_New(c);
    for (i = 0; i < c; i++)  {
        PyObj_pjmedia_snd_dev_info * obj;

        obj = (PyObj_pjmedia_snd_dev_info *)
	      pjmedia_snd_dev_info_new(&PyTyp_pjmedia_snd_dev_info, 
				       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;
        obj->name = PyString_FromString(info[i].name);

        PyList_SetItem(ret, i, (PyObject *)obj);
    }
    
    return (PyObject*)ret;
}

/*
 * py_pjsua_get_snd_dev
 */
static PyObject *py_pjsua_get_snd_dev(PyObject *pSelf, PyObject *pArgs)
{    	
    int capture_dev, playback_dev;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    status = pjsua_get_snd_dev(&capture_dev, &playback_dev);
    
    return Py_BuildValue("ii", capture_dev, playback_dev);
}

/*
 * py_pjsua_set_snd_dev
 */
static PyObject *py_pjsua_set_snd_dev(PyObject *pSelf, PyObject *pArgs)
{    	
    int capture_dev, playback_dev;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &capture_dev, &playback_dev)) {
        return NULL;
    }	
    
    status = pjsua_set_snd_dev(capture_dev, playback_dev);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_set_null_snd_dev
 */
static PyObject *py_pjsua_set_null_snd_dev(PyObject *pSelf, PyObject *pArgs)
{    	
    int status;	

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    status = pjsua_set_null_snd_dev();

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_set_ec
 */
static PyObject *py_pjsua_set_ec(PyObject *pSelf, PyObject *pArgs)
{    	
    int options;
    int tail_ms;
    int status;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "ii", &tail_ms, &options)) {
        return NULL;
    }	

    status = pjsua_set_ec(tail_ms, options);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_get_ec_tail
 */
static PyObject *py_pjsua_get_ec_tail(PyObject *pSelf, PyObject *pArgs)
{    	
    int status;	
    unsigned tail_ms;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    status = pjsua_get_ec_tail(&tail_ms);
    if (status != PJ_SUCCESS)
	tail_ms = 0;
    
    return Py_BuildValue("i", tail_ms);
}

/*
 * py_pjsua_enum_codecs
 */
static PyObject *py_pjsua_enum_codecs(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    PyObject *ret;
    pjsua_codec_info info[PJMEDIA_CODEC_MGR_MAX_CODECS];
    unsigned c, i;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    c = PJ_ARRAY_SIZE(info);
    status = pjsua_enum_codecs(info, &c);
    if (status != PJ_SUCCESS)
	c = 0;
    
    ret = PyList_New(c);
    for (i = 0; i < c; i++)  {
        PyObj_pjsua_codec_info * obj;
        obj = (PyObj_pjsua_codec_info *)
	      codec_info_new(&PyTyp_pjsua_codec_info, NULL, NULL);
        obj->codec_id = PyString_FromPJ(&info[i].codec_id);
        obj->priority = info[i].priority;

        PyList_SetItem(ret, i, (PyObject *)obj);
    }

    return (PyObject*)ret;
}

/*
 * py_pjsua_codec_set_priority
 */
static PyObject *py_pjsua_codec_set_priority(PyObject *pSelf, PyObject *pArgs)
{    	
    int status;	
    PyObject *pCodecId;
    pj_str_t codec_id;
    int priority;
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "Oi", &pCodecId, &priority)) {
        return NULL;
    }

    codec_id = PyString_ToPJ(pCodecId);
    if (priority < 0)
	priority = 0;
    if (priority > 255)
	priority = 255;

    status = pjsua_codec_set_priority(&codec_id, (pj_uint8_t)priority);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_codec_get_param
 */
static PyObject *py_pjsua_codec_get_param(PyObject *pSelf, PyObject *pArgs)
{    	
    int status;	
    PyObject *pCodecId;
    pj_str_t codec_id;
    pjmedia_codec_param param;
    PyObj_pjmedia_codec_param *ret;
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "O", &pCodecId)) {
        return NULL;
    }	

    codec_id = PyString_ToPJ(pCodecId);

    status = pjsua_codec_get_param(&codec_id, &param);
    if (status != PJ_SUCCESS)
	return Py_BuildValue("");

    ret = (PyObj_pjmedia_codec_param *)
	  pjmedia_codec_param_new(&PyTyp_pjmedia_codec_param, NULL, NULL);

    ret->info->avg_bps = param.info.avg_bps;
    ret->info->channel_cnt = param.info.channel_cnt;
    ret->info->clock_rate = param.info.clock_rate;
    ret->info->frm_ptime = param.info.frm_ptime;
    ret->info->pcm_bits_per_sample = param.info.pcm_bits_per_sample;
    ret->info->pt = param.info.pt;
    ret->setting->cng = param.setting.cng;
    ret->setting->dec_fmtp_mode = param.setting.dec_fmtp_mode;
    ret->setting->enc_fmtp_mode = param.setting.enc_fmtp_mode;
    ret->setting->frm_per_pkt = param.setting.frm_per_pkt;
    ret->setting->penh = param.setting.penh;
    ret->setting->plc = param.setting.plc;
    ret->setting->vad = param.setting.vad;

    return (PyObject*)ret;
}


/*
 * py_pjsua_codec_set_param
 */
static PyObject *py_pjsua_codec_set_param(PyObject *pSelf, PyObject *pArgs)
{    	
    int status;	
    PyObject *pCodecId, *pCodecParam;
    pj_str_t codec_id;
    pjmedia_codec_param param;
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "OO", &pCodecId, &pCodecParam)) {
        return NULL;
    }	

    codec_id = PyString_ToPJ(pCodecId);

    if (pCodecParam != Py_None) {
	PyObj_pjmedia_codec_param *obj;

        obj = (PyObj_pjmedia_codec_param *)pCodecParam;

        param.info.avg_bps = obj->info->avg_bps;
        param.info.channel_cnt = obj->info->channel_cnt;
        param.info.clock_rate = obj->info->clock_rate;
        param.info.frm_ptime = obj->info->frm_ptime;
        param.info.pcm_bits_per_sample = obj->info->pcm_bits_per_sample;
        param.info.pt = obj->info->pt;
        param.setting.cng = obj->setting->cng;
        param.setting.dec_fmtp_mode = obj->setting->dec_fmtp_mode;
        param.setting.enc_fmtp_mode = obj->setting->enc_fmtp_mode;
        param.setting.frm_per_pkt = obj->setting->frm_per_pkt;
        param.setting.penh = obj->setting->penh;
        param.setting.plc = obj->setting->plc;
        param.setting.vad = obj->setting->vad;
        status = pjsua_codec_set_param(&codec_id, &param);

    } else {
        status = pjsua_codec_set_param(&codec_id, NULL);
    }

    return Py_BuildValue("i", status);
}

static char pjsua_conf_get_max_ports_doc[] =
    "int _pjsua.conf_get_max_ports () "
    "Get maxinum number of conference ports.";
static char pjsua_conf_get_active_ports_doc[] =
    "int _pjsua.conf_get_active_ports () "
    "Get current number of active ports in the bridge.";
static char pjsua_enum_conf_ports_doc[] =
    "int[] _pjsua.enum_conf_ports () "
    "Enumerate all conference ports.";
static char pjsua_conf_get_port_info_doc[] =
    "_pjsua.Conf_Port_Info _pjsua.conf_get_port_info (int id) "
    "Get information about the specified conference port";
static char pjsua_conf_remove_port_doc[] =
    "int _pjsua.conf_remove_port (int id) "
    "Remove arbitrary slot from the conference bridge. "
    "Application should only call this function "
    "if it registered the port manually.";
static char pjsua_conf_connect_doc[] =
    "int _pjsua.conf_connect (int source, int sink) "
    "Establish unidirectional media flow from souce to sink. "
    "One source may transmit to multiple destinations/sink. "
    "And if multiple sources are transmitting to the same sink, "
    "the media will be mixed together. Source and sink may refer "
    "to the same ID, effectively looping the media. "
    "If bidirectional media flow is desired, application "
    "needs to call this function twice, with the second "
    "one having the arguments reversed.";
static char pjsua_conf_disconnect_doc[] =
    "int _pjsua.conf_disconnect (int source, int sink) "
    "Disconnect media flow from the source to destination port.";
static char pjsua_player_create_doc[] =
    "int, int _pjsua.player_create (string filename, int options) "
    "Create a file player, and automatically connect "
    "this player to the conference bridge.";
static char pjsua_player_get_conf_port_doc[] =
    "int _pjsua.player_get_conf_port (int) "
    "Get conference port ID associated with player.";
static char pjsua_player_set_pos_doc[] =
    "int _pjsua.player_set_pos (int id, int samples) "
    "Set playback position.";
static char pjsua_player_destroy_doc[] =
    "int _pjsua.player_destroy (int id) "
    "Close the file, remove the player from the bridge, "
    "and free resources associated with the file player.";
static char pjsua_recorder_create_doc[] =
    "int, int _pjsua.recorder_create (string filename, "
    "int enc_type, int enc_param, int max_size, int options) "
    "Create a file recorder, and automatically connect this recorder "
    "to the conference bridge. The recorder currently supports recording "
    "WAV file, and on Windows, MP3 file. The type of the recorder to use "
    "is determined by the extension of the file (e.g. '.wav' or '.mp3').";
static char pjsua_recorder_get_conf_port_doc[] =
    "int _pjsua.recorder_get_conf_port (int id) "
    "Get conference port associated with recorder.";
static char pjsua_recorder_destroy_doc[] =
    "int _pjsua.recorder_destroy (int id) "
    "Destroy recorder (this will complete recording).";
static char pjsua_enum_snd_devs_doc[] =
    "_pjsua.PJMedia_Snd_Dev_Info[] _pjsua.enum_snd_devs (int count) "
    "Enum sound devices.";
static char pjsua_get_snd_dev_doc[] =
    "int, int _pjsua.get_snd_dev () "
    "Get currently active sound devices. "
    "If sound devices has not been created "
    "(for example when pjsua_start() is not called), "
    "it is possible that the function returns "
    "PJ_SUCCESS with -1 as device IDs.";
static char pjsua_set_snd_dev_doc[] =
    "int _pjsua.set_snd_dev (int capture_dev, int playback_dev) "
    "Select or change sound device. Application may call this function "
    "at any time to replace current sound device.";
static char pjsua_set_null_snd_dev_doc[] =
    "int _pjsua.set_null_snd_dev () "
    "Set pjsua to use null sound device. The null sound device only "
    "provides the timing needed by the conference bridge, and will not "
    "interract with any hardware.";
static char pjsua_set_ec_doc[] =
    "int _pjsua.set_ec (int tail_ms, int options) "
    "Configure the echo canceller tail length of the sound port.";
static char pjsua_get_ec_tail_doc[] =
    "int _pjsua.get_ec_tail () "
    "Get current echo canceller tail length.";
static char pjsua_enum_codecs_doc[] =
    "_pjsua.Codec_Info[] _pjsua.enum_codecs () "
    "Enum all supported codecs in the system.";
static char pjsua_codec_set_priority_doc[] =
    "int _pjsua.codec_set_priority (string id, int priority) "
    "Change codec priority.";
static char pjsua_codec_get_param_doc[] =
    "_pjsua.PJMedia_Codec_Param _pjsua.codec_get_param (string id) "
    "Get codec parameters";
static char pjsua_codec_set_param_doc[] =
    "int _pjsua.codec_set_param (string id, "
    "_pjsua.PJMedia_Codec_Param param) "
    "Set codec parameters.";

/* END OF LIB MEDIA */

/* LIB CALL */

/*
 * py_pjsua_call_get_max_count
 */
static PyObject *py_pjsua_call_get_max_count(PyObject *pSelf, PyObject *pArgs)
{    	
    int count;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    count = pjsua_call_get_max_count();
    
    return Py_BuildValue("i", count);
}

/*
 * py_pjsua_call_get_count
 */
static PyObject *py_pjsua_call_get_count(PyObject *pSelf, PyObject *pArgs)
{    	
    int count;	
    
    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    count = pjsua_call_get_count();
    
    return Py_BuildValue("i", count);
}

/*
 * py_pjsua_enum_calls
 */
static PyObject *py_pjsua_enum_calls(PyObject *pSelf, PyObject *pArgs)
{
    pj_status_t status;
    PyObject *ret;
    pjsua_transport_id id[PJSUA_MAX_CALLS];
    unsigned c, i;

    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    c = PJ_ARRAY_SIZE(id);
    status = pjsua_enum_calls(id, &c);
    if (status != PJ_SUCCESS)
	c = 0;
    
    ret = PyList_New(c);
    for (i = 0; i < c; i++)  {     
        PyList_SetItem(ret, i, Py_BuildValue("i", id[i]));
    }
    
    return (PyObject*)ret;
}

/*
 * py_pjsua_call_make_call
 */
static PyObject *py_pjsua_call_make_call(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int acc_id;
    pj_str_t dst_uri;
    PyObject *pDstUri, *pMsgData, *pUserData;
    unsigned options;
    pjsua_msg_data msg_data;
    int call_id;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iOIOO", &acc_id, &pDstUri, &options, 
			  &pUserData, &pMsgData))
    {
        return NULL;
    }
	
    dst_uri = PyString_ToPJ(pDstUri);
    pjsua_msg_data_init(&msg_data);

    if (pMsgData != Py_None) {
	PyObj_pjsua_msg_data * omd;

        omd = (PyObj_pjsua_msg_data *)pMsgData;

        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", POOL_SIZE, POOL_SIZE);
        translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
    }

    Py_XINCREF(pUserData);

    status = pjsua_call_make_call(acc_id, &dst_uri, 
				  options, (void*)pUserData, 
				  &msg_data, &call_id);	
    if (pool != NULL)
	pj_pool_release(pool);
    
    if (status != PJ_SUCCESS) {
    	Py_XDECREF(pUserData);
    }

    return Py_BuildValue("ii", status, call_id);	
}

/*
 * py_pjsua_call_is_active
 */
static PyObject *py_pjsua_call_is_active(PyObject *pSelf, PyObject *pArgs)
{    	
    int call_id;
    int is_active;
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &call_id)) {
        return NULL;
    }	
    
    is_active = pjsua_call_is_active(call_id);
    
    return Py_BuildValue("i", is_active);
}

/*
 * py_pjsua_call_has_media
 */
static PyObject *py_pjsua_call_has_media(PyObject *pSelf, PyObject *pArgs)
{    	
    int call_id;
    int has_media;
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &call_id)) {
        return NULL;
    }	
    
    has_media = pjsua_call_has_media(call_id);

    return Py_BuildValue("i", has_media);
}

/*
 * py_pjsua_call_get_conf_port
 */
static PyObject* py_pjsua_call_get_conf_port(PyObject *pSelf, PyObject *pArgs)
{    	
    int call_id;
    int port_id;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &call_id)) {
        return NULL;
    }

    port_id = pjsua_call_get_conf_port(call_id);

    return Py_BuildValue("i", port_id);
}

/*
 * py_pjsua_call_get_info
 */
static PyObject* py_pjsua_call_get_info(PyObject *pSelf, PyObject *pArgs)
{    	
    int call_id;
    int status;
    PyObj_pjsua_call_info *ret;
    pjsua_call_info info;
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &call_id)) {
        return NULL;
    }	
    
    status = pjsua_call_get_info(call_id, &info);
    if (status != PJ_SUCCESS)
	return Py_BuildValue("");

    ret = (PyObj_pjsua_call_info *)call_info_new(&PyTyp_pjsua_call_info,
						 NULL, NULL);
    ret->acc_id = info.acc_id;
    Py_XDECREF(ret->call_id);
    ret->call_id = PyString_FromPJ(&info.call_id);
    ret->conf_slot = info.conf_slot;
    ret->connect_duration = info.connect_duration.sec * 1000 +
			    info.connect_duration.msec;
    ret->total_duration = info.total_duration.sec * 1000 +
			  info.total_duration.msec;
    ret->id = info.id;
    ret->last_status = info.last_status;
    Py_XDECREF(ret->last_status_text);
    ret->last_status_text = PyString_FromPJ(&info.last_status_text);
    Py_XDECREF(ret->local_contact);
    ret->local_contact = PyString_FromPJ(&info.local_contact);
    Py_XDECREF(ret->local_info);
    ret->local_info = PyString_FromPJ(&info.local_info);
    Py_XDECREF(ret->remote_contact);
    ret->remote_contact = PyString_FromPJ(&info.remote_contact);
    Py_XDECREF(ret->remote_info);
    ret->remote_info = PyString_FromPJ(&info.remote_info);
    ret->media_dir = info.media_dir;
    ret->media_status = info.media_status;
    ret->role = info.role;
    ret->state = info.state;
    Py_XDECREF(ret->state_text);
    ret->state_text = PyString_FromPJ(&info.state_text);

    return (PyObject*)ret;
}

/*
 * py_pjsua_call_set_user_data
 */
static PyObject *py_pjsua_call_set_user_data(PyObject *pSelf, PyObject *pArgs)
{    	
    int call_id;
    PyObject *pUserData, *old_user_data;
    int status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iO", &call_id, &pUserData)) {
        return NULL;
    }

    old_user_data = (PyObject*) pjsua_call_get_user_data(call_id);

    if (old_user_data == pUserData) {
	return Py_BuildValue("i", PJ_SUCCESS);
    }

    Py_XINCREF(pUserData);
    Py_XDECREF(old_user_data);

    status = pjsua_call_set_user_data(call_id, (void*)pUserData);
    
    if (status != PJ_SUCCESS) {
    	Py_XDECREF(pUserData);
    }

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_get_user_data
 */
static PyObject *py_pjsua_call_get_user_data(PyObject *pSelf, PyObject *pArgs)
{    	
    int call_id;
    PyObject *user_data;	
    
    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &call_id)) {
        return NULL;
    }	
    
    user_data = (PyObject*)pjsua_call_get_user_data(call_id);
    return user_data ? Py_BuildValue("O", user_data) : Py_BuildValue("");
}

/*
 * py_pjsua_call_answer
 */
static PyObject *py_pjsua_call_answer(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int call_id;
    pj_str_t * reason, tmp_reason;
    PyObject *pReason;
    unsigned code;
    pjsua_msg_data msg_data;
    PyObject * omdObj;
    pj_pool_t * pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iIOO", &call_id, &code, &pReason, &omdObj)) {
        return NULL;
    }

    if (pReason == Py_None) {
        reason = NULL;
    } else {
	reason = &tmp_reason;
        tmp_reason = PyString_ToPJ(pReason);
    }

    pjsua_msg_data_init(&msg_data);
    if (omdObj != Py_None) {
	PyObj_pjsua_msg_data *omd;

        omd = (PyObj_pjsua_msg_data *)omdObj;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", POOL_SIZE, POOL_SIZE);
        translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
    }
    
    status = pjsua_call_answer(call_id, code, reason, &msg_data);	

    if (pool)
	pj_pool_release(pool);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_hangup
 */
static PyObject *py_pjsua_call_hangup(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int call_id;
    pj_str_t *reason, tmp_reason;
    PyObject *pReason;
    unsigned code;
    pjsua_msg_data msg_data;
    PyObject *omdObj;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iIOO", &call_id, &code, &pReason, 
			  &omdObj))
    {
        return NULL;
    }

    if (pReason == Py_None) {
        reason = NULL;
    } else {
        reason = &tmp_reason;
        tmp_reason = PyString_ToPJ(pReason);
    }

    pjsua_msg_data_init(&msg_data);
    if (omdObj != Py_None)  {
	PyObj_pjsua_msg_data *omd;

        omd = (PyObj_pjsua_msg_data *)omdObj;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", POOL_SIZE, POOL_SIZE);
        translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
    }
    
    status = pjsua_call_hangup(call_id, code, reason, &msg_data);
    if (pool)
	pj_pool_release(pool);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_set_hold
 */
static PyObject *py_pjsua_call_set_hold(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int call_id;    
    pjsua_msg_data msg_data;
    PyObject *omdObj;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iO", &call_id, &omdObj)) {
        return NULL;
    }

    pjsua_msg_data_init(&msg_data);
    if (omdObj != Py_None) {
	PyObj_pjsua_msg_data *omd;    

        omd = (PyObj_pjsua_msg_data *)omdObj;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", POOL_SIZE, POOL_SIZE);
        translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
    }

    status = pjsua_call_set_hold(call_id, &msg_data);

    if (pool)
        pj_pool_release(pool);

    return Py_BuildValue("i",status);
}

/*
 * py_pjsua_call_reinvite
 */
static PyObject *py_pjsua_call_reinvite(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int call_id;
    int unhold;
    pjsua_msg_data msg_data;
    PyObject *omdObj;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iiO", &call_id, &unhold, &omdObj)) {
        return NULL;
    }

    pjsua_msg_data_init(&msg_data);
    if (omdObj != Py_None) {
	PyObj_pjsua_msg_data *omd;

        omd = (PyObj_pjsua_msg_data *)omdObj;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", POOL_SIZE, POOL_SIZE);
        translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
    }

    status = pjsua_call_reinvite(call_id, unhold, &msg_data);

    if (pool)
        pj_pool_release(pool);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_update
 */
static PyObject *py_pjsua_call_update(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int call_id;    
    int option;
    pjsua_msg_data msg_data;
    PyObject *omdObj;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iiO", &call_id, &option, &omdObj)) {
        return NULL;
    }

    pjsua_msg_data_init(&msg_data);
    if (omdObj != Py_None) {
	PyObj_pjsua_msg_data *omd;

        omd = (PyObj_pjsua_msg_data *)omdObj;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", POOL_SIZE, POOL_SIZE);
        translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
    }

    status = pjsua_call_update(call_id, option, &msg_data);	

    if (pool)
        pj_pool_release(pool);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_send_request
 */
static PyObject *py_pjsua_call_send_request(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int call_id;    
    PyObject *pMethod;
    pj_str_t method;
    pjsua_msg_data msg_data;
    PyObject *omdObj;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iOO", &call_id, &pMethod, &omdObj)) {
        return NULL;
    }

    if (!PyString_Check(pMethod)) {
	return NULL;
    }

    method = PyString_ToPJ(pMethod);
    pjsua_msg_data_init(&msg_data);

    if (omdObj != Py_None) {
	PyObj_pjsua_msg_data *omd;

        omd = (PyObj_pjsua_msg_data *)omdObj;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", POOL_SIZE, POOL_SIZE);
        translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
    }

    status = pjsua_call_send_request(call_id, &method, &msg_data);	

    if (pool)
        pj_pool_release(pool);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_xfer
 */
static PyObject *py_pjsua_call_xfer(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int call_id;
    pj_str_t dest;
    PyObject *pDstUri;
    pjsua_msg_data msg_data;
    PyObject *omdObj;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iOO", &call_id, &pDstUri, &omdObj)) {
        return NULL;
    }

    if (!PyString_Check(pDstUri))
	return NULL;

    dest = PyString_ToPJ(pDstUri);
    pjsua_msg_data_init(&msg_data);

    if (omdObj != Py_None) {
	PyObj_pjsua_msg_data *omd;

        omd = (PyObj_pjsua_msg_data *)omdObj;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", POOL_SIZE, POOL_SIZE);
        translate_hdr(pool, &msg_data.hdr_list, omd->hdr_list);
    }

    status = pjsua_call_xfer(call_id, &dest, &msg_data);

    if (pool)
        pj_pool_release(pool);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_xfer_replaces
 */
static PyObject *py_pjsua_call_xfer_replaces(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int call_id;
    int dest_call_id;
    unsigned options;    
    pjsua_msg_data msg_data;
    PyObject *omdObj;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iiIO", &call_id, &dest_call_id, 
			  &options, &omdObj))
    {
        return NULL;
    }

    pjsua_msg_data_init(&msg_data);

    if (omdObj != Py_None) {
	PyObj_pjsua_msg_data *omd;

        omd = (PyObj_pjsua_msg_data *)omdObj;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", 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);

    if (pool)
	pj_pool_release(pool);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_dial_dtmf
 */
static PyObject *py_pjsua_call_dial_dtmf(PyObject *pSelf, PyObject *pArgs)
{    	
    int call_id;
    PyObject *pDigits;
    pj_str_t digits;
    int status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iO", &call_id, &pDigits)) {
        return NULL;
    }

    if (!PyString_Check(pDigits))
	return Py_BuildValue("i", PJ_EINVAL);

    digits = PyString_ToPJ(pDigits);
    status = pjsua_call_dial_dtmf(call_id, &digits);
    
    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_send_im
 */
static PyObject *py_pjsua_call_send_im(PyObject *pSelf, PyObject *pArgs)
{    
    int status;
    int call_id;
    pj_str_t content;
    pj_str_t * mime_type, tmp_mime_type;
    PyObject *pMimeType, *pContent, *omdObj;
    pjsua_msg_data msg_data;
    int user_data;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iOOOi", &call_id, &pMimeType, &pContent, 
			  &omdObj, &user_data))
    {
        return NULL;
    }

    if (!PyString_Check(pContent))
	return Py_BuildValue("i", PJ_EINVAL);

    content = PyString_ToPJ(pContent);

    if (PyString_Check(pMimeType)) {
        mime_type = &tmp_mime_type;
        tmp_mime_type = PyString_ToPJ(pMimeType);
    } else {
	mime_type = NULL;   
    }

    pjsua_msg_data_init(&msg_data);
    if (omdObj != Py_None) {
	PyObj_pjsua_msg_data * omd;

        omd = (PyObj_pjsua_msg_data *)omdObj;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", 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, (void *)user_data);

    if (pool)
        pj_pool_release(pool);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_send_typing_ind
 */
static PyObject *py_pjsua_call_send_typing_ind(PyObject *pSelf, 
					       PyObject *pArgs)
{    
    int status;
    int call_id;    
    int is_typing;
    pjsua_msg_data msg_data;
    PyObject *omdObj;
    pj_pool_t *pool = NULL;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iiO", &call_id, &is_typing, &omdObj)) {
        return NULL;
    }
	
    pjsua_msg_data_init(&msg_data);
    if (omdObj != Py_None) {
	PyObj_pjsua_msg_data *omd;

        omd = (PyObj_pjsua_msg_data *)omdObj;
        msg_data.content_type = PyString_ToPJ(omd->content_type);
        msg_data.msg_body = PyString_ToPJ(omd->msg_body);
        pool = pjsua_pool_create("pytmp", 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);	

    if (pool)
        pj_pool_release(pool);

    return Py_BuildValue("i", status);
}

/*
 * py_pjsua_call_hangup_all
 */
static PyObject *py_pjsua_call_hangup_all(PyObject *pSelf, PyObject *pArgs)
{    	
    PJ_UNUSED_ARG(pSelf);
    PJ_UNUSED_ARG(pArgs);

    pjsua_call_hangup_all();
    
    return Py_BuildValue("");
}

/*
 * py_pjsua_call_dump
 */
static PyObject *py_pjsua_call_dump(PyObject *pSelf, PyObject *pArgs)
{    	
    int call_id;
    int with_media;
    PyObject *ret;
    PyObject *pIndent;
    char *buffer;
    char *indent;
    unsigned maxlen;    
    int status;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "iiIO", &call_id, &with_media, 
			  &maxlen, &pIndent))
    {
        return NULL;
    }	

    buffer = (char*) malloc(maxlen * sizeof(char));
    indent = PyString_AsString(pIndent);
    
    status = pjsua_call_dump(call_id, with_media, buffer, maxlen, indent);
    if (status != PJ_SUCCESS) {
	free(buffer);
	return PyString_FromString("");
    }

    ret = PyString_FromString(buffer);
    free(buffer);
    return (PyObject*)ret;
}


/*
 * py_pjsua_dump
 * Dump application states.
 */
static PyObject *py_pjsua_dump(PyObject *pSelf, PyObject *pArgs)
{
    int detail;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &detail)) {
        return NULL;
    }	

    pjsua_dump(detail);

    return Py_BuildValue("");
}


/*
 * py_pj_strerror
 */
static PyObject *py_pj_strerror(PyObject *pSelf, PyObject *pArgs)
{
    int err;
    char err_msg[PJ_ERR_MSG_SIZE];
    pj_str_t ret;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "i", &err)) {
        return NULL;
    }
    
    ret = pj_strerror(err, err_msg, sizeof(err_msg));
    
    return PyString_FromStringAndSize(err_msg, ret.slen);
}


/*
 * py_pj_parse_simple_sip
 */
static PyObject *py_pj_parse_simple_sip(PyObject *pSelf, PyObject *pArgs)
{
    const char *arg_uri;
    pj_pool_t *pool;
    char tmp[PJSIP_MAX_URL_SIZE];
    pjsip_uri *uri;
    pjsip_sip_uri *sip_uri;
    PyObject *ret, *item;

    PJ_UNUSED_ARG(pSelf);

    if (!PyArg_ParseTuple(pArgs, "s", &arg_uri)) {
        return NULL;
    }
    
    strncpy(tmp, arg_uri, sizeof(tmp));
    tmp[sizeof(tmp)-1] = '\0';

    pool = pjsua_pool_create("py_pj_parse_simple_sip", 512, 512);
    uri = pjsip_parse_uri(pool, tmp, strlen(tmp), 0);
    
    if (uri == NULL || (!PJSIP_URI_SCHEME_IS_SIP(uri) &&
			!PJSIP_URI_SCHEME_IS_SIPS(uri))) {
	pj_pool_release(pool);
	return Py_BuildValue("");
    }
    
    ret = PyTuple_New(5);
    sip_uri = (pjsip_sip_uri*) pjsip_uri_get_uri(uri);

    /* Scheme */
    item = PyString_FromPJ(pjsip_uri_get_scheme(uri));
    PyTuple_SetItem(ret, 0, item);

    /* Username */
    item = PyString_FromPJ(&sip_uri->user);
    PyTuple_SetItem(ret, 1, item);

    /* Host */
    item = PyString_FromPJ(&sip_uri->host);
    PyTuple_SetItem(ret, 2, item);

    /* Port */
    if (sip_uri->port == 5060) {
	sip_uri->port = 0;
    }
    item = Py_BuildValue("i", sip_uri->port);
    PyTuple_SetItem(ret, 3, item);

    /* Transport */
    if (pj_stricmp2(&sip_uri->transport_param, "udp")) {
	sip_uri->transport_param.ptr = "";
	sip_uri->transport_param.slen = 0;
    }
    item = PyString_FromPJ(&sip_uri->transport_param);
    PyTuple_SetItem(ret, 4, item);

    return ret;
}


static char pjsua_call_get_max_count_doc[] =
    "int _pjsua.call_get_max_count () "
    "Get maximum number of calls configured in pjsua.";
static char pjsua_call_get_count_doc[] =
    "int _pjsua.call_get_count () "
    "Get number of currently active calls.";
static char pjsua_enum_calls_doc[] =
    "int[] _pjsua.enum_calls () "
    "Get maximum number of calls configured in pjsua.";
static char pjsua_call_make_call_doc[] =
    "int,int _pjsua.call_make_call (int acc_id, string dst_uri, int options,"
    "int user_data, _pjsua.Msg_Data msg_data) "
    "Make outgoing call to the specified URI using the specified account.";
static char pjsua_call_is_active_doc[] =
    "int _pjsua.call_is_active (int call_id) "
    "Check if the specified call has active INVITE session and the INVITE "
    "session has not been disconnected.";
static char pjsua_call_has_media_doc[] =
    "int _pjsua.call_has_media (int call_id) "
    "Check if call has an active media session.";
static char pjsua_call_get_conf_port_doc[] =
    "int _pjsua.call_get_conf_port (int call_id) "
    "Get the conference port identification associated with the call.";
static char pjsua_call_get_info_doc[] =
    "_pjsua.Call_Info _pjsua.call_get_info (int call_id) "
    "Obtain detail information about the specified call.";
static char pjsua_call_set_user_data_doc[] =
    "int _pjsua.call_set_user_data (int call_id, int user_data) "
    "Attach application specific data to the call.";
static char pjsua_call_get_user_data_doc[] =
    "int _pjsua.call_get_user_data (int call_id) "
    "Get user data attached to the call.";
static char pjsua_call_answer_doc[] =
    "int _pjsua.call_answer (int call_id, int code, string reason, "
    "_pjsua.Msg_Data msg_data) "
    "Send response to incoming INVITE request.";
static char pjsua_call_hangup_doc[] =
    "int _pjsua.call_hangup (int call_id, int code, string reason, "
    "_pjsua.Msg_Data msg_data) "
    "Hangup call by using method that is appropriate according "
    "to the call state.";
static char pjsua_call_set_hold_doc[] =
    "int _pjsua.call_set_hold (int call_id, _pjsua.Msg_Data msg_data) "
    "Put the specified call on hold.";
static char pjsua_call_reinvite_doc[] =
    "int _pjsua.call_reinvite (int call_id, int unhold, "
    "_pjsua.Msg_Data msg_data) "
    "Send re-INVITE (to release hold).";
static char pjsua_call_xfer_doc[] =
    "int _pjsua.call_xfer (int call_id, string dest, "
    "_pjsua.Msg_Data msg_data) "
    "Initiate call transfer to the specified address. "
    "This function will send REFER request to instruct remote call party "
    "to initiate a new INVITE session to the specified destination/target.";
static char pjsua_call_xfer_replaces_doc[] =
    "int _pjsua.call_xfer_replaces (int call_id, int dest_call_id, "
    "int options, _pjsua.Msg_Data msg_data) "
    "Initiate attended call transfer. This function will send REFER request "
    "to instruct remote call party to initiate new INVITE session to the URL "
    "of dest_call_id. The party at dest_call_id then should 'replace' the call"
    "with us with the new call from the REFER recipient.";
static char pjsua_call_dial_dtmf_doc[] =
    "int _pjsua.call_dial_dtmf (int call_id, string digits) "
    "Send DTMF digits to remote using RFC 2833 payload formats.";
static char pjsua_call_send_im_doc[] =
    "int _pjsua.call_send_im (int call_id, string mime_type, string content,"
    "_pjsua.Msg_Data msg_data, int user_data) "
    "Send instant messaging inside INVITE session.";
static char pjsua_call_send_typing_ind_doc[] =
    "int _pjsua.call_send_typing_ind (int call_id, int is_typing, "
    "_pjsua.Msg_Data msg_data) "
    "Send IM typing indication inside INVITE session.";
static char pjsua_call_hangup_all_doc[] =
    "void _pjsua.call_hangup_all () "
    "Terminate all calls.";
static char pjsua_call_dump_doc[] =
    "int _pjsua.call_dump (int call_id, int with_media, int maxlen, "
    "string indent) "
    "Dump call and media statistics to string.";

/* END OF LIB CALL */

/*
 * Map of function names to functions
 */
static PyMethodDef py_pjsua_methods[] =
{
    {
        "thread_register", py_pjsua_thread_register, METH_VARARGS, 
         pjsua_thread_register_doc
    },
    {
    	"perror", py_pjsua_perror, METH_VARARGS, pjsua_perror_doc
    },
    {
    	"create", py_pjsua_create, METH_VARARGS, pjsua_create_doc
    },
    {
    	"init", py_pjsua_init, METH_VARARGS, pjsua_init_doc
    },
    {
    	"start", py_pjsua_start, METH_VARARGS, pjsua_start_doc
    },
    {
    	"destroy", py_pjsua_destroy, METH_VARARGS, pjsua_destroy_doc
    },
    {
    	"handle_events", py_pjsua_handle_events, METH_VARARGS,
    	pjsua_handle_events_doc
    },
    {
    	"verify_sip_url", py_pjsua_verify_sip_url, METH_VARARGS,
    	pjsua_verify_sip_url_doc
    },
    {
    	"reconfigure_logging", py_pjsua_reconfigure_logging, METH_VARARGS,
    	pjsua_reconfigure_logging_doc
    },
    {
    	"logging_config_default", py_pjsua_logging_config_default,
    	METH_VARARGS, pjsua_logging_config_default_doc
    },
    {
    	"config_default", py_pjsua_config_default, METH_VARARGS,
    	pjsua_config_default_doc
    },
    {
    	"media_config_default", py_pjsua_media_config_default, METH_VARARGS,
    	pjsua_media_config_default_doc
    },
    
    
    {
    	"msg_data_init", py_pjsua_msg_data_init, METH_VARARGS,
    	pjsua_msg_data_init_doc
    },
    {
        "transport_config_default", py_pjsua_transport_config_default, 
        METH_VARARGS,pjsua_transport_config_default_doc
    },
    {
        "transport_create", py_pjsua_transport_create, METH_VARARGS,
        pjsua_transport_create_doc
    },
    {
        "transport_enum_transports", py_pjsua_enum_transports, METH_VARARGS,
        pjsua_enum_transports_doc
    },
    {
        "transport_get_info", py_pjsua_transport_get_info, METH_VARARGS,
        pjsua_transport_get_info_doc
    },
    {
        "transport_set_enable", py_pjsua_transport_set_enable, METH_VARARGS,
        pjsua_transport_set_enable_doc
    },
    {
       "transport_close", py_pjsua_transport_close, METH_VARARGS,
        pjsua_transport_close_doc
    },
    {
        "acc_config_default", py_pjsua_acc_config_default, METH_VARARGS,
        pjsua_acc_config_default_doc
    },
    {
        "acc_get_count", py_pjsua_acc_get_count, METH_VARARGS,
        pjsua_acc_get_count_doc
    },
    {
        "acc_is_valid", py_pjsua_acc_is_valid, METH_VARARGS,
        pjsua_acc_is_valid_doc
    },
    {
        "acc_set_default", py_pjsua_acc_set_default, METH_VARARGS,
        pjsua_acc_set_default_doc
    },
    {
        "acc_get_default", py_pjsua_acc_get_default, METH_VARARGS,
        pjsua_acc_get_default_doc
    },
    {
        "acc_add", py_pjsua_acc_add, METH_VARARGS,
        pjsua_acc_add_doc
    },
    {
        "acc_add_local", py_pjsua_acc_add_local, METH_VARARGS,
        pjsua_acc_add_local_doc
    },
    {
        "acc_del", py_pjsua_acc_del, METH_VARARGS,
        pjsua_acc_del_doc
    },
    {
        "acc_set_user_data", py_pjsua_acc_set_user_data, METH_VARARGS,
        "Accociate user data with the account"
    },
    {
        "acc_get_user_data", py_pjsua_acc_get_user_data, METH_VARARGS,
        "Get account's user data"
    },
    {
        "acc_modify", py_pjsua_acc_modify, METH_VARARGS,
        pjsua_acc_modify_doc
    },
    {
        "acc_set_online_status", py_pjsua_acc_set_online_status, METH_VARARGS,
        pjsua_acc_set_online_status_doc
    },
    {
        "acc_set_online_status2", py_pjsua_acc_set_online_status2, METH_VARARGS,
        pjsua_acc_set_online_status2_doc
    },
    {
        "acc_set_registration", py_pjsua_acc_set_registration, METH_VARARGS,
        pjsua_acc_set_registration_doc
    },
    {
        "acc_get_info", py_pjsua_acc_get_info, METH_VARARGS,
        pjsua_acc_get_info_doc
    },
    {
	"acc_pres_notify", py_pjsua_acc_pres_notify, METH_VARARGS,
	"Accept or reject subscription request"
    },
    {
        "enum_accs", py_pjsua_enum_accs, METH_VARARGS,
        pjsua_enum_accs_doc
    },
    {
        "acc_enum_info", py_pjsua_acc_enum_info, METH_VARARGS,
        pjsua_acc_enum_info_doc
    },
    {
        "acc_set_transport", py_pjsua_acc_set_transport, METH_VARARGS,
        "Lock transport to use the specified transport"
    },
    {
        "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
    },
    {
        "buddy_is_valid", py_pjsua_buddy_is_valid, METH_VARARGS,
        pjsua_buddy_is_valid_doc
    },
    {
        "enum_buddies", py_pjsua_enum_buddies, METH_VARARGS,
        pjsua_enum_buddies_doc
    },    
    {
        "buddy_find", py_pjsua_buddy_find, METH_VARARGS,
        "Find buddy with the specified URI"
    },    
    {
        "buddy_get_info", py_pjsua_buddy_get_info, METH_VARARGS,
        pjsua_buddy_get_info_doc
    },
    {
        "buddy_add", py_pjsua_buddy_add, METH_VARARGS,
        pjsua_buddy_add_doc
    },
    {
        "buddy_del", py_pjsua_buddy_del, METH_VARARGS,
        pjsua_buddy_del_doc
    },
    {
        "buddy_set_user_data", py_pjsua_buddy_set_user_data, METH_VARARGS,
        "Associate user data to the buddy object"
    },
    {
        "buddy_get_user_data", py_pjsua_buddy_get_user_data, METH_VARARGS,
        "Get buddy user data"
    },
    {
        "buddy_subscribe_pres", py_pjsua_buddy_subscribe_pres, METH_VARARGS,
        pjsua_buddy_subscribe_pres_doc
    },
    {
        "pres_dump", py_pjsua_pres_dump, METH_VARARGS,
        pjsua_pres_dump_doc
    },
    {
        "im_send", py_pjsua_im_send, METH_VARARGS,
        pjsua_im_send_doc
    },
    {
        "im_typing", py_pjsua_im_typing, METH_VARARGS,
        pjsua_im_typing_doc
    },
        {
        "conf_get_max_ports", py_pjsua_conf_get_max_ports, METH_VARARGS,
        pjsua_conf_get_max_ports_doc
    },
    {
        "conf_get_active_ports", py_pjsua_conf_get_active_ports, METH_VARARGS,
        pjsua_conf_get_active_ports_doc
    },
    {
        "enum_conf_ports", py_pjsua_enum_conf_ports, METH_VARARGS,
        pjsua_enum_conf_ports_doc
    },
    {
        "conf_get_port_info", py_pjsua_conf_get_port_info, METH_VARARGS,
        pjsua_conf_get_port_info_doc
    },
    {
        "conf_remove_port", py_pjsua_conf_remove_port, METH_VARARGS,
        pjsua_conf_remove_port_doc
    },
    {
        "conf_connect", py_pjsua_conf_connect, METH_VARARGS,
        pjsua_conf_connect_doc
    },
    {
        "conf_disconnect", py_pjsua_conf_disconnect, METH_VARARGS,
        pjsua_conf_disconnect_doc
    },
    {
	"conf_set_tx_level", py_pjsua_conf_set_tx_level, METH_VARARGS,
	"Adjust the signal level to be transmitted from the bridge to the" 
	" specified port by making it louder or quieter"
    },
    {
	"conf_set_rx_level", py_pjsua_conf_set_rx_level, METH_VARARGS,
	"Adjust the signal level to be received from the specified port (to"
	" the bridge) by making it louder or quieter"
    },
    {
	"conf_get_signal_level", py_pjsua_conf_get_signal_level, METH_VARARGS,
	"Get last signal level transmitted to or received from the specified port"
    },
    {
        "player_create", py_pjsua_player_create, METH_VARARGS,
        pjsua_player_create_doc
    },
    {
        "playlist_create", py_pjsua_playlist_create, METH_VARARGS,
        "Create WAV playlist"
    },
    {
        "player_get_conf_port", py_pjsua_player_get_conf_port, METH_VARARGS,
        pjsua_player_get_conf_port_doc
    },
    {
        "player_set_pos", py_pjsua_player_set_pos, METH_VARARGS,
        pjsua_player_set_pos_doc
    },
    {
        "player_destroy", py_pjsua_player_destroy, METH_VARARGS,
        pjsua_player_destroy_doc
    },
    {
        "recorder_create", py_pjsua_recorder_create, METH_VARARGS,
        pjsua_recorder_create_doc
    },
    {
        "recorder_get_conf_port", py_pjsua_recorder_get_conf_port, METH_VARARGS,
        pjsua_recorder_get_conf_port_doc
    },
    {
        "recorder_destroy", py_pjsua_recorder_destroy, METH_VARARGS,
        pjsua_recorder_destroy_doc
    },
    {
        "enum_snd_devs", py_pjsua_enum_snd_devs, METH_VARARGS,
        pjsua_enum_snd_devs_doc
    },
    {
        "get_snd_dev", py_pjsua_get_snd_dev, METH_VARARGS,
        pjsua_get_snd_dev_doc
    },
    {
        "set_snd_dev", py_pjsua_set_snd_dev, METH_VARARGS,
        pjsua_set_snd_dev_doc
    },
    {
        "set_null_snd_dev", py_pjsua_set_null_snd_dev, METH_VARARGS,
        pjsua_set_null_snd_dev_doc
    },
    {
        "set_ec", py_pjsua_set_ec, METH_VARARGS,
        pjsua_set_ec_doc
    },
    {
        "get_ec_tail", py_pjsua_get_ec_tail, METH_VARARGS,
        pjsua_get_ec_tail_doc
    },
    {
        "enum_codecs", py_pjsua_enum_codecs, METH_VARARGS,
        pjsua_enum_codecs_doc
    },
    {
        "codec_set_priority", py_pjsua_codec_set_priority, METH_VARARGS,
        pjsua_codec_set_priority_doc
    },
    {
        "codec_get_param", py_pjsua_codec_get_param, METH_VARARGS,
        pjsua_codec_get_param_doc
    },
    {
        "codec_set_param", py_pjsua_codec_set_param, METH_VARARGS,
        pjsua_codec_set_param_doc
    },
    {
        "call_get_max_count", py_pjsua_call_get_max_count, METH_VARARGS,
        pjsua_call_get_max_count_doc
    },
    {
        "call_get_count", py_pjsua_call_get_count, METH_VARARGS,
        pjsua_call_get_count_doc
    },
    {
        "enum_calls", py_pjsua_enum_calls, METH_VARARGS,
        pjsua_enum_calls_doc
    },
    {
        "call_make_call", py_pjsua_call_make_call, METH_VARARGS,
        pjsua_call_make_call_doc
    },
    {
        "call_is_active", py_pjsua_call_is_active, METH_VARARGS,
        pjsua_call_is_active_doc
    },
    {
        "call_has_media", py_pjsua_call_has_media, METH_VARARGS,
        pjsua_call_has_media_doc
    },
    {
        "call_get_conf_port", py_pjsua_call_get_conf_port, METH_VARARGS,
        pjsua_call_get_conf_port_doc
    },
    {
        "call_get_info", py_pjsua_call_get_info, METH_VARARGS,
        pjsua_call_get_info_doc
    },
    {
        "call_set_user_data", py_pjsua_call_set_user_data, METH_VARARGS,
        pjsua_call_set_user_data_doc
    },
    {
        "call_get_user_data", py_pjsua_call_get_user_data, METH_VARARGS,
        pjsua_call_get_user_data_doc
    },
    {
        "call_answer", py_pjsua_call_answer, METH_VARARGS,
        pjsua_call_answer_doc
    },
    {
        "call_hangup", py_pjsua_call_hangup, METH_VARARGS,
        pjsua_call_hangup_doc
    },
    {
        "call_set_hold", py_pjsua_call_set_hold, METH_VARARGS,
        pjsua_call_set_hold_doc
    },
    {
        "call_reinvite", py_pjsua_call_reinvite, METH_VARARGS,
        pjsua_call_reinvite_doc
    },
    {
        "call_update", py_pjsua_call_update, METH_VARARGS,
        "Send UPDATE"
    },
    {
        "call_xfer", py_pjsua_call_xfer, METH_VARARGS,
        pjsua_call_xfer_doc
    },
    {
        "call_xfer_replaces", py_pjsua_call_xfer_replaces, METH_VARARGS,
        pjsua_call_xfer_replaces_doc
    },
    {
        "call_dial_dtmf", py_pjsua_call_dial_dtmf, METH_VARARGS,
        pjsua_call_dial_dtmf_doc
    },
    {
        "call_send_im", py_pjsua_call_send_im, METH_VARARGS,
        pjsua_call_send_im_doc
    },
    {
        "call_send_typing_ind", py_pjsua_call_send_typing_ind, METH_VARARGS,
        pjsua_call_send_typing_ind_doc
    },
    {
        "call_hangup_all", py_pjsua_call_hangup_all, METH_VARARGS,
        pjsua_call_hangup_all_doc
    },
    {
        "call_dump", py_pjsua_call_dump, METH_VARARGS,
        pjsua_call_dump_doc
    },
    {
        "call_send_request", py_pjsua_call_send_request, METH_VARARGS,
        "Send arbitrary request"
    },
    {
	"dump", py_pjsua_dump, METH_VARARGS, "Dump application state"
    },
    {
	"strerror", py_pj_strerror, METH_VARARGS, "Get error message"
    },
    {
	"parse_simple_uri", py_pj_parse_simple_sip, METH_VARARGS, "Parse URI"
    },

    
    {NULL, NULL} /* end of function list */
};



/*
 * Mapping C structs from and to Python objects & initializing object
 */
DL_EXPORT(void)
init_pjsua(void)
{
    PyObject* m = NULL;
#define ADD_CONSTANT(mod,name)	PyModule_AddIntConstant(mod,#name,name)

    
    PyEval_InitThreads();

    if (PyType_Ready(&PyTyp_pjsua_callback) < 0)
        return;
    if (PyType_Ready(&PyTyp_pjsua_config) < 0)
        return;
    if (PyType_Ready(&PyTyp_pjsua_logging_config) < 0)
        return;
    if (PyType_Ready(&PyTyp_pjsua_msg_data) < 0)
        return;
    PyTyp_pjsua_media_config.tp_new = PyType_GenericNew;
    if (PyType_Ready(&PyTyp_pjsua_media_config) < 0)
        return;
    PyTyp_pjsip_cred_info.tp_new = PyType_GenericNew;
    if (PyType_Ready(&PyTyp_pjsip_cred_info) < 0)
        return;

    /* LIB TRANSPORT */

    if (PyType_Ready(&PyTyp_pjsua_transport_config) < 0)
        return;
    
    if (PyType_Ready(&PyTyp_pjsua_transport_info) < 0)
        return;
    
    /* END OF LIB TRANSPORT */

    /* LIB ACCOUNT */

    
    if (PyType_Ready(&PyTyp_pjsua_acc_config) < 0)
        return;
    if (PyType_Ready(&PyTyp_pjsua_acc_info) < 0)
        return;

    /* END OF LIB ACCOUNT */

    /* LIB BUDDY */

    if (PyType_Ready(&PyTyp_pjsua_buddy_config) < 0)
        return;
    if (PyType_Ready(&PyTyp_pjsua_buddy_info) < 0)
        return;

    /* END OF LIB BUDDY */

    /* LIB MEDIA */
  
    if (PyType_Ready(&PyTyp_pjsua_codec_info) < 0)
        return;

    if (PyType_Ready(&PyTyp_pjsua_conf_port_info) < 0)
        return;

    if (PyType_Ready(&PyTyp_pjmedia_snd_dev_info) < 0)
        return;

    PyTyp_pjmedia_codec_param_info.tp_new = PyType_GenericNew;
    if (PyType_Ready(&PyTyp_pjmedia_codec_param_info) < 0)
        return;
    PyTyp_pjmedia_codec_param_setting.tp_new = PyType_GenericNew;
    if (PyType_Ready(&PyTyp_pjmedia_codec_param_setting) < 0)
        return;

    if (PyType_Ready(&PyTyp_pjmedia_codec_param) < 0)
        return;

    /* END OF LIB MEDIA */

    /* LIB CALL */

    if (PyType_Ready(&PyTyp_pjsua_call_info) < 0)
        return;

    /* END OF LIB CALL */

    m = Py_InitModule3(
        "_pjsua", py_pjsua_methods, "PJSUA-lib module for python"
    );

    Py_INCREF(&PyTyp_pjsua_callback);
    PyModule_AddObject(m, "Callback", (PyObject *)&PyTyp_pjsua_callback);

    Py_INCREF(&PyTyp_pjsua_config);
    PyModule_AddObject(m, "Config", (PyObject *)&PyTyp_pjsua_config);

    Py_INCREF(&PyTyp_pjsua_media_config);
    PyModule_AddObject(m, "Media_Config", (PyObject *)&PyTyp_pjsua_media_config);

    Py_INCREF(&PyTyp_pjsua_logging_config);
    PyModule_AddObject(m, "Logging_Config", (PyObject *)&PyTyp_pjsua_logging_config);

    Py_INCREF(&PyTyp_pjsua_msg_data);
    PyModule_AddObject(m, "Msg_Data", (PyObject *)&PyTyp_pjsua_msg_data);

    Py_INCREF(&PyTyp_pjsip_cred_info);
    PyModule_AddObject(m, "Pjsip_Cred_Info",
        (PyObject *)&PyTyp_pjsip_cred_info
    );

    /* LIB TRANSPORT */

    Py_INCREF(&PyTyp_pjsua_transport_config);
    PyModule_AddObject
        (m, "Transport_Config", (PyObject *)&PyTyp_pjsua_transport_config);
    
    Py_INCREF(&PyTyp_pjsua_transport_info);
    PyModule_AddObject(m, "Transport_Info", (PyObject *)&PyTyp_pjsua_transport_info);
    

    /* END OF LIB TRANSPORT */

    /* LIB ACCOUNT */

    
    Py_INCREF(&PyTyp_pjsua_acc_config);
    PyModule_AddObject(m, "Acc_Config", (PyObject *)&PyTyp_pjsua_acc_config);
    Py_INCREF(&PyTyp_pjsua_acc_info);
    PyModule_AddObject(m, "Acc_Info", (PyObject *)&PyTyp_pjsua_acc_info);

    /* END OF LIB ACCOUNT */

    /* LIB BUDDY */
    
    Py_INCREF(&PyTyp_pjsua_buddy_config);
    PyModule_AddObject(m, "Buddy_Config", (PyObject *)&PyTyp_pjsua_buddy_config);
    Py_INCREF(&PyTyp_pjsua_buddy_info);
    PyModule_AddObject(m, "Buddy_Info", (PyObject *)&PyTyp_pjsua_buddy_info);

    /* END OF LIB BUDDY */

    /* LIB MEDIA */

    Py_INCREF(&PyTyp_pjsua_codec_info);
    PyModule_AddObject(m, "Codec_Info", (PyObject *)&PyTyp_pjsua_codec_info);
    Py_INCREF(&PyTyp_pjsua_conf_port_info);
    PyModule_AddObject(m, "Conf_Port_Info", (PyObject *)&PyTyp_pjsua_conf_port_info);
    Py_INCREF(&PyTyp_pjmedia_snd_dev_info);
    PyModule_AddObject(m, "PJMedia_Snd_Dev_Info", 
	(PyObject *)&PyTyp_pjmedia_snd_dev_info);
    Py_INCREF(&PyTyp_pjmedia_codec_param_info);
    PyModule_AddObject(m, "PJMedia_Codec_Param_Info", 
	(PyObject *)&PyTyp_pjmedia_codec_param_info);
    Py_INCREF(&PyTyp_pjmedia_codec_param_setting);
    PyModule_AddObject(m, "PJMedia_Codec_Param_Setting", 
	(PyObject *)&PyTyp_pjmedia_codec_param_setting);
    Py_INCREF(&PyTyp_pjmedia_codec_param);
    PyModule_AddObject(m, "PJMedia_Codec_Param", 
	(PyObject *)&PyTyp_pjmedia_codec_param);

    /* END OF LIB MEDIA */

    /* LIB CALL */

    Py_INCREF(&PyTyp_pjsua_call_info);
    PyModule_AddObject(m, "Call_Info", (PyObject *)&PyTyp_pjsua_call_info);

    /* END OF LIB CALL */


    /*
     * Add various constants.
     */
    /* Skip it.. */

#undef ADD_CONSTANT
}
