diff options
Diffstat (limited to 'pjsip-apps/src/swig/python')
-rw-r--r-- | pjsip-apps/src/swig/python/Makefile | 29 | ||||
-rw-r--r-- | pjsip-apps/src/swig/python/helper.mak | 20 | ||||
-rw-r--r-- | pjsip-apps/src/swig/python/setup.py | 118 | ||||
-rw-r--r-- | pjsip-apps/src/swig/python/test.py | 112 |
4 files changed, 279 insertions, 0 deletions
diff --git a/pjsip-apps/src/swig/python/Makefile b/pjsip-apps/src/swig/python/Makefile new file mode 100644 index 00000000..80af9bf9 --- /dev/null +++ b/pjsip-apps/src/swig/python/Makefile @@ -0,0 +1,29 @@ +PYTHON_SO=_pjsua2.so + +#PYTHON_SETUP_FLAGS = --inplace +ifeq ($(OS),Windows_NT) + PYTHON_SETUP_FLAGS += --compiler=mingw32 +endif + +SWIG_FLAGS += -w312 + +.PHONY: all install uninstall + +all: $(PYTHON_SO) + +$(PYTHON_SO): pjsua2_wrap.cpp setup.py + python setup.py build $(PYTHON_SETUP_FLAGS) + +pjsua2_wrap.cpp: ../pjsua2.i ../symbols.i Makefile $(SRCS) + swig $(SWIG_FLAGS) -python -o pjsua2_wrap.cpp ../pjsua2.i + +clean distclean realclean: + rm -rf $(PYTHON_SO) pjsua2_wrap.cpp pjsua2_wrap.h pjsua2.py build *.pyc + +install: + python setup.py install --user + +uninstall: + rm -f $(HOME)/.local/lib/python2.7/site-packages/pjsua2* + rm -f $(HOME)/.local/lib/python2.7/site-packages/_pjsua2* + diff --git a/pjsip-apps/src/swig/python/helper.mak b/pjsip-apps/src/swig/python/helper.mak new file mode 100644 index 00000000..41baf2b2 --- /dev/null +++ b/pjsip-apps/src/swig/python/helper.mak @@ -0,0 +1,20 @@ +include ../../../../build.mak + +lib_dir: + @for token in `echo $(APP_LDFLAGS)`; do \ + echo $$token | grep L | sed 's/-L//'; \ + done + +inc_dir: + @for token in `echo $(APP_CFLAGS)`; do \ + echo $$token | grep I | sed 's/-I//'; \ + done + +libs: + @for token in `echo $(APP_LDLIBS)`; do \ + echo $$token | grep \\-l | sed 's/-l//'; \ + done + +target_name: + @echo $(TARGET_NAME) + diff --git a/pjsip-apps/src/swig/python/setup.py b/pjsip-apps/src/swig/python/setup.py new file mode 100644 index 00000000..16842e51 --- /dev/null +++ b/pjsip-apps/src/swig/python/setup.py @@ -0,0 +1,118 @@ +# $Id$ +# +# pjsua2 Setup script. +# +# Copyright (C)2012 Teluu Inc. (http://www.teluu.com) +# +# 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 +# +from distutils.core import setup, Extension +import os +import sys +import platform + +# find pjsip version +pj_version="" +pj_version_major="" +pj_version_minor="" +pj_version_rev="" +pj_version_suffix="" +f = open('../../../../version.mak', 'r') +for line in f: + if line.find("export PJ_VERSION_MAJOR") != -1: + tokens=line.split("=") + if len(tokens)>1: + pj_version_major= tokens[1].strip() + elif line.find("export PJ_VERSION_MINOR") != -1: + tokens=line.split("=") + if len(tokens)>1: + pj_version_minor= line.split("=")[1].strip() + elif line.find("export PJ_VERSION_REV") != -1: + tokens=line.split("=") + if len(tokens)>1: + pj_version_rev= line.split("=")[1].strip() + elif line.find("export PJ_VERSION_SUFFIX") != -1: + tokens=line.split("=") + if len(tokens)>1: + pj_version_suffix= line.split("=")[1].strip() + +f.close() +if not pj_version_major: + print 'Unable to get PJ_VERSION_MAJOR' + sys.exit(1) + +pj_version = pj_version_major + "." + pj_version_minor +if pj_version_rev: + pj_version += "." + pj_version_rev +if pj_version_suffix: + pj_version += "-" + pj_version_suffix + +#print 'PJ_VERSION = "'+ pj_version + '"' + +# Get targetname +f = os.popen("make --no-print-directory -f helper.mak target_name") +pj_target_name = f.read().rstrip("\r\n") +f.close() + +# Fill in pj_inc_dirs +pj_inc_dirs = [] +f = os.popen("make --no-print-directory -f helper.mak inc_dir") +for line in f: + pj_inc_dirs.append(line.rstrip("\r\n")) +f.close() + +# Fill in pj_lib_dirs +pj_lib_dirs = [] +f = os.popen("make --no-print-directory -f helper.mak lib_dir") +for line in f: + pj_lib_dirs.append(line.rstrip("\r\n")) +f.close() + +# Fill in pj_libs +pj_libs = ['pjsua2-' + pj_target_name] +f = os.popen("make --no-print-directory -f helper.mak libs") +for line in f: + pj_libs.append(line.rstrip("\r\n")) +f.close() + +# Fill in extra link args +extra_link_args = ['-static-libstdc++'] +if platform.system() == 'Darwin': + # Mac OS X depedencies + extra_link_args += ["-framework", "CoreFoundation", + "-framework", "AudioToolbox", + "-framework", "QTKit"] + # OS X Lion support + if platform.mac_ver()[0].startswith("10.7"): + extra_link_args += ["-framework", "AudioUnit"] + + +setup(name="pjsua2", + version=pj_version, + description='SIP User Agent Library based on PJSIP', + url='http://www.pjsip.org', + ext_modules = [Extension("_pjsua2", + ["pjsua2_wrap.cpp"], + define_macros=[('PJ_AUTOCONF', '1'),], + include_dirs=pj_inc_dirs, + library_dirs=pj_lib_dirs, + libraries=pj_libs, + extra_link_args=extra_link_args + ) + ], + py_modules=["pjsua2"] + ) + + diff --git a/pjsip-apps/src/swig/python/test.py b/pjsip-apps/src/swig/python/test.py new file mode 100644 index 00000000..dc805c77 --- /dev/null +++ b/pjsip-apps/src/swig/python/test.py @@ -0,0 +1,112 @@ +import pjsua2 as pj +import sys + +# +# Basic data structure test, to make sure basic struct +# and array operations work +# +def ua_data_test(): + # + # AuthCredInfo + # + print "UA data types test.." + the_realm = "pjsip.org" + ci = pj.AuthCredInfo() + ci.realm = the_realm + ci.dataType = 20 + + ci2 = ci + assert ci.dataType == 20 + assert ci2.realm == the_realm + + # + # UaConfig + # See here how we manipulate std::vector + # + uc = pj.UaConfig() + uc.maxCalls = 10 + uc.userAgent = "Python" + uc.nameserver = pj.StringVector(["10.0.0.1", "10.0.0.2"]) + uc.nameserver.append("NS1") + + uc2 = uc + assert uc2.maxCalls == 10 + assert uc2.userAgent == "Python" + assert len(uc2.nameserver) == 3 + assert uc2.nameserver[0] == "10.0.0.1" + assert uc2.nameserver[1] == "10.0.0.2" + assert uc2.nameserver[2] == "NS1" + + print " Dumping nameservers: ", + for s in uc2.nameserver: + print s, + print "" + +# +# Exception test +# +def ua_run_test_exception(): + print "Exception test.." + ep = pj.Endpoint() + ep.libCreate() + got_exception = False + try: + ep.natDetectType() + except pj.Error, e: + got_exception = True + print " Got exception: status=%u, reason=%s,\n title=%s,\n srcFile=%s, srcLine=%d" % \ + (e.status, e.reason, e.title, e.srcFile, e.srcLine) + assert e.status == 370050 + assert e.reason.find("PJNATH_ESTUNINSERVER") >= 0 + assert e.title == "pjsua_detect_nat_type()" + assert got_exception + +# +# Custom log writer +# +class MyLogWriter(pj.LogWriter): + def write(self, entry): + print "This is Python:", entry.msg + +# +# Testing log writer callback +# +def ua_run_log_test(): + print "Logging test.." + ep_cfg = pj.EpConfig() + + lw = MyLogWriter() + ep_cfg.logConfig.writer = lw + ep_cfg.logConfig.decor = ep_cfg.logConfig.decor & ~(pj.PJ_LOG_HAS_CR | pj.PJ_LOG_HAS_NEWLINE) + + ep = pj.Endpoint() + ep.libCreate() + ep.libInit(ep_cfg) + ep.libDestroy() + +# +# Simple create, init, start, and destroy sequence +# +def ua_run_ua_test(): + print "UA test run.." + ep_cfg = pj.EpConfig() + + ep = pj.Endpoint() + ep.libCreate() + ep.libInit(ep_cfg) + ep.libStart() + + print "************* Endpoint started ok, now shutting down... *************" + ep.libDestroy() + +# +# main() +# +if __name__ == "__main__": + ua_data_test() + ua_run_test_exception() + ua_run_log_test() + ua_run_ua_test() + sys.exit(0) + +
\ No newline at end of file |