Ticket #1270: sip_options.patch
File sip_options.patch, 5.5 KB (added by , 20 years ago) |
---|
-
sipfsm.cpp
935 935 case SIP_REGISTER: fsm = sipRegistrar; break; 936 936 case SIP_SUBSCRIBE: fsm = CreateSubscriberFsm(); break; 937 937 case SIP_MESSAGE: fsm = CreateIMFsm(); break; 938 case SIP_OPTIONS: fsm = CreateOptionsFsm(); break; 938 939 default: fsm = CreateCallFsm(); break; 939 940 } 940 941 } … … 980 981 if (Method == "NOTIFY") return SIP_NOTIFY; 981 982 if (Method == "MESSAGE") return SIP_MESSAGE; 982 983 if (Method == "INFO") return SIP_INFO; 984 if (Method == "OPTIONS") return SIP_OPTIONS; 983 985 984 986 if (Method == "STATUS") 985 987 { … … 1069 1071 return im; 1070 1072 } 1071 1073 1074 SipOptions *SipFsm::CreateOptionsFsm(QString Url, QString callIdStr) 1075 { 1076 SipOptions *opt = new SipOptions(this, natIp, localPort, sipRegistration, callIdStr); 1077 FsmList.append(opt); 1078 return opt; 1079 } 1080 1072 1081 void SipFsm::StopWatchers() 1073 1082 { 1074 1083 SipFsmBase *it=FsmList.first(); … … 3147 3156 3148 3157 3149 3158 /********************************************************************** 3159 SipOptions 3160 3161 FSM to handle OPTIONS processing 3162 **********************************************************************/ 3163 3164 SipOptions::SipOptions(SipFsm *par, QString localIp, int localPort, SipRegistration *reg, QString callIdStr) : SipFsmBase(par) 3165 { 3166 sipLocalIp = localIp; 3167 sipLocalPort = localPort; 3168 regProxy = reg; 3169 3170 rxCseq = -1; 3171 txCseq = 1; 3172 if (callIdStr.length() > 0) 3173 CallId.setValue(callIdStr); 3174 else 3175 CallId.Generate(sipLocalIp); 3176 3177 if (regProxy) 3178 MyUrl = new SipUrl("", regProxy->registeredAs(), regProxy->registeredTo(), 5060); 3179 else 3180 MyUrl = new SipUrl("", "MythPhone", sipLocalIp, sipLocalPort); 3181 MyContactUrl = new SipUrl("", "", sipLocalIp, sipLocalPort); 3182 } 3183 3184 SipOptions::~SipOptions() 3185 { 3186 if (MyUrl) 3187 delete MyUrl; 3188 if (MyContactUrl) 3189 delete MyContactUrl; 3190 MyUrl = MyContactUrl = 0; 3191 } 3192 3193 int SipOptions::FSM(int Event, SipMsg *sipMsg, void *Value) 3194 { 3195 // If we get an OPTIONS message, just send a 200 OK 3196 ParseSipMsg(Event, sipMsg); 3197 BuildSendStatus(200, "OPTIONS", sipMsg->getCSeqValue(), SIP_OPT_CONTACT); 3198 3199 return SIP_IDLE; 3200 } 3201 3202 3203 /********************************************************************** 3150 3204 SipNotify 3151 3205 3152 3206 This class notifies the Myth Frontend that there is an incoming call -
sipstack.cpp
413 413 void SipMsg::decodeRequestLine(QString line) 414 414 { 415 415 QString Token = line.section(' ', 0, 0); 416 if ((Token == "INVITE") || (Token == "ACK") || (Token == "BYE") || (Token == "CANCEL") || (Token == "REGISTER") || (Token == "SUBSCRIBE") || (Token == "NOTIFY") || (Token == "MESSAGE") || (Token == "INFO") )416 if ((Token == "INVITE") || (Token == "ACK") || (Token == "BYE") || (Token == "CANCEL") || (Token == "REGISTER") || (Token == "SUBSCRIBE") || (Token == "NOTIFY") || (Token == "MESSAGE") || (Token == "INFO") || (Token == "OPTIONS")) 417 417 thisMethod = Token; 418 418 else if (Token == "SIP/2.0") 419 419 { -
sipfsm.h
90 90 91 91 92 92 // Call States 93 #define SIP_IDLE 93 #define SIP_IDLE 0x1 94 94 #define SIP_OCONNECTING1 0x2 // Invite sent, no response yet 95 95 #define SIP_OCONNECTING2 0x3 // Invite sent, 1xx response 96 96 #define SIP_ICONNECTING 0x4 … … 159 159 #define SIP_USER_MESSAGE 0x1F00 160 160 #define SIP_KICKWATCH 0x2000 161 161 #define SIP_MODIFYSESSION 0x2100 162 #define SIP_OPTIONS 0x2200 162 163 163 #define SIP_CMD(s) (((s)==SIP_INVITE) || ((s)==SIP_ACK) || ((s)==SIP_BYE) || ((s)==SIP_CANCEL) || ((s)==SIP_REGISTER) || ((s)==SIP_SUBSCRIBE) || ((s)==SIP_NOTIFY) || ((s)==SIP_MESSAGE) || ((s)==SIP_INFO) )164 #define SIP_CMD(s) (((s)==SIP_INVITE) || ((s)==SIP_ACK) || ((s)==SIP_BYE) || ((s)==SIP_CANCEL) || ((s)==SIP_REGISTER) || ((s)==SIP_SUBSCRIBE) || ((s)==SIP_NOTIFY) || ((s)==SIP_MESSAGE) || ((s)==SIP_INFO) || ((s)==SIP_OPTIONS)) 164 165 #define SIP_STATUS(s) (((s)==SIP_INVITESTATUS_2xx) || ((s)==SIP_INVITESTATUS_1xx) || ((s)==SIP_INVITESTATUS_3456xx) || ((s)==SIP_BYTESTATUS) || ((s)==SIP_CANCELSTATUS) || ((s)==SIP_SUBSTATUS) || ((s)==SIP_NOTSTATUS) || ((s)==SIP_MESSAGESTATUS) || ((s)==SIP_INFOSTATUS) ) 165 166 #define SIP_MSG(s) (SIP_CMD(s) || SIP_STATUS(s)) 166 167 … … 593 594 }; 594 595 595 596 597 class SipOptions : public SipFsmBase 598 { 599 public: 600 SipOptions(SipFsm *par, QString localIp, int localPort, SipRegistration *reg, QString callIdStr=""); 601 ~SipOptions(); 602 virtual int FSM(int Event, SipMsg *sipMsg=0, void *Value=0); 603 virtual QString type() { return "Options"; }; 604 605 private: 606 QString sipLocalIp; 607 int sipLocalPort; 608 SipRegistration *regProxy; 609 int rxCseq; 610 int txCseq; 611 }; 612 613 596 614 class SipFsm : public QWidget 597 615 { 598 616 … … 617 635 SipSubscriber *CreateSubscriberFsm(); 618 636 SipWatcher *CreateWatcherFsm(QString Url); 619 637 SipIM *CreateIMFsm(QString Url="", QString callIdStr=""); 638 SipOptions *CreateOptionsFsm(QString Url="", QString callIdStr=""); 620 639 void StopWatchers(); 621 640 void SipFsm::KickWatcher(SipUrl *Url); 622 641 void SendIM(QString destUrl, QString CallId, QString imMsg);