summaryrefslogtreecommitdiff
path: root/pjsip-apps/src/swig/python
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip-apps/src/swig/python')
-rw-r--r--pjsip-apps/src/swig/python/Makefile29
-rw-r--r--pjsip-apps/src/swig/python/helper.mak20
-rw-r--r--pjsip-apps/src/swig/python/setup.py118
-rw-r--r--pjsip-apps/src/swig/python/test.py112
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