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

Diff of /main/resip/dum/Dialog.cxx

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

revision 3082 by derek, Fri Jul 9 01:23:36 2004 UTC revision 3089 by derek, Mon Jul 12 02:36:14 2004 UTC
# Line 5  Line 5 
5  #include "resiprocate/dum/BaseCreator.hxx"  #include "resiprocate/dum/BaseCreator.hxx"
6  #include "resiprocate/dum/ClientAuthManager.hxx"  #include "resiprocate/dum/ClientAuthManager.hxx"
7  #include "resiprocate/dum/ClientInviteSession.hxx"  #include "resiprocate/dum/ClientInviteSession.hxx"
 #include "resiprocate/dum/ClientOutOfDialogReq.hxx"  
 #include "resiprocate/dum/ClientRegistration.hxx"  
8  #include "resiprocate/dum/ClientSubscription.hxx"  #include "resiprocate/dum/ClientSubscription.hxx"
9  #include "resiprocate/dum/Dialog.hxx"  #include "resiprocate/dum/Dialog.hxx"
10  #include "resiprocate/dum/DialogUsageManager.hxx"  #include "resiprocate/dum/DialogUsageManager.hxx"
11  #include "resiprocate/dum/InviteSessionCreator.hxx"  #include "resiprocate/dum/InviteSessionCreator.hxx"
12  #include "resiprocate/dum/InviteSessionHandler.hxx"  #include "resiprocate/dum/InviteSessionHandler.hxx"
13  #include "resiprocate/dum/ServerInviteSession.hxx"  #include "resiprocate/dum/ServerInviteSession.hxx"
 #include "resiprocate/dum/ServerOutOfDialogReq.hxx"  
 #include "resiprocate/dum/ServerRegistration.hxx"  
14  #include "resiprocate/dum/ServerSubscription.hxx"  #include "resiprocate/dum/ServerSubscription.hxx"
15  #include "resiprocate/dum/SubscriptionHandler.hxx"  #include "resiprocate/dum/SubscriptionHandler.hxx"
 #include "resiprocate/dum/ClientPublication.hxx"  
 #include "resiprocate/dum/ServerPublication.hxx"  
16  #include "resiprocate/os/Logger.hxx"  #include "resiprocate/os/Logger.hxx"
17    
18  #define RESIPROCATE_SUBSYSTEM Subsystem::DUM  #define RESIPROCATE_SUBSYSTEM Subsystem::DUM
# Line 29  Line 23 
23  Dialog::Dialog(DialogUsageManager& dum, const SipMessage& msg, DialogSet& ds)  Dialog::Dialog(DialogUsageManager& dum, const SipMessage& msg, DialogSet& ds)
24     : mDum(dum),     : mDum(dum),
25       mDialogSet(ds),       mDialogSet(ds),
26         mId("INVALID", "INVALID", "INVALID"),
27       mClientSubscriptions(),       mClientSubscriptions(),
28       mServerSubscriptions(),       mServerSubscriptions(),
29       mInviteSession(0),       mInviteSession(0),
      mClientRegistration(0),  
      mServerRegistration(0),  
      mClientPublication(0),  
      mServerPublication(0),  
      mClientOutOfDialogRequests(),  
      mServerOutOfDialogRequest(0),  
30       mType(Fake),       mType(Fake),
31       mRouteSet(),       mRouteSet(),
32       mLocalContact(),       mLocalContact(),
33       mLocalCSeq(0),       mLocalCSeq(0),
34       mRemoteCSeq(0),       mRemoteCSeq(0),
      mId("INVALID", "INVALID", "INVALID"),  
35       mRemoteTarget(),       mRemoteTarget(),
36       mLocalNameAddr(),       mLocalNameAddr(),
37       mRemoteNameAddr(),       mRemoteNameAddr(),
# Line 210  Line 198 
198     DebugLog ( <<"Dialog::~Dialog() ");     DebugLog ( <<"Dialog::~Dialog() ");
199        
200     mDestroying = true;     mDestroying = true;
201     //does removing an elemnt from a list invalidate iterators?  
202     for(std::list<ClientSubscription*>::iterator it = mClientSubscriptions.begin();     while (!mClientSubscriptions.empty())
        it != mClientSubscriptions.end(); it++)  
    {  
       delete *it;  
    }  
    for(std::list<ServerSubscription*>::iterator it = mServerSubscriptions.begin();  
        it != mServerSubscriptions.end(); it++)  
203     {     {
204        delete *it;        delete *mClientSubscriptions.begin();
205     }     }
206     for(std::list<ClientOutOfDialogReq*>::iterator it = mClientOutOfDialogRequests.begin();  
207         it != mClientOutOfDialogRequests.end(); it++)     while (!mServerSubscriptions.empty())
208     {     {
209        delete *it;        delete *mServerSubscriptions.begin();
210     }     }
211    
212     delete mInviteSession;     delete mInviteSession;
    delete mClientRegistration;  
    delete mServerRegistration;  
    delete mClientPublication;  
    delete mServerPublication;  
    delete mServerOutOfDialogRequest;  
213    
214     mDialogSet.mDialogs.erase(this->getId());     mDialogSet.mDialogs.erase(this->getId());
215     delete mAppDialog;     delete mAppDialog;
# Line 253  Line 231 
231     }     }
232     else     else
233     {     {
       if (mDialogSet.getCreator())  
       {  
234           makeRequest(mDialogSet.getCreator()->getLastRequest(), CANCEL);           makeRequest(mDialogSet.getCreator()->getLastRequest(), CANCEL);
235           mDum.send(mDialogSet.getCreator()->getLastRequest());           mDum.send(mDialogSet.getCreator()->getLastRequest());
236           delete this;           delete this;
237        }        }
238     }     }
 }  
239    
240  void  void
241  Dialog::dispatch(const SipMessage& msg)  Dialog::dispatch(const SipMessage& msg)
# Line 302  Line 277 
277                 mInviteSession->dispatch(request);                 mInviteSession->dispatch(request);
278              }              }
279              break;              break;
   
280           case SUBSCRIBE:           case SUBSCRIBE:
281           case REFER: //!jf! does this create a server subs?           case REFER: //!jf! does this create a server subs?
282           {           {
# Line 320  Line 294 
294           }           }
295           break;           break;
296           case NOTIFY:           case NOTIFY:
             if (request.header(h_To).exists(p_tag))  
297              {              {
298                 ClientSubscription* client = findMatchingClientSub(request);                 ClientSubscription* client = findMatchingClientSub(request);
299                 if (client)                 if (client)
# Line 345  Line 318 
318                    }                    }
319                 }                 }
320              }              }
             else // no to tag - unsolicited notify  
             {  
                assert(mServerOutOfDialogRequest == 0);  
                mServerOutOfDialogRequest = makeServerOutOfDialog(request);  
                mServerOutOfDialogRequest->dispatch(request);  
             }  
321              break;              break;
322                          default:
323           case PUBLISH:             assert(0);
324              if (mServerPublication == 0)             return;
325          }
326       }
327       else if (msg.isResponse())
328              {              {
329                 mServerPublication = makeServerPublication(request);        if (!mDialogSet.getCreator() ||
330              !(msg.header(h_CSeq).method() == mDialogSet.getCreator()->getLastRequest().header(h_RequestLine).method()))
331          {
332             SipMessage* lastRequest = 0;            
333             switch (msg.header(h_CSeq).method())
334             {
335                case INVITE:
336                case CANCEL:
337                case REFER:
338                   if (mInviteSession != 0)
339                   {
340                      //spurious
341                      return;
342              }              }
343              mServerPublication->dispatch(request);                 else
             break;  
   
          case REGISTER:  
             if (mServerRegistration == 0)  
344              {              {
345                 mServerRegistration = makeServerRegistration(request);                    lastRequest = &mInviteSession->mLastRequest;
346              }              }
             mServerRegistration->dispatch(request);  
347              break;              break;
                 
348           default:           default:
             InfoLog ( << "In Dialog::dispatch, default(ServerOutOfDialogRequest), msg: " << msg );              
             // only can be one ServerOutOfDialogReq at a time  
             assert(mServerOutOfDialogRequest == 0);  
             mServerOutOfDialogRequest = makeServerOutOfDialog(request);  
             mServerOutOfDialogRequest->dispatch(request);  
349              break;              break;
350        }        }
351     }           if ( lastRequest && mDum.mClientAuthManager->handle( *lastRequest, msg ) )
    else if (msg.isResponse())  
352     {     {
353  #if 0              InfoLog( << "about to retransmit request with digest credentials" );
354  //       //Auth related              InfoLog( << *lastRequest );
355  //       if (mDum.mClientAuthManager && !mDialogSet.mCancelled)              
356  //       {              mDum.send(*lastRequest);
357  //          if (mDialogSet.getCreator())              return;
358  //          {           }
359  //             if ( mDum.mClientAuthManager->handle( mDialogSet.getCreator()->getLastRequest(), msg))        }
360  //             {        
 //                InfoLog( << "about to retransmit request with digest credentials" );  
 //                InfoLog( << mDialogSet.getCreator()->getLastRequest() );  
                 
 //                mDum.send(mDialogSet.getCreator()->getLastRequest());  
 //                return;  
 //             }  
 //          }  
 //          else  
 //          {  
 //             SipMessage* lastRequest = 0;              
 //             switch (msg.header(h_CSeq).method())  
 //             {  
 //                case INVITE:  
 //                case CANCEL:  
 //                case REFER:  
 //                   if (mInviteSession == 0)  
 //                   {  
 //                      return;  
 //                   }  
 //                   else  
 //                   {  
 //                      lastRequest = &mInviteSession->mLastRequest;  
 //                   }  
 //                   break;                
 //                case REGISTER:  
 //                   if (mClientRegistration == 0)  
 //                   {  
 //                      return;  
 //                   }  
 //                   else  
 //                   {  
 //                      lastRequest = &mClientRegistration->mLastRequest;  
 //                   }  
 //                   break;                
 //                default:  
 //                   break;  
 //             }  
 //             if ( lastRequest && mDum.mClientAuthManager->handle( *lastRequest, msg ) )  
 //             {  
 //                InfoLog( << "about to retransmit request with digest credentials" );  
 //                InfoLog( << *lastRequest );  
                 
 //                mDum.send(*lastRequest);  
 //                return;  
 //             }  
 //          }  
 //       }  
 #endif  
361        const SipMessage& response = msg;        const SipMessage& response = msg;
362        // !jf! should this only be for 2xx responses? !jf! Propose no as an        // !jf! should this only be for 2xx responses? !jf! Propose no as an
363        // answer !dcm! what is he on?        // answer !dcm! what is he on?
# Line 516  Line 438 
438              }              }
439           }           }
440           break;           break;
          case PUBLISH:  
             // !jf! could assert that no other usages exist  
             if (mClientPublication == 0)  
             {  
                mClientPublication = makeClientPublication(response);  
             }  
             mClientPublication->dispatch(response);  
             break;  
                 
          case REGISTER:  
             // !jf! could assert that no other usages exist  
             if (mClientRegistration == 0)  
             {  
                mClientRegistration = makeClientRegistration(response);  
             }  
             mClientRegistration->dispatch(response);  
             break;  
                 
             // unsolicited - not allowed but commonly implemented  
             // by large companies with a bridge as their logo  
          case NOTIFY:  
          case INFO:    
                 
441           default:           default:
442           {             assert(0);
443              ClientOutOfDialogReq* req = findMatchingClientOutOfDialogReq(response);             return;
             if (req == 0)  
             {  
                req = makeClientOutOfDialogReq(response);  
                mClientOutOfDialogRequests.push_back(req);  
             }  
             req->dispatch(response);  
             break;  
          }  
444        }        }
445     }     }
446  }  }
# Line 582  Line 473 
473     return 0;     return 0;
474  }  }
475    
 ClientOutOfDialogReq*  
 Dialog::findMatchingClientOutOfDialogReq(const SipMessage& msg)  
 {  
    for (std::list<ClientOutOfDialogReq*>::iterator i=mClientOutOfDialogRequests.begin();  
         i != mClientOutOfDialogRequests.end(); ++i)  
    {  
       if ((*i)->matches(msg))  
       {  
          return *i;  
       }  
    }  
    return 0;  
 }  
   
   
476  InviteSessionHandle  InviteSessionHandle
477  Dialog::getInviteSession()  Dialog::getInviteSession()
478  {  {
# Line 671  Line 547 
547     return handles;     return handles;
548  }  }
549    
 ClientRegistrationHandle  
 Dialog::getClientRegistration()  
 {  
    if (mClientRegistration)  
    {  
       return mClientRegistration->getHandle();  
    }  
    else  
    {  
       return ClientRegistrationHandle::NotValid();  
    }  
 }  
   
 ServerRegistrationHandle  
 Dialog::getServerRegistration()  
 {  
    if (mServerRegistration)  
    {  
       return mServerRegistration->getHandle();  
    }  
    else  
    {  
       return ServerRegistrationHandle::NotValid();  
    }  
 }  
   
 ClientPublicationHandle  
 Dialog::getClientPublication()  
 {  
    if (mClientPublication)  
    {  
       return mClientPublication->getHandle();  
    }  
    else  
    {  
       return ClientPublicationHandle::NotValid();        
    }  
 }  
   
 ServerPublicationHandle  
 Dialog::getServerPublication()  
 {  
    if (mServerPublication)  
    {  
       return mServerPublication->getHandle();  
    }  
    else  
    {  
       return ServerPublicationHandle::NotValid();        
    }  
 }  
   
 #if 0  
 ClientOutOfDialogReqHandle  
 Dialog::findClientOutOfDialog()  
 {  
    if (mClientOutOfDialogRequests)  
    {  
       return mClientOutOfDialogReq->getHandle();  
    }  
    else  
    {  
       throw BaseUsage::Exception("no such client out of dialog",  
                                  __FILE__, __LINE__);  
    }  
 }  
 #endif  
   
 ServerOutOfDialogReqHandle  
 Dialog::getServerOutOfDialog()  
 {  
    if (mServerOutOfDialogRequest)  
    {  
       return mServerOutOfDialogRequest->getHandle();  
    }  
    else  
    {  
       return ServerOutOfDialogReqHandle::NotValid();  
    }  
 }  
550    
551  #if 0  #if 0
552  void  void
# Line 876  Line 672 
672     return new ClientInviteSession(mDum, *this, creator->getLastRequest(), creator->getInitialOffer());     return new ClientInviteSession(mDum, *this, creator->getLastRequest(), creator->getInitialOffer());
673  }  }
674    
 ClientRegistration*  
 Dialog::makeClientRegistration(const SipMessage& response)  
 {  
    BaseCreator* creator = mDialogSet.getCreator();  
    assert(creator);  
    return new ClientRegistration(mDum, *this, creator->getLastRequest());  
 }  
675    
 ClientPublication*  
 Dialog::makeClientPublication(const SipMessage& response)  
 {  
    BaseCreator* creator = mDialogSet.getCreator();  
    assert(creator);  
    return new ClientPublication(mDum, *this, creator->getLastRequest());  
 }  
676    
677  ClientSubscription*  ClientSubscription*
678  Dialog::makeClientSubscription(const SipMessage& request)  Dialog::makeClientSubscription(const SipMessage& request)
# Line 898  Line 680 
680     return new ClientSubscription(mDum, *this, request);     return new ClientSubscription(mDum, *this, request);
681  }  }
682    
 ClientOutOfDialogReq*  
 Dialog::makeClientOutOfDialogReq(const SipMessage& response)  
 {  
    BaseCreator* creator = mDialogSet.getCreator();  
    assert(creator);  
    return new ClientOutOfDialogReq(mDum, *this, creator->getLastRequest());  
 }  
683    
684  ServerInviteSession*  ServerInviteSession*
685  Dialog::makeServerInviteSession(const SipMessage& request)  Dialog::makeServerInviteSession(const SipMessage& request)
# Line 918  Line 693 
693     return new ServerSubscription(mDum, *this, request);     return new ServerSubscription(mDum, *this, request);
694  }  }
695    
 ServerRegistration*  
 Dialog::makeServerRegistration(const SipMessage& request)  
 {  
    return new ServerRegistration(mDum, *this, request);  
 }  
   
 ServerPublication*  
 Dialog::makeServerPublication(const SipMessage& request)  
 {  
    return new ServerPublication(mDum, *this, request);  
 }  
   
 ServerOutOfDialogReq*  
 Dialog::makeServerOutOfDialog(const SipMessage& request)  
 {  
    return new ServerOutOfDialogReq(mDum, *this, request);  
 }  
   
696  Dialog::Exception::Exception(const Data& msg, const Data& file, int line)  Dialog::Exception::Exception(const Data& msg, const Data& file, int line)
697     : BaseException(msg, file, line)     : BaseException(msg, file, line)
698  {  {
# Line 966  Line 723 
723     {     {
724        if (mClientSubscriptions.empty() &&        if (mClientSubscriptions.empty() &&
725            mServerSubscriptions.empty() &&            mServerSubscriptions.empty() &&
726            mClientOutOfDialogRequests.empty() &&            !mInviteSession)
           !(mInviteSession ||  
             mClientRegistration ||  
             mServerRegistration ||  
             mClientPublication ||  
             mServerPublication ||  
             mServerOutOfDialogRequest))  
727        {        {
728           delete this;           delete this;
729        }        }

Legend:
Removed from v.3082  
changed lines
  Added in v.3089

webmaster AT resiprocate DOT org
ViewVC Help
Powered by ViewVC 1.1.27