You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sems/apps/webconference/pyqtgui/webconference.py

207 lines
6.3 KiB

#!/usr/bin/python
#
# QT webconf UI
# This was meant as a UI for webconference on the Nokia Internet Tablet,
# but it turns out that xmlrpc over https every second
# uses too much processing power (50-80% cpu) for that device
#
# (c) 2009 Stefan Sayer <sayer at iptel.org>
# License: GPLv3
#
import sys
import random
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from xmlrpclib import *
from threading import *
from conftable import *
from participant import *
from callbox import *
from account import *
# URI for XMLRPC webconference control, set to your server, e.g. for local host:
#CONTROL_URI="http://127.0.0.1:8090/"
CONTROL_URI="https://webconference.iptel.org/control"
print "Server Control URI: '%s' - change CONTROL_URI to use local SEMS instance" % CONTROL_URI
# refresh in ms
REFRESH_INTERVAL=1000
HAS_ACCOUNT=False
try:
from accountconfig import *
HAS_ACCOUNT=True
except:
print "accountconfig.py not found - will ask for account to make calls"
pass
class named_participant(Ui_participant):
def __init__(self, parent, title, callid, id):
self.callid = callid
self.id = id
self.setupUi(parent)
self.parent = parent
self.tag = ""
parent.setWindowTitle(title)
QtCore.QObject.connect(self.bt_ciao, QtCore.SIGNAL("clicked()"), self.ciao_clicked)
QtCore.QObject.connect(self.cb_muted, QtCore.SIGNAL("stateChanged(int)"), self.muted_changed)
def ciao_clicked(self):
self.bt_ciao.emit(QtCore.SIGNAL("ciao(int)"), self.id)
def status2text(self, s):
return { 0: "Disconnected",
1: "Connecting",
2: "Ringing",
3: "Connected",
4: "Disconnecting",
5: "Finished"}[s]
def set_status(self, status, hint, muted):
self.l_status.setText(self.status2text(status))
self.l_status.setToolTip(hint)
if muted:
self.cb_muted.setCheckState(Qt.Checked)
else:
self.cb_muted.setCheckState(Qt.Unchecked)
def muted_changed(self, i):
print "callid is" , self.callid
self.cb_muted.emit(QtCore.SIGNAL("mute(int,bool)"), self.id, self.cb_muted.isChecked())
class StartQT4(QtGui.QMainWindow):
participants = []
roomname = ""
adminpin = ""
s = None
last_res = None
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.show()
if HAS_ACCOUNT:
self.call_domain = DOMAIN
self.call_user = USER
self.call_pwd = PASSWORD
self.call_auth_user = AUTH_USER
else:
dlg = QtGui.QDialog(self)
dlg_cb = Ui_account()
dlg_cb.setupUi(dlg)
if dlg.exec_() == QDialog.Rejected:
raise "well, I need a SIP account to make calls"
self.call_domain = str(dlg_cb.e_domain.text())
self.call_pwd = str(dlg_cb.e_pwd.text())
self.call_user = str(dlg_cb.e_user.text())
self.call_auth_user = self.call_user
QtCore.QObject.connect(self.ui.buttonNew, QtCore.SIGNAL("clicked()"), self.new_call)
self.s = ServerProxy(CONTROL_URI)
print "server has %d running calls " % self.s.calls()
for i in range(10):
self.roomname = ""
for n in range(6):
self.roomname+=str(random.randint(0,9))
code, result, adminpin, serverstatus = self.s.di('webconference', 'roomCreate', self.roomname)
print "server status: %s " % serverstatus
if code == 0:
self.adminpin = adminpin
break
if self.adminpin == "":
raise "oh, could not get a free room :("
print "roomname is %s, adminpin is %s "% (self.roomname, self.adminpin)
self.ui.label.setText("iptel.org\nwebconference\nhttps://webconference.iptel.org\n\nroom: %s adminpin:%s\n\n"
"to dial in call sip:conference@iptel.org \nand type %s*"
%(self.roomname, self.adminpin, self.roomname))
self.timer = QtCore.QTimer(self)
self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.timer_hit)
self.timer.start(REFRESH_INTERVAL)
def timer_hit(self):
res = self.s.di('webconference', 'roomInfo', self.roomname, self.adminpin)
if res[0] != 0:
print "oh my god, can't see this room!"
return
code, reason, participants, serverstatus = res
if participants == self.last_res:
return #optimize a bit
self.last_res = participants
for part in participants:
call_tag, number, status, reason, muted, participant_id = part
found = False
for p in self.participants:
if p.callid == call_tag:
p.set_status(status, reason, muted)
found = True
break
if not found:
p = self.createparticipantWidget(number, call_tag)
p.set_status(status, reason, muted)
def createparticipantWidget(self, name, callid):
w = QtGui.QDockWidget("someone", self.ui.frame_main)
part = named_participant(w, name, callid, len(self.participants))
QtCore.QObject.connect(part.bt_ciao, QtCore.SIGNAL("ciao(int)"), self.part_ciao)
QtCore.QObject.connect(part.cb_muted, QtCore.SIGNAL("mute(int,bool)"), self.part_muted)
self.addDockWidget(random.choice([QtCore.Qt.RightDockWidgetArea, QtCore.Qt.LeftDockWidgetArea, QtCore.Qt.TopDockWidgetArea]), w)
w.setFloating(True)
w.show()
self.participants = self.participants + [ part ]
return part
def new_call(self):
print "a new call."
dlg = QtGui.QDialog(self)
dlg_cb = Ui_callbox()
dlg_cb.setupUi(dlg)
if dlg.exec_() == QDialog.Rejected:
return
print "now calling %s " % dlg_cb.num.text()
res = self.s.di('webconference', 'dialout', self.roomname, self.adminpin, str(dlg_cb.num.text()),
self.call_user, self.call_domain, self.call_auth_user, self.call_pwd)
if res[0] != 0:
print "oh, my dear, calling failed with code %d " % res[0]
return
code, result, callid, serverinfo = res
print "code %d result %s " % (code, result)
print "serverinfo is %s " % serverinfo
self.createparticipantWidget(dlg_cb.num.text(), callid)
def part_ciao(self, id):
print "ciao: ", id
self.s.di('webconference', 'kickout', self.roomname, self.adminpin, self.participants[id].callid)
def part_muted(self, id, s):
print "mute: ", id, " is ", s
if s:
self.s.di('webconference', 'mute', self.roomname, self.adminpin, self.participants[id].callid)
else:
self.s.di('webconference', 'unmute', self.roomname, self.adminpin, self.participants[id].callid)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = StartQT4()
myapp.show()
sys.exit(app.exec_())