summaryrefslogtreecommitdiff
path: root/pjsip-apps/src/pygui/buddy.py
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip-apps/src/pygui/buddy.py')
-rw-r--r--pjsip-apps/src/pygui/buddy.py152
1 files changed, 152 insertions, 0 deletions
diff --git a/pjsip-apps/src/pygui/buddy.py b/pjsip-apps/src/pygui/buddy.py
new file mode 100644
index 00000000..33537fc0
--- /dev/null
+++ b/pjsip-apps/src/pygui/buddy.py
@@ -0,0 +1,152 @@
+# $Id$
+#
+# pjsua Python GUI Demo
+#
+# Copyright (C)2013 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
+#
+import sys
+if sys.version_info[0] >= 3: # Python 3
+ import tkinter as tk
+ from tkinter import ttk
+ from tkinter import messagebox as msgbox
+else:
+ import Tkinter as tk
+ import tkMessageBox as msgbox
+ import ttk
+
+import random
+import pjsua2 as pj
+import endpoint
+import application
+
+# Buddy class
+class Buddy(pj.Buddy):
+ """
+ High level Python Buddy object, derived from pjsua2's Buddy object.
+ """
+ def __init__(self, app):
+ pj.Buddy.__init__(self)
+ self.app = app
+ self.randId = random.randint(1, 9999)
+ self.cfg = None
+ self.account = None
+
+ def statusText(self):
+ bi = self.getInfo()
+ status = ''
+ if bi.subState == pj.PJSIP_EVSUB_STATE_ACTIVE:
+ if bi.presStatus.status == pj.PJSUA_BUDDY_STATUS_ONLINE:
+ status = bi.presStatus.statusText
+ if not status:
+ status = 'Online'
+ elif bi.presStatus.status == pj.PJSUA_BUDDY_STATUS_OFFLINE:
+ status = 'Offline'
+ else:
+ status = 'Unknown'
+ return status
+
+ def onBuddyState(self):
+ self.app.updateBuddy(self)
+
+class SettingDialog(tk.Toplevel):
+ """
+ This implements buddy settings dialog to manipulate buddy settings.
+ """
+ def __init__(self, parent, cfg):
+ tk.Toplevel.__init__(self, parent)
+ self.transient(parent)
+ self.parent = parent
+ self.geometry("+100+100")
+ self.title('Buddy settings')
+
+ self.frm = ttk.Frame(self)
+ self.frm.pack(expand='yes', fill='both')
+
+ self.isOk = False
+ self.cfg = cfg
+
+ self.createWidgets()
+
+ def doModal(self):
+ if self.parent:
+ self.parent.wait_window(self)
+ else:
+ self.wait_window(self)
+ return self.isOk
+
+ def createWidgets(self):
+ # The notebook
+ self.frm.rowconfigure(0, weight=1)
+ self.frm.rowconfigure(1, weight=0)
+ self.frm.columnconfigure(0, weight=1)
+ self.frm.columnconfigure(1, weight=1)
+ self.wTab = ttk.Notebook(self.frm)
+ self.wTab.grid(column=0, row=0, columnspan=2, padx=5, pady=5, sticky=tk.N+tk.S+tk.W+tk.E)
+
+ # Main buttons
+ btnOk = ttk.Button(self.frm, text='Ok', command=self.onOk)
+ btnOk.grid(column=0, row=1, sticky=tk.E, padx=20, pady=10)
+ btnCancel = ttk.Button(self.frm, text='Cancel', command=self.onCancel)
+ btnCancel.grid(column=1, row=1, sticky=tk.W, padx=20, pady=10)
+
+ # Tabs
+ self.createBasicTab()
+
+ def createBasicTab(self):
+ # Prepare the variables to set/receive values from GUI
+ self.cfgUri = tk.StringVar()
+ self.cfgUri.set( self.cfg.uri )
+ self.cfgSubscribe = tk.IntVar()
+ self.cfgSubscribe.set(self.cfg.subscribe)
+
+ # Build the tab page
+ frm = ttk.Frame(self.frm)
+ frm.columnconfigure(0, weight=1)
+ frm.columnconfigure(1, weight=2)
+ row = 0
+ ttk.Label(frm, text='URI:').grid(row=row, column=0, sticky=tk.E, pady=2)
+ ttk.Entry(frm, textvariable=self.cfgUri, width=40).grid(row=row, column=1, sticky=tk.W+tk.E, padx=6)
+ row += 1
+ ttk.Checkbutton(frm, text='Subscribe presence', variable=self.cfgSubscribe).grid(row=row, column=1, sticky=tk.W, padx=6, pady=2)
+
+ self.wTab.add(frm, text='Basic Settings')
+
+
+ def onOk(self):
+ # Check basic settings
+ errors = "";
+ if self.cfgUri.get():
+ if not endpoint.validateSipUri(self.cfgUri.get()):
+ errors += "Invalid Buddy URI: '%s'\n" % (self.cfgUri.get())
+
+ if errors:
+ msgbox.showerror("Error detected:", errors)
+ return
+
+ # Basic settings
+ self.cfg.uri = self.cfgUri.get()
+ self.cfg.subscribe = self.cfgSubscribe.get()
+
+ self.isOk = True
+ self.destroy()
+
+ def onCancel(self):
+ self.destroy()
+
+
+if __name__ == '__main__':
+ application.main()