Beispiel #1
0
 def __init__(self, buf = None, method = None, ruri = None, sipver = 'SIP/2.0', to = None, fr0m = None, via = None, cseq = None, \
              callid = None, maxforwards = None, body = None, contact = None, routes = (), target = None, cguid = None,
              user_agent = None, expires = None):
     SipMsg.__init__(self, buf)
     if buf != None:
         return
     self.method = method
     self.ruri = ruri
     if target == None:
         if len(routes) == 0:
             self.setTarget(self.ruri.getAddr())
         else:
             self.setTarget(routes[0].getAddr())
     else:
         self.setTarget(target)
     self.sipver = sipver
     self.appendHeader(SipHeader(name = 'via', body = via))
     if via == None:
         self.getHFBody('via').genBranch()
     self.appendHeaders([SipHeader(name = 'route', body = x) for x in routes])
     self.appendHeader(SipHeader(name = 'max-forwards', body = maxforwards))
     self.appendHeader(SipHeader(name = 'from', body = fr0m))
     if to == None:
         to = SipTo(address = SipAddress(url = ruri))
     self.appendHeader(SipHeader(name = 'to', body = to))
     self.appendHeader(SipHeader(name = 'call-id', body = callid))
     self.appendHeader(SipHeader(name = 'cseq', body = SipCSeq(cseq = cseq, method = method)))
     if contact != None:
         self.appendHeader(SipHeader(name = 'contact', body = contact))
     if expires == None and method == 'INVITE':
         expires = SipHeader(name = 'expires')
         self.appendHeader(expires)
     elif expires != None:
         expires = SipHeader(name = 'expires', body = expires)
         self.appendHeader(expires)
     if user_agent != None:
         self.user_agent = user_agent
         self.appendHeader(SipHeader(name = 'user-agent', bodys = user_agent))
     else:
         self.appendHeader(SipHeader(name = 'user-agent'))
     if cguid != None:
         self.appendHeader(SipHeader(name = 'cisco-guid', body = cguid))
         self.appendHeader(SipHeader(name = 'h323-conf-id', body = cguid))
     if body != None:
         self.setBody(body)
Beispiel #2
0
 def recvRequest(self, req):
     if req.getMethod() != 'INVITE':
         #print 'wrong request %s in the Trying state' % req.getMethod()
         return None
     self.ua.origin = 'caller'
     #print 'INVITE received in the Idle state, going to the Trying state'
     if req.countHFs('cisco-guid') != 0:
         try:
             self.ua.cGUID = req.getHFBody('cisco-guid').getCopy()
         except:
             self.ua.cGUID = SipCiscoGUID()
     elif req.countHFs('h323-conf-id') != 0:
         try:
             self.ua.cGUID = req.getHFBody('h323-conf-id').getCopy()
         except:
             self.ua.cGUID = SipCiscoGUID()
     else:
         self.ua.cGUID = SipCiscoGUID()
     self.ua.uasResp = req.genResponse(100,
                                       'Trying',
                                       server=self.ua.local_ua)
     self.ua.lCSeq = 100  # XXX: 100 for debugging so that incorrect CSeq generation will be easily spotted
     if self.ua.lContact == None:
         self.ua.lContact = SipContact()
     self.ua.rTarget = req.getHFBody('contact').getUrl().getCopy()
     self.ua.routes = [
         x.getCopy() for x in self.ua.uasResp.getHFBodys('record-route')
     ]
     if len(self.ua.routes) > 0:
         if not self.ua.routes[0].getUrl().lr:
             self.ua.routes.append(
                 SipRoute(address=SipAddress(url=self.ua.rTarget)))
             self.ua.rTarget = self.ua.routes.pop(0).getUrl()
             self.ua.rAddr = self.ua.rTarget.getAddr()
         elif self.ua.outbound_proxy != None:
             self.ua.routes.append(
                 SipRoute(address=SipAddress(url=self.ua.rTarget)))
             self.ua.rTarget = self.ua.routes[0].getUrl().getCopy()
             self.ua.rTarget.lr = False
             self.ua.rTarget.other = tuple()
             self.ua.rTarget.headers = tuple()
         else:
             self.ua.rAddr = self.ua.routes[0].getAddr()
     else:
         self.ua.rAddr = self.ua.rTarget.getAddr()
     self.ua.rAddr0 = self.ua.rAddr
     self.ua.global_config['_sip_tm'].sendResponse(
         self.ua.uasResp, lossemul=self.ua.uas_lossemul)
     self.ua.uasResp.getHFBody('to').setTag(self.ua.lTag)
     self.ua.lUri = SipFrom(
         address=self.ua.uasResp.getHFBody('to').getUri())
     self.ua.rUri = SipTo(
         address=self.ua.uasResp.getHFBody('from').getUri())
     self.ua.cId = self.ua.uasResp.getHFBody('call-id')
     self.ua.global_config['_sip_tm'].regConsumer(
         self.ua, str(self.ua.cId), compact=self.ua.compact_sip)
     if req.countHFs('authorization') == 0:
         auth = None
     else:
         auth = req.getHFBody('authorization').getCopy()
     body = req.getBody()
     self.ua.branch = req.getHFBody('via').getBranch()
     event = CCEventTry((self.ua.cId, self.ua.cGUID, self.ua.rUri.getUrl().username, req.getRURI().username, body, auth, \
       self.ua.rUri.getUri().name), rtime = req.rtime, origin = self.ua.origin)
     try:
         event.reason = req.getHFBody('reason')
     except:
         pass
     try:
         event.max_forwards = req.getHFBody('max-forwards').getNum()
     except:
         pass
     if self.ua.expire_time != None:
         self.ua.expire_time += event.rtime
     if self.ua.no_progress_time != None:
         self.ua.no_progress_time += event.rtime
         if self.ua.expire_time != None and self.ua.no_progress_time >= self.ua.expire_time:
             self.ua.no_progress_time = None
     if self.ua.no_progress_time != None:
         self.ua.no_progress_timer = TimeoutAbs(self.ua.no_progress_expires,
                                                self.ua.no_progress_time)
     elif self.ua.expire_time != None:
         self.ua.expire_timer = TimeoutAbs(self.ua.expires,
                                           self.ua.expire_time)
     if body != None:
         if self.ua.on_remote_sdp_change != None:
             self.ua.on_remote_sdp_change(
                 body,
                 lambda x: self.ua.delayed_remote_sdp_update(event, x))
             self.ua.setup_ts = req.rtime
             return (UasStateTrying, )
         else:
             self.ua.rSDP = body.getCopy()
     else:
         self.ua.rSDP = None
     self.ua.equeue.append(event)
     self.ua.setup_ts = req.rtime
     return (UasStateTrying, )
Beispiel #3
0
 def recvEvent(self, event):
     if isinstance(event, CCEventTry):
         if self.ua.setup_ts == None:
             self.ua.setup_ts = event.rtime
         self.ua.origin = 'callee'
         cId, cGUID, callingID, calledID, body, auth, callingName = event.getData(
         )
         if body != None and self.ua.on_local_sdp_change != None and body.needs_update:
             self.ua.on_local_sdp_change(body,
                                         lambda x: self.ua.recvEvent(event))
             return None
         if cId == None:
             self.ua.cId = SipCallId()
         else:
             self.ua.cId = cId.getCopy()
         self.ua.global_config['_sip_tm'].regConsumer(
             self.ua, str(self.ua.cId))
         self.ua.rTarget = SipURL(username=calledID,
                                  host=self.ua.rAddr0[0],
                                  port=self.ua.rAddr0[1])
         self.ua.rUri = SipTo(address=SipAddress(
             url=self.ua.rTarget.getCopy(), hadbrace=True))
         self.ua.rUri.getUrl().port = None
         self.ua.lUri = SipFrom(address=SipAddress(url=SipURL(
             username=callingID),
                                                   hadbrace=True,
                                                   name=callingName))
         self.ua.lUri.getUrl().port = None
         self.ua.lUri.setTag(self.ua.lTag)
         self.ua.lCSeq = 200
         self.ua.lContact = SipContact()
         self.ua.lContact.getUrl().username = callingID
         self.ua.routes = []
         self.ua.cGUID = cGUID
         self.ua.lSDP = body
         req = self.ua.genRequest('INVITE', body, reason=event.reason)
         self.ua.lCSeq += 1
         self.ua.tr = self.ua.global_config['_sip_tm'].newTransaction(req, self.ua.recvResponse, \
           laddress = self.ua.source_address)
         self.ua.auth = None
         if self.ua.expire_time != None:
             self.ua.expire_time += event.rtime
         if self.ua.no_progress_time != None:
             self.ua.no_progress_time += event.rtime
             if self.ua.expire_time != None and self.ua.no_progress_time >= self.ua.expire_time:
                 self.ua.no_progress_time = None
         if self.ua.no_reply_time != None:
             if self.ua.no_reply_time < 32:
                 self.ua.no_reply_time += event.rtime
                 if self.ua.expire_time != None and self.ua.no_reply_time >= self.ua.expire_time:
                     self.ua.no_reply_time = None
                 elif self.ua.no_progress_time != None and self.ua.no_reply_time >= self.ua.no_progress_time:
                     self.ua.no_reply_time = None
             else:
                 self.ua.no_reply_time = None
         if self.ua.no_reply_time != None:
             self.ua.no_reply_timer = TimeoutAbs(self.ua.no_reply_expires,
                                                 self.ua.no_reply_time)
         elif self.ua.no_progress_time != None:
             self.ua.no_progress_timer = TimeoutAbs(
                 self.ua.no_progress_expires, self.ua.no_progress_time)
         elif self.ua.expire_time != None:
             self.ua.expire_timer = TimeoutAbs(self.ua.expires,
                                               self.ua.expire_time)
         return (UacStateTrying, )
     if isinstance(event, CCEventFail) or isinstance(
             event, CCEventRedirect) or isinstance(event,
                                                   CCEventDisconnect):
         return (UaStateDead, self.ua.disc_cbs, event.rtime, event.origin)
     return None