coding standards
This commit is contained in:
parent
af44ee0840
commit
11c7de6c34
1 changed files with 94 additions and 79 deletions
|
@ -85,26 +85,27 @@ class JingleSession(object):
|
|||
''' This represents one jingle session. '''
|
||||
def __init__(self, con, weinitiate, jid, sid=None):
|
||||
''' con -- connection object,
|
||||
weinitiate -- boolean, are we the initiator?
|
||||
jid - jid of the other entity'''
|
||||
self.contents={} # negotiated contents
|
||||
self.connection=con # connection to use
|
||||
weinitiate -- boolean, are we the initiator?
|
||||
jid - jid of the other entity'''
|
||||
self.contents = {} # negotiated contents
|
||||
self.connection = con # connection to use
|
||||
# our full jid
|
||||
self.ourjid=gajim.get_jid_from_account(self.connection.name)+'/'+con.server_resource
|
||||
self.peerjid=jid # jid we connect to
|
||||
self.ourjid = gajim.get_jid_from_account(self.connection.name) + '/' + \
|
||||
con.server_resource
|
||||
self.peerjid = jid # jid we connect to
|
||||
# jid we use as the initiator
|
||||
self.initiator=weinitiate and self.ourjid or self.peerjid
|
||||
self.initiator = weinitiate and self.ourjid or self.peerjid
|
||||
# jid we use as the responder
|
||||
self.responder=weinitiate and self.peerjid or self.ourjid
|
||||
self.responder = weinitiate and self.peerjid or self.ourjid
|
||||
# are we an initiator?
|
||||
self.weinitiate=weinitiate
|
||||
self.weinitiate = weinitiate
|
||||
# what state is session in? (one from JingleStates)
|
||||
self.state=JingleStates.ended
|
||||
self.state = JingleStates.ended
|
||||
if not sid:
|
||||
sid=con.connection.getAnID()
|
||||
self.sid=sid # sessionid
|
||||
sid = con.connection.getAnID()
|
||||
self.sid = sid # sessionid
|
||||
|
||||
self.accepted=True # is this session accepted by user
|
||||
self.accepted = True # is this session accepted by user
|
||||
self.candidates_ready = False # True when local candidates are prepared
|
||||
|
||||
# callbacks to call on proper contents
|
||||
|
@ -118,10 +119,13 @@ class JingleSession(object):
|
|||
'content-remove': [self.__defaultCB, self.__contentRemoveCB],
|
||||
'description-info': [self.__defaultCB], #TODO
|
||||
'security-info': [self.__defaultCB], #TODO
|
||||
'session-accept': [self.__sessionAcceptCB, self.__contentAcceptCB, self.__broadcastCB, self.__defaultCB],
|
||||
'session-accept': [self.__sessionAcceptCB, self.__contentAcceptCB,
|
||||
self.__broadcastCB, self.__defaultCB],
|
||||
'session-info': [self.__sessionInfoCB, self.__broadcastCB],
|
||||
'session-initiate': [self.__sessionInitiateCB, self.__broadcastCB, self.__defaultCB],
|
||||
'session-terminate': [self.__sessionTerminateCB, self.__broadcastAllCB, self.__defaultCB],
|
||||
'session-initiate': [self.__sessionInitiateCB, self.__broadcastCB,
|
||||
self.__defaultCB],
|
||||
'session-terminate': [self.__sessionTerminateCB, self.__broadcastAllCB,
|
||||
self.__defaultCB],
|
||||
'transport-info': [self.__broadcastCB, self.__defaultCB],
|
||||
'transport-replace': [self.__broadcastCB, self.__transportReplaceCB], #TODO
|
||||
'transport-accept': [self.__defaultCB], #TODO
|
||||
|
@ -132,12 +136,14 @@ class JingleSession(object):
|
|||
|
||||
''' Interaction with user '''
|
||||
def approveSession(self):
|
||||
''' Called when user accepts session in UI (when we aren't the initiator).'''
|
||||
self.accepted=True
|
||||
''' Called when user accepts session in UI (when we aren't the initiator).
|
||||
'''
|
||||
self.accepted = True
|
||||
self.acceptSession()
|
||||
|
||||
def declineSession(self):
|
||||
''' Called when user declines session in UI (when we aren't the initiator)'''
|
||||
''' Called when user declines session in UI (when we aren't the initiator)
|
||||
'''
|
||||
reason = xmpp.Node('reason')
|
||||
reason.addChild('decline')
|
||||
self.__sessionTerminate(reason)
|
||||
|
@ -151,18 +157,20 @@ class JingleSession(object):
|
|||
Creator must be one of ('we', 'peer', 'initiator', 'responder')'''
|
||||
assert creator in ('we', 'peer', 'initiator', 'responder')
|
||||
|
||||
if self.state==JingleStates.pending:
|
||||
if self.state == JingleStates.pending:
|
||||
raise WrongState
|
||||
|
||||
if (creator=='we' and self.weinitiate) or (creator=='peer' and not self.weinitiate):
|
||||
creator='initiator'
|
||||
elif (creator=='peer' and self.weinitiate) or (creator=='we' and not self.weinitiate):
|
||||
creator='responder'
|
||||
if (creator == 'we' and self.weinitiate) or (creator == 'peer' and \
|
||||
not self.weinitiate):
|
||||
creator = 'initiator'
|
||||
elif (creator == 'peer' and self.weinitiate) or (creator == 'we' and \
|
||||
not self.weinitiate):
|
||||
creator = 'responder'
|
||||
content.creator = creator
|
||||
content.name = name
|
||||
self.contents[(creator,name)]=content
|
||||
self.contents[(creator,name)] = content
|
||||
|
||||
if self.state==JingleStates.active:
|
||||
if self.state == JingleStates.active:
|
||||
pass # TODO: send proper stanza, shouldn't be needed now
|
||||
|
||||
def removeContent(self, creator, name):
|
||||
|
@ -187,7 +195,7 @@ class JingleSession(object):
|
|||
def sendSessionInfo(self): pass
|
||||
|
||||
def sendContentAccept(self, content):
|
||||
assert self.state!=JingleStates.ended
|
||||
assert self.state != JingleStates.ended
|
||||
stanza, jingle = self.__makeJingle('content-accept')
|
||||
jingle.addChild(node=content)
|
||||
self.connection.connection.send(stanza)
|
||||
|
@ -258,7 +266,7 @@ class JingleSession(object):
|
|||
else:
|
||||
stanza, jingle = self.__makeJingle('transport-reject')
|
||||
c = jingle.setTag('content', attrs={'creator': creator,
|
||||
'name': name})
|
||||
'name': name})
|
||||
c.setTag('transport', namespace=transport_ns)
|
||||
self.connection.connection.send(stanza)
|
||||
raise xmpp.NodeProcessed
|
||||
|
@ -267,7 +275,7 @@ class JingleSession(object):
|
|||
#For now, reject the transport
|
||||
stanza, jingle = self.__makeJingle('transport-reject')
|
||||
c = jingle.setTag('content', attrs={'creator': creator,
|
||||
'name': name})
|
||||
'name': name})
|
||||
c.setTag('transport', namespace=transport_ns)
|
||||
self.connection.connection.send(stanza)
|
||||
raise xmpp.NodeProcessed
|
||||
|
@ -357,7 +365,8 @@ class JingleSession(object):
|
|||
self.state = JingleStates.pending
|
||||
|
||||
# Send event about starting a session
|
||||
self.connection.dispatch('JINGLE_INCOMING', (self.initiator, self.sid, contents))
|
||||
self.connection.dispatch('JINGLE_INCOMING', (self.initiator, self.sid,
|
||||
contents))
|
||||
|
||||
def __broadcastCB(self, stanza, jingle, error, action):
|
||||
''' Broadcast the stanza contents to proper content handlers. '''
|
||||
|
@ -419,14 +428,14 @@ class JingleSession(object):
|
|||
self.state=JingleStates.active
|
||||
|
||||
def __sessionInfo(self, payload=None):
|
||||
assert self.state!=JingleStates.ended
|
||||
assert self.state != JingleStates.ended
|
||||
stanza, jingle = self.__makeJingle('session-info')
|
||||
if payload:
|
||||
jingle.addChild(node=payload)
|
||||
self.connection.connection.send(stanza)
|
||||
|
||||
def __sessionTerminate(self, reason=None):
|
||||
assert self.state!=JingleStates.ended
|
||||
assert self.state != JingleStates.ended
|
||||
stanza, jingle = self.__makeJingle('session-terminate')
|
||||
if reason is not None:
|
||||
jingle.addChild(node=reason)
|
||||
|
@ -435,16 +444,16 @@ class JingleSession(object):
|
|||
self.connection.deleteJingle(self)
|
||||
|
||||
def __contentAdd(self):
|
||||
assert self.state==JingleStates.active
|
||||
assert self.state == JingleStates.active
|
||||
|
||||
def __contentAccept(self):
|
||||
assert self.state!=JingleStates.ended
|
||||
assert self.state != JingleStates.ended
|
||||
|
||||
def __contentModify(self):
|
||||
assert self.state!=JingleStates.ended
|
||||
assert self.state != JingleStates.ended
|
||||
|
||||
def __contentRemove(self):
|
||||
assert self.state!=JingleStates.ended
|
||||
assert self.state != JingleStates.ended
|
||||
|
||||
|
||||
class JingleTransport(object):
|
||||
|
@ -469,7 +478,7 @@ class JingleContent(object):
|
|||
self.senders = 'both' #FIXME
|
||||
self.allow_sending = True # Used for stream direction, attribute 'senders'
|
||||
|
||||
self.callbacks = {
|
||||
self.callbacks = {
|
||||
# these are called when *we* get stanzas
|
||||
'content-accept': [],
|
||||
'content-add': [],
|
||||
|
@ -507,21 +516,21 @@ class JingleContent(object):
|
|||
#cand.type = farsight.CANDIDATE_TYPE_LOCAL
|
||||
cand.priority = int(candidate['priority'])
|
||||
|
||||
if candidate['protocol']=='udp':
|
||||
if candidate['protocol'] == 'udp':
|
||||
cand.proto=farsight.NETWORK_PROTOCOL_UDP
|
||||
else:
|
||||
# we actually don't handle properly different tcp options in jingle
|
||||
cand.proto=farsight.NETWORK_PROTOCOL_TCP
|
||||
cand.proto = farsight.NETWORK_PROTOCOL_TCP
|
||||
|
||||
cand.username = str(transport['ufrag'])
|
||||
cand.password = str(transport['pwd'])
|
||||
|
||||
#FIXME: huh?
|
||||
types = {'host': farsight.CANDIDATE_TYPE_HOST,
|
||||
'srflx': farsight.CANDIDATE_TYPE_SRFLX,
|
||||
'prflx': farsight.CANDIDATE_TYPE_PRFLX,
|
||||
'relay': farsight.CANDIDATE_TYPE_RELAY,
|
||||
'multicast': farsight.CANDIDATE_TYPE_MULTICAST}
|
||||
'srflx': farsight.CANDIDATE_TYPE_SRFLX,
|
||||
'prflx': farsight.CANDIDATE_TYPE_PRFLX,
|
||||
'relay': farsight.CANDIDATE_TYPE_RELAY,
|
||||
'multicast': farsight.CANDIDATE_TYPE_MULTICAST}
|
||||
if 'type' in candidate and candidate['type'] in types:
|
||||
cand.type = types[candidate['type']]
|
||||
candidates.append(cand)
|
||||
|
@ -538,10 +547,10 @@ class JingleContent(object):
|
|||
|
||||
def __candidate(self, candidate):
|
||||
types = {farsight.CANDIDATE_TYPE_HOST: 'host',
|
||||
farsight.CANDIDATE_TYPE_SRFLX: 'srlfx',
|
||||
farsight.CANDIDATE_TYPE_PRFLX: 'prlfx',
|
||||
farsight.CANDIDATE_TYPE_RELAY: 'relay',
|
||||
farsight.CANDIDATE_TYPE_MULTICAST: 'multicast'}
|
||||
farsight.CANDIDATE_TYPE_SRFLX: 'srlfx',
|
||||
farsight.CANDIDATE_TYPE_PRFLX: 'prlfx',
|
||||
farsight.CANDIDATE_TYPE_RELAY: 'relay',
|
||||
farsight.CANDIDATE_TYPE_MULTICAST: 'multicast'}
|
||||
attrs={
|
||||
'component': candidate.component_id,
|
||||
'foundation': '1', # hack
|
||||
|
@ -554,10 +563,10 @@ class JingleContent(object):
|
|||
if candidate.type in types:
|
||||
attrs['type'] = types[candidate.type]
|
||||
if candidate.proto==farsight.NETWORK_PROTOCOL_UDP:
|
||||
attrs['protocol']='udp'
|
||||
attrs['protocol'] = 'udp'
|
||||
else:
|
||||
# we actually don't handle properly different tcp options in jingle
|
||||
attrs['protocol']='tcp'
|
||||
attrs['protocol'] = 'tcp'
|
||||
return xmpp.Node('candidate', attrs=attrs)
|
||||
|
||||
def iterCandidates(self):
|
||||
|
@ -565,11 +574,11 @@ class JingleContent(object):
|
|||
yield self.__candidate(candidate)
|
||||
|
||||
def send_candidate(self, candidate):
|
||||
c=self.__content()
|
||||
t=c.addChild(xmpp.NS_JINGLE_ICE_UDP+' transport')
|
||||
c = self.__content()
|
||||
t = c.addChild(xmpp.NS_JINGLE_ICE_UDP + ' transport')
|
||||
|
||||
if candidate.username: t['ufrag']=candidate.username
|
||||
if candidate.password: t['pwd']=candidate.password
|
||||
if candidate.username: t['ufrag'] = candidate.username
|
||||
if candidate.password: t['pwd'] = candidate.password
|
||||
|
||||
t.addChild(node=self.__candidate(candidate))
|
||||
self.session.sendTransportInfo(c)
|
||||
|
@ -578,14 +587,14 @@ class JingleContent(object):
|
|||
''' Add our things to session-initiate stanza. '''
|
||||
self._fillContent(content)
|
||||
|
||||
if self.candidates and self.candidates[0].username and self.candidates[0].password:
|
||||
if self.candidates and self.candidates[0].username and \
|
||||
self.candidates[0].password:
|
||||
attrs = {'ufrag': self.candidates[0].username,
|
||||
'pwd': self.candidates[0].password}
|
||||
'pwd': self.candidates[0].password}
|
||||
else:
|
||||
attrs = {}
|
||||
content.addChild(xmpp.NS_JINGLE_ICE_UDP+' transport', attrs=attrs,
|
||||
payload=self.iterCandidates())
|
||||
|
||||
content.addChild(xmpp.NS_JINGLE_ICE_UDP + ' transport', attrs=attrs,
|
||||
payload=self.iterCandidates())
|
||||
|
||||
class JingleRTPContent(JingleContent):
|
||||
def __init__(self, session, media, node=None):
|
||||
|
@ -613,8 +622,8 @@ class JingleRTPContent(JingleContent):
|
|||
self.funnel = None
|
||||
|
||||
def _fillContent(self, content):
|
||||
content.addChild(xmpp.NS_JINGLE_RTP+' description', attrs={'media': self.media},
|
||||
payload=self.iterCodecs())
|
||||
content.addChild(xmpp.NS_JINGLE_RTP + ' description',
|
||||
attrs={'media': self.media}, payload=self.iterCodecs())
|
||||
|
||||
def _on_gst_message(self, bus, message):
|
||||
if message.type == gst.MESSAGE_ELEMENT:
|
||||
|
@ -631,7 +640,8 @@ class JingleRTPContent(JingleContent):
|
|||
elif name == 'farsight-new-local-candidate':
|
||||
candidate = message.structure['candidate']
|
||||
self.candidates.append(candidate)
|
||||
if self.session.candidates_ready: #FIXME: Is this case even possible?
|
||||
if self.session.candidates_ready:
|
||||
#FIXME: Is this case even possible?
|
||||
self.send_candidate(candidate)
|
||||
elif name == 'farsight-component-state-changed':
|
||||
state = message.structure['state']
|
||||
|
@ -641,7 +651,8 @@ class JingleRTPContent(JingleContent):
|
|||
#TODO: farsight.DIRECTION_BOTH only if senders='both'
|
||||
self.p2pstream.set_property('direction', farsight.DIRECTION_BOTH)
|
||||
#if not self.session.weinitiate: #FIXME: one more FIXME...
|
||||
# self.session.sendContentAccept(self.__content((xmpp.Node('description', payload=self.iterCodecs()),)))
|
||||
# self.session.sendContentAccept(self.__content((xmpp.Node(
|
||||
# 'description', payload=self.iterCodecs()),)))
|
||||
elif name == 'farsight-error':
|
||||
print 'Farsight error #%d!' % message.structure['error-no']
|
||||
print 'Message: %s' % message.structure['error-msg']
|
||||
|
@ -656,30 +667,32 @@ class JingleRTPContent(JingleContent):
|
|||
codecs = []
|
||||
for codec in content.getTag('description').iterTags('payload-type'):
|
||||
c = farsight.Codec(int(codec['id']), codec['name'],
|
||||
farsight.MEDIA_TYPE_AUDIO, int(codec['clockrate']))
|
||||
farsight.MEDIA_TYPE_AUDIO, int(codec['clockrate']))
|
||||
if 'channels' in codec:
|
||||
c.channels = int(codec['channels'])
|
||||
else:
|
||||
c.channels = 1
|
||||
c.optional_params = [(str(p['name']), str(p['value'])) for p in codec.iterTags('parameter')]
|
||||
c.optional_params = [(str(p['name']), str(p['value'])) for p in \
|
||||
codec.iterTags('parameter')]
|
||||
codecs.append(c)
|
||||
if len(codecs)==0: return
|
||||
if len(codecs) == 0: return
|
||||
|
||||
#FIXME: Handle this case:
|
||||
# glib.GError: There was no intersection between the remote codecs and the local ones
|
||||
# glib.GError: There was no intersection between the remote codecs and
|
||||
# the local ones
|
||||
self.p2pstream.set_remote_codecs(codecs)
|
||||
self.got_codecs=True
|
||||
self.got_codecs = True
|
||||
|
||||
def iterCodecs(self):
|
||||
codecs=self.p2psession.get_property('codecs')
|
||||
for codec in codecs:
|
||||
a = {'name': codec.encoding_name,
|
||||
'id': codec.id,
|
||||
'channels': codec.channels}
|
||||
'id': codec.id,
|
||||
'channels': codec.channels}
|
||||
if codec.clock_rate: a['clockrate']=codec.clock_rate
|
||||
if codec.optional_params:
|
||||
p = (xmpp.Node('parameter', {'name': name, 'value': value})
|
||||
for name, value in codec.optional_params)
|
||||
for name, value in codec.optional_params)
|
||||
else: p = ()
|
||||
yield xmpp.Node('payload-type', a, p)
|
||||
|
||||
|
@ -708,7 +721,7 @@ class JingleVoIP(JingleRTPContent):
|
|||
# the network part
|
||||
participant = self.conference.new_participant(self.session.peerjid)
|
||||
params = {'controlling-mode': self.session.weinitiate,# 'debug': False}
|
||||
'stun-ip': '69.0.208.27', 'debug': False}
|
||||
'stun-ip': '69.0.208.27', 'debug': False}
|
||||
|
||||
self.p2psession = self.conference.new_session(farsight.MEDIA_TYPE_AUDIO)
|
||||
|
||||
|
@ -716,13 +729,13 @@ class JingleVoIP(JingleRTPContent):
|
|||
#FIXME: codec ID is an important thing for psi (and pidgin?)
|
||||
# So, if it doesn't work with pidgin or psi, LOOK AT THIS
|
||||
codecs = [farsight.Codec(farsight.CODEC_ID_ANY, 'SPEEX',
|
||||
farsight.MEDIA_TYPE_AUDIO, 8000),
|
||||
farsight.Codec(farsight.CODEC_ID_ANY, 'SPEEX',
|
||||
farsight.MEDIA_TYPE_AUDIO, 16000)]
|
||||
farsight.MEDIA_TYPE_AUDIO, 8000),
|
||||
farsight.Codec(farsight.CODEC_ID_ANY, 'SPEEX',
|
||||
farsight.MEDIA_TYPE_AUDIO, 16000)]
|
||||
self.p2psession.set_codec_preferences(codecs)
|
||||
|
||||
self.p2pstream = self.p2psession.new_stream(participant, farsight.DIRECTION_NONE,
|
||||
'nice', params)
|
||||
self.p2pstream = self.p2psession.new_stream(participant,
|
||||
farsight.DIRECTION_NONE, 'nice', params)
|
||||
|
||||
# the local parts
|
||||
# TODO: use gconfaudiosink?
|
||||
|
@ -754,7 +767,8 @@ class JingleVoIP(JingleRTPContent):
|
|||
self.funnel.link(sink)
|
||||
pad.link(self.funnel.get_pad('sink%d'))
|
||||
|
||||
self.mic_volume.get_pad('src').link(self.p2psession.get_property('sink-pad'))
|
||||
self.mic_volume.get_pad('src').link(self.p2psession.get_property(
|
||||
'sink-pad'))
|
||||
self.p2pstream.connect('src-pad-added', src_pad_added)
|
||||
|
||||
# The following is needed for farsight to process ICE requests:
|
||||
|
@ -775,7 +789,7 @@ class ConnectionJingle(object):
|
|||
''' Add a jingle session to a jingle stanza dispatcher
|
||||
jingle - a JingleSession object.
|
||||
'''
|
||||
self.__sessions[(jingle.peerjid, jingle.sid)]=jingle
|
||||
self.__sessions[(jingle.peerjid, jingle.sid)] = jingle
|
||||
|
||||
def deleteJingle(self, jingle):
|
||||
''' Remove a jingle session from a jingle stanza dispatcher '''
|
||||
|
@ -812,13 +826,14 @@ class ConnectionJingle(object):
|
|||
raise xmpp.NodeProcessed
|
||||
|
||||
def addJingleIqCallback(self, jid, id, jingle):
|
||||
self.__iq_responses[(jid, id)]=jingle
|
||||
self.__iq_responses[(jid, id)] = jingle
|
||||
|
||||
def startVoIP(self, jid):
|
||||
jingle = JingleSession(self, weinitiate=True, jid=jid)
|
||||
self.addJingle(jingle)
|
||||
jingle.addContent('voice', JingleVoIP(jingle))
|
||||
jingle.startSession()
|
||||
|
||||
def getJingleSession(self, jid, sid):
|
||||
try:
|
||||
return self.__sessions[(jid, sid)]
|
||||
|
|
Loading…
Add table
Reference in a new issue