/[resiprocate]/main/sip/resiprocate/dum/Dialog.cxx
ViewVC logotype

Diff of /main/sip/resiprocate/dum/Dialog.cxx

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2598 by jason, Sun Apr 11 20:16:20 2004 UTC revision 2603 by davidb, Sun Apr 11 23:41:33 2004 UTC
# Line 1  Line 1 
1    #include "resiprocate/SipMessage.hxx"
2   #include "resiprocate/Contents.hxx"   #include "resiprocate/Contents.hxx"
3    #include "resiprocate/os/Logger.hxx"
4    
5  #include "Dialog.hxx"  #include "Dialog.hxx"
6  #include "ClientInviteSession.hxx"  #include "DialogUsageManager.hxx"
7    
8    #define RESIPROCATE_SUBSYSTEM Subsystem::DUM
9    
10  using namespace resip;  using namespace resip;
11  using namespace std;  using namespace std;
12    
13  class ServerInviteSession;  class ServerInviteSession;
14    
15  Dialog::Dialog(DialogUsageManager& dum, const SipMessage& msg)  Dialog::Dialog(DialogUsageManager& dum,
16                   const SipMessage& msg)
17     : mId(msg),     : mId(msg),
18       mDum(dum),       mDum(dum),
19       mClientSubscriptions(),       mClientSubscriptions(),
# Line 29  Line 35 
35       mRemoteCSeq(0),       mRemoteCSeq(0),
36       mRemoteTarget()       mRemoteTarget()
37  {  {
38     assert(msg.isFromWire());     assert(msg.isExternal());
39    
40     if (request.header(h_CSeq).method() == INVITE)     if (msg.header(h_CSeq).method() == INVITE)
41     {     {
42        mType = Invitation;        mType = Invitation;
43     }     }
44     else if (request.header(h_CSeq).method() == SUBSCRIBE)     else if (msg.header(h_CSeq).method() == SUBSCRIBE)
45     {     {
46        mType = Subscription;        mType = Subscription;
47     }     }
# Line 48  Line 54 
54        switch (request.header(h_CSeq).method())        switch (request.header(h_CSeq).method())
55        {        {
56           case INVITE:           case INVITE:
57           case SUBSRIBE:           case SUBSCRIBE:
58              if (request.exists(h_Contacts) && request.header(h_Contacts).size() == 1)              if (request.exists(h_Contacts) && request.header(h_Contacts).size() == 1)
59              {              {
60                 NameAddr& contact = request.header(h_Contacts).front();                 const NameAddr& contact = request.header(h_Contacts).front();
61                 if (isEqualNoCase(contact.uri().scheme(), Symbols::Sips) ||                 if (isEqualNoCase(contact.uri().scheme(), Symbols::Sips) ||
62                     isEqualNoCase(contact.uri().scheme(), Symbols::Sip))                     isEqualNoCase(contact.uri().scheme(), Symbols::Sip))
63                 {                 {
# Line 71  Line 77 
77                 throw Exception("Invalid dialog", __FILE__, __LINE__);                 throw Exception("Invalid dialog", __FILE__, __LINE__);
78              }              }
79              break;              break;
80             default:
81                break;
82        }        }
83                
84        mRemoteCSeq = request.header(h_CSeq).sequence();        mRemoteCSeq = request.header(h_CSeq).sequence();
85        mLocalCSeq = 0;        mLocalCSeq = 0;
86                
87        if ( response.header(h_From).exists(p_tag) ) // 2543 compat        if (request.header(h_From).exists(p_tag) ) // 2543 compat
88        {        {
89           mRemoteTag = response.header(h_From).param(p_tag);             mRemoteTag = request.header(h_From).param(p_tag);  
90        }        }
91        if ( response.header(h_To).exists(p_tag) )  // 2543 compat        if ( request.header(h_To).exists(p_tag) )  // 2543 compat
92        {        {
93           mLocalTag = response.header(h_To).param(p_tag);           mLocalTag = request.header(h_To).param(p_tag);
94        }        }
95        mMe = response.header(h_To);        mMe = request.header(h_To);
96    
97        //mDialogId = mCallId;        //mDialogId = mCallId;
98        //mDialogId.param(p_toTag) = mLocalTag;        //mDialogId.param(p_toTag) = mLocalTag;
# Line 101  Line 109 
109        switch (response.header(h_CSeq).method())        switch (response.header(h_CSeq).method())
110        {        {
111           case INVITE:           case INVITE:
112           case SUBSRIBE:           case SUBSCRIBE:
113              if (response.exists(h_Contacts) && response.header(h_Contacts).size() == 1)              if (response.exists(h_Contacts) && response.header(h_Contacts).size() == 1)
114              {              {
115                 NameAddr& contact = response.header(h_Contacts).front();                 const NameAddr& contact = response.header(h_Contacts).front();
116                 if (isEqualNoCase(contact.uri().scheme(), Symbols::Sips) ||                 if (isEqualNoCase(contact.uri().scheme(), Symbols::Sips) ||
117                     isEqualNoCase(contact.uri().scheme(), Symbols::Sip))                     isEqualNoCase(contact.uri().scheme(), Symbols::Sip))
118                 {                 {
# Line 124  Line 132 
132                 throw Exception("Invalid dialog", __FILE__, __LINE__);                 throw Exception("Invalid dialog", __FILE__, __LINE__);
133              }              }
134              break;              break;
135             default:
136                break;
137        }        }
138    
139        mLocalCSeq = response.header(h_CSeq).sequence();        mLocalCSeq = response.header(h_CSeq).sequence();
# Line 166  Line 176 
176           switch (msg.header(h_CSeq).method())           switch (msg.header(h_CSeq).method())
177           {           {
178              case INVITE:  // new INVITE              case INVITE:  // new INVITE
179                 usage = mDum.createServerInviteSession(msg);                 mInviteSession = mDum.makeServerInviteSession(*this, msg);
180                 break;                 break;
181                                
182              case ACK:              case ACK:
# Line 177  Line 187 
187    
188              case SUBSCRIBE:              case SUBSCRIBE:
189              case REFER: //!jf! does this create a server subs?              case REFER: //!jf! does this create a server subs?
190                 usage = mDum.createServerSubscription(msg);                 mServerSubscription = mDum.makeServerSubscription(*this, msg);
191                 break;                 break;
192                                
193              case NOTIFY:              case NOTIFY:
194                 usage = mDum.createClientSubscription(msg);                 mClientSubscriptions.push_back(mDum.makeClientSubscription(*this, msg));
195                 break;                 break;
196                                
197              case PUBLISH:              case PUBLISH:
198                 usage = mDum.createServerPublication(msg);                 mServerPublication = mDum.makeServerPublication(*this, msg);
199                 break;                 break;
200                                
201              case REGISTER:              case REGISTER:
202                 usage = mDum.createServerRegistration(msg);                 mServerRegistration = mDum.makeServerRegistration(*this, msg);
203                 break;                 break;
204                                
205              default:              default:
206                 usage = mDum.createServerOutOfDialog(msg);                 mServerOutOfDialogReq = mDum.makeServerOutOfDialog(*this, msg);
207                 break;                 break;
208           }           }
209        }        }
# Line 203  Line 213 
213           switch (msg.header(h_CSeq).method())           switch (msg.header(h_CSeq).method())
214           {           {
215              case INVITE:                case INVITE:  
216                 usage = mDum.createClientInviteSession(msg);                 mInviteSession = mDum.makeClientInviteSession(*this, msg);
217                 break;                 break;
218                                
219              case ACK:              case ACK:
# Line 213  Line 223 
223                                
224              case SUBSCRIBE:              case SUBSCRIBE:
225              case REFER: //!jf! does this create a server subs?              case REFER: //!jf! does this create a server subs?
226                 usage = mDum.createClientSubscription(msg);                 mClientSubscriptions.push_back(mDum.makeClientSubscription(*this, msg));
227                 break;                 break;
228                                
229              case NOTIFY:              case NOTIFY:
230                 usage = mDum.createClientSubscription(msg);                 mClientSubscriptions.push_back(mDum.makeClientSubscription(*this, msg));
231                 break;                 break;
232                                
233              case PUBLISH:              case PUBLISH:
234                 usage = mDum.createClientPublication(msg);                 mClientPublication = mDum.makeClientPublication(*this, msg);
235                 break;                 break;
236                                
237              case REGISTER:              case REGISTER:
238                 usage = mDum.createClientRegistration(msg);                 mClientRegistration = mDum.makeClientRegistration(*this, msg);
239                 break;                 break;
240                                
241              default:              default:
242                 usage = mDum.createClientOutOfDialog(msg);                 mClientOutOfDialogReq = mDum.makeClientOutOfDialog(*this, msg);
243                 break;                 break;
244           }           }
245        }        }
         
       assert(usage);  
       mUsages.push_back(usage);  
246     }     }
247  }  }
248    
# Line 253  Line 260 
260        case REFER:        case REFER:
261        case NOTIFY:        case NOTIFY:
262           for (std::vector<ClientSubscription*>::iterator i=mClientSubscriptions.begin();           for (std::vector<ClientSubscription*>::iterator i=mClientSubscriptions.begin();
263                i != mClientSubscriptions.end(); i++)                i != mClientSubscriptions.end(); ++i)
264           {           {
265              if (i->matches(msg))              if ((*i)->matches(msg))
266              {              {
267                 return *i;                 return *i;
268              }              }
# Line 291  Line 298 
298     return 0;     return 0;
299  }  }
300    
301  DialogId Dialog::getId() const  InviteSession::Handle
302  {  Dialog::findInviteSession()
    return mId;  
 }  
   
 BaseUsage&  
 Dialog::findInvSession()  
303  {  {
304     std::list<BaseUsage*>::iterator it = mUsages.begin();     if (mInviteSession)
     BaseUsage *usage;  
     while (it != mUsages.end())  
     {  
         usage = it->next();  
         if ((dynamic_cast<ClientInviteSession*>(usage) != NULL) ||  
             (dynamic_cast<ServerInviteSession*>(usage) != NULL))  
305          {          {
306              return *usage;        return mInviteSession->getSessionHandle();
307          }          }
308       else
309       {
310          throw BaseUsage::Exception("no such invite session",
311                                     __FILE__, __LINE__);
312      }      }
     return  BaseUsage::empty();  
313  }  }
314    
315  UsageSet  std::vector<ClientSubscription::Handle>
316  Dialog::findSubscriptions()  Dialog::findClientSubscriptions()
317  {  {
318      std::list<BaseUsage*>::iterator it = mUsages.begin();     std::vector<ClientSubscription::Handle> handles;
319      BaseUsage *usage;    
320      UsageSet usageSet;     for (std::vector<ClientSubscription*>::const_iterator i = mClientSubscriptions.begin();
321      while (it != mUsages.end())          i != mClientSubscriptions.end(); ++i)
     {  
         usage = it.next();  
         if ((dynamic_cast<ClientSubscription*>(usage) != null) ||  
             (dynamic_cast<ServerSubscription*>(usage) != null))  
322          {          {
323              usageSet.push_back(*usage);        handles.push_back((*i)->getHandle());
324          }          }
325      }  
326      return usageSet:     return handles;
327  }  }
328    
329  BaseUsage&  ClientRegistration::Handle
330  Dialog::findRegistration()  Dialog::findClientRegistration()
331  {  {
332      std::list<BaseUsage*>::iterator it = mUsages.begin();     if (mClientRegistration)
     BaseUsage *usage;  
     while (it != mUsages.end())  
333      {      {
334          usage = it.next();        return mClientRegistration->getHandle();
         if ((dynamic_cast<CientRegistration*>(usage) != null) ||  
             (dynamic_cast<ServerRegistration*>(usage) != null))  
         {  
             return *usage;  
335          }          }
336       else
337       {
338          throw BaseUsage::Exception("no such client registration session",
339                                     __FILE__, __LINE__);
340      }      }
     return  BaseUsage::empty();  
341  }  }
342    
343    ServerRegistration::Handle
344  BaseUsage&  Dialog::findServerRegistration()
 Dialog::findPublication()  
 {  
     std::list<BaseUsage*>::iterator it = mUsages.begin();  
     BaseUsage *usage;  
     while (it != mUsages.end())  
345      {      {
346          usage = it.next();     if (mServerRegistration)
         if ((dynamic_cast<CientPublication*>(usage) != null) ||  
             (dynamic_cast<ServerPublication*>(usage) != null))  
347          {          {
348              return *usage;        return mServerRegistration->getHandle();
349          }          }
350       else
351       {
352          throw BaseUsage::Exception("no such server registration session",
353                                     __FILE__, __LINE__);
354      }      }
     return  BaseUsage::empty();  
355  }  }
356    
357    
358  UsageSet  UsageSet
359  Dialog::findOutOfDialogs()  Dialog::findOutOfDialogs()
360  {  {
# Line 513  Line 502 
502        }        }
503     }     }
504  }  }
505    
506    Dialog::Exception::Exception(const Data& msg, const Data& file, int line)
507       : BaseException(msg, file, line)
508    {}
509    

Legend:
Removed from v.2598  
changed lines
  Added in v.2603

webmaster AT resiprocate DOT org
ViewVC Help
Powered by ViewVC 1.1.27