Ticket #1270: sip_options.patch

File sip_options.patch, 5.5 KB (added by russelb@…, 20 years ago)
  • sipfsm.cpp

     
    935935            case SIP_REGISTER:    fsm = sipRegistrar;            break;
    936936            case SIP_SUBSCRIBE:   fsm = CreateSubscriberFsm();   break;
    937937            case SIP_MESSAGE:     fsm = CreateIMFsm();           break;
     938            case SIP_OPTIONS:     fsm = CreateOptionsFsm();      break;
    938939            default:              fsm = CreateCallFsm();         break;
    939940            }
    940941        }
     
    980981    if (Method == "NOTIFY")     return SIP_NOTIFY;
    981982    if (Method == "MESSAGE")    return SIP_MESSAGE;
    982983    if (Method == "INFO")       return SIP_INFO;
     984    if (Method == "OPTIONS")    return SIP_OPTIONS;
    983985
    984986    if (Method == "STATUS")
    985987    {
     
    10691071    return im;
    10701072}
    10711073
     1074SipOptions *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
    10721081void SipFsm::StopWatchers()
    10731082{
    10741083    SipFsmBase *it=FsmList.first();
     
    31473156
    31483157
    31493158/**********************************************************************
     3159SipOptions
     3160
     3161FSM to handle OPTIONS processing
     3162**********************************************************************/
     3163
     3164SipOptions::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
     3184SipOptions::~SipOptions()
     3185{
     3186    if (MyUrl)
     3187        delete MyUrl;
     3188    if (MyContactUrl)
     3189        delete MyContactUrl;
     3190    MyUrl = MyContactUrl = 0;
     3191}
     3192
     3193int 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/**********************************************************************
    31503204SipNotify
    31513205
    31523206This class notifies the Myth Frontend that there is an incoming call
  • sipstack.cpp

     
    413413void SipMsg::decodeRequestLine(QString line)
    414414{
    415415    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"))
    417417        thisMethod = Token;
    418418    else if (Token == "SIP/2.0")
    419419    {
  • sipfsm.h

     
    9090
    9191
    9292// Call States
    93 #define SIP_IDLE                            0x1
     93#define SIP_IDLE                0x1
    9494#define SIP_OCONNECTING1        0x2    // Invite sent, no response yet
    9595#define SIP_OCONNECTING2        0x3    // Invite sent, 1xx response
    9696#define SIP_ICONNECTING         0x4
     
    159159#define SIP_USER_MESSAGE        0x1F00
    160160#define SIP_KICKWATCH           0x2000
    161161#define SIP_MODIFYSESSION       0x2100
     162#define SIP_OPTIONS             0x2200
    162163
    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))
    164165#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) )
    165166#define SIP_MSG(s)              (SIP_CMD(s) || SIP_STATUS(s))
    166167
     
    593594};
    594595
    595596
     597class 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
    596614class SipFsm : public QWidget
    597615{
    598616
     
    617635    SipSubscriber *CreateSubscriberFsm();
    618636    SipWatcher *CreateWatcherFsm(QString Url);
    619637    SipIM *CreateIMFsm(QString Url="", QString callIdStr="");
     638    SipOptions *CreateOptionsFsm(QString Url="", QString callIdStr="");
    620639    void StopWatchers();
    621640    void SipFsm::KickWatcher(SipUrl *Url);
    622641    void SendIM(QString destUrl, QString CallId, QString imMsg);