/[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 5596 by sgodin, Tue Nov 1 21:52:16 2005 UTC revision 8353 by sgodin, Tue Dec 2 15:37:59 2008 UTC
# Line 40  Line 40 
40       mLocalNameAddr(),       mLocalNameAddr(),
41       mRemoteNameAddr(),       mRemoteNameAddr(),
42       mCallId(msg.header(h_CallID)),       mCallId(msg.header(h_CallID)),
43         mDefaultSubExpiration(0),
44       mAppDialog(0),       mAppDialog(0),
45       mDestroying(false),       mDestroying(false),
46       mReUseDialogSet(false)       mReUseDialogSet(false)
# Line 74  Line 75 
75        }        }
76        if (request.exists(h_RecordRoutes))        if (request.exists(h_RecordRoutes))
77        {        {
78           mRouteSet = request.header(h_RecordRoutes); // !jf! is this right order           mRouteSet = request.header(h_RecordRoutes);
79        }        }
80    
81        switch (request.header(h_CSeq).method())        switch (request.header(h_CSeq).method())
# Line 84  Line 85 
85           case REFER:           case REFER:
86           case NOTIFY:           case NOTIFY:
87              DebugLog ( << "UAS dialog ID creation, DS: " << ds.getId());              DebugLog ( << "UAS dialog ID creation, DS: " << ds.getId());
88              mId = DialogId(ds.getId(), request.header(h_From).param(p_tag));              mId = DialogId(ds.getId(),
89                               request.header(h_From).exists(p_tag) ? request.header(h_From).param(p_tag) : Data::Empty);            
90    
91              mRemoteNameAddr = request.header(h_From);              mRemoteNameAddr = request.header(h_From);
92              mLocalNameAddr = request.header(h_To);              mLocalNameAddr = request.header(h_To);
93              mLocalNameAddr.param(p_tag) = mId.getLocalTag();              mLocalNameAddr.param(p_tag) = mId.getLocalTag();
# Line 94  Line 97 
97                 if (isEqualNoCase(contact.uri().scheme(), Symbols::Sips) ||                 if (isEqualNoCase(contact.uri().scheme(), Symbols::Sips) ||
98                     isEqualNoCase(contact.uri().scheme(), Symbols::Sip))                     isEqualNoCase(contact.uri().scheme(), Symbols::Sip))
99                 {                 {
                   mLocalContact = NameAddr(request.header(h_RequestLine).uri()); // update later when send a request  
100                    mRemoteTarget = contact;                    mRemoteTarget = contact;
101                      
102                      if (!mDialogSet.getUserProfile()->isAnonymous() && mDialogSet.getUserProfile()->hasPublicGruu())
103                      {
104                         mLocalContact.uri() = mDialogSet.getUserProfile()->getPublicGruu();
105                      }
106                      else if(mDialogSet.getUserProfile()->isAnonymous() && mDialogSet.getUserProfile()->hasTempGruu())
107                      {
108                         mLocalContact.uri() = mDialogSet.getUserProfile()->getTempGruu();
109                      }
110                      else
111                      {
112                         mLocalContact = NameAddr(request.header(h_RequestLine).uri()); // update later when send a request
113                         if (mDialogSet.getUserProfile()->hasOverrideHostAndPort())
114                         {
115                            mLocalContact.uri().host() = mDialogSet.getUserProfile()->getOverrideHostAndPort().host();
116                            mLocalContact.uri().port() = mDialogSet.getUserProfile()->getOverrideHostAndPort().port();
117                         }
118                      }
119                 }                 }
120                 else                 else
121                 {                 {
# Line 167  Line 187 
187                        isEqualNoCase(contact.uri().scheme(), Symbols::Sip))                        isEqualNoCase(contact.uri().scheme(), Symbols::Sip))
188                    {                    {
189                       BaseCreator* creator = mDialogSet.getCreator();                       BaseCreator* creator = mDialogSet.getCreator();
190                       assert(creator);// !jf! throw or something here  
191                       assert(creator->getLastRequest().exists(h_Contacts));                       if( 0 == creator )
192                       assert(!creator->getLastRequest().header(h_Contacts).empty());                       {
193                       mLocalContact = creator->getLastRequest().header(h_Contacts).front();                          ErrLog(<< "BaseCreator is null for DialogSet");
194                            ErrLog(<< response);
195                            throw Exception("BaseCreator is null for DialogSet", __FILE__, __LINE__);
196                         }
197    
198                         SharedPtr<SipMessage> lastRequest(creator->getLastRequest());
199    
200                         if( 0 == lastRequest.get() ||
201                            !lastRequest->exists(h_Contacts) ||
202                            lastRequest->header(h_Contacts).empty())
203                         {
204                            InfoLog(<< "lastRequest does not contain a valid contact");                                            
205                            InfoLog(<< response);
206                            throw Exception("lastRequest does not contain a valid contact.", __FILE__, __LINE__);
207                         }
208                         mLocalContact = creator->getLastRequest()->header(h_Contacts).front();
209                       mRemoteTarget = contact;                       mRemoteTarget = contact;
210                    }                    }
211                    else                    else
# Line 199  Line 234 
234        DebugLog ( << "mLocalNameAddr: " << mLocalNameAddr );        DebugLog ( << "mLocalNameAddr: " << mLocalNameAddr );
235        DebugLog ( << "mLocalContact: " << mLocalContact );        DebugLog ( << "mLocalContact: " << mLocalContact );
236        DebugLog ( << "mRemoteTarget: " << mRemoteTarget );        DebugLog ( << "mRemoteTarget: " << mRemoteTarget );
   
   
237     }     }
238     mDialogSet.addDialog(this);     mDialogSet.addDialog(this);
239     DebugLog ( <<"Dialog::Dialog " << mId);     DebugLog ( <<"Dialog::Dialog " << mId);
# Line 237  Line 270 
270     return mId;     return mId;
271  }  }
272    
273    const NameAddr&
274    Dialog::getLocalNameAddr() const
275    {
276       return mLocalNameAddr;
277    }
278    
279    const NameAddr&
280    Dialog::getLocalContact() const
281    {
282       return mLocalContact;
283    }
284    
285    const NameAddr&
286    Dialog::getRemoteNameAddr() const
287    {
288       return mRemoteNameAddr;
289    }
290    
291    const NameAddr&
292    Dialog::getRemoteTarget() const
293    {
294       return mRemoteTarget;
295    }
296    
297    const NameAddrs&
298    Dialog::getRouteSet() const
299    {
300       return mRouteSet;
301    }
302    
303  void  void
304  Dialog::cancel()  Dialog::cancel()
305  {  {
# Line 253  Line 316 
316     {     {
317        mInviteSession->end();        mInviteSession->end();
318     }     }
319     else  
320       // End Subscriptions
321       // !jrm! WARN ClientSubscription and ServerSubscription have access to this dialog and will remove themselves
322       // from the m<client|server>Subscriptions collections in the call to end().
323       for (list<ClientSubscription*>::iterator it(mClientSubscriptions.begin());
324            it != mClientSubscriptions.end();)
325     {     {
326        //!dcm! -- end subscriptions             ClientSubscription* c = *it;
327           it++;      
328               c->end();
329       }
330    
331       for (list<ServerSubscription*>::iterator it2(mServerSubscriptions.begin());
332            it2 != mServerSubscriptions.end();)
333       {
334               ServerSubscription* s = *it2;
335           it2++;      
336               s->end();
337     }     }
338  }  }
339    
# Line 290  Line 368 
368     // !jf! Should be checking for messages with out of order CSeq and rejecting     // !jf! Should be checking for messages with out of order CSeq and rejecting
369    
370     DebugLog ( << "Dialog::dispatch: " << msg.brief());     DebugLog ( << "Dialog::dispatch: " << msg.brief());
371     int keepAliveTime = mDialogSet.getUserProfile()->getKeepAliveTime();  
372       if(msg.isExternal())
373       {
374          const Data& receivedTransport = msg.header(h_Vias).front().transport();
375          int keepAliveTime = 0;
376          if(receivedTransport == Symbols::TCP ||
377             receivedTransport == Symbols::TLS ||
378             receivedTransport == Symbols::SCTP)
379          {
380             keepAliveTime = mDialogSet.getUserProfile()->getKeepAliveTimeForStream();
381          }
382          else
383          {
384             keepAliveTime = mDialogSet.getUserProfile()->getKeepAliveTimeForDatagram();
385          }
386    
387     if(keepAliveTime > 0)     if(keepAliveTime > 0)
388     {     {
389        mNetworkAssociation.update(msg, keepAliveTime);        mNetworkAssociation.update(msg, keepAliveTime);
390     }     }
391       }
392      
393     handleTargetRefresh(msg);     handleTargetRefresh(msg);
394     if (msg.isRequest())     if (msg.isRequest())
395     {     {
# Line 385  Line 480 
480                 }                 }
481                 else                 else
482                 {                 {
483                      if (mDum.checkEventPackage(request))
484                      {
485                    server = makeServerSubscription(request);                    server = makeServerSubscription(request);
486                    mServerSubscriptions.push_back(server);                    mServerSubscriptions.push_back(server);
487                    server->dispatch(request);                    server->dispatch(request);
488                 }                 }
489              }              }
490           }           }
491             }
492           break;           break;
493           case REFER:           case REFER:
494           {           {
495              if (mInviteSession == 0)  //             if (mInviteSession == 0)
496              {  //             {
497                 InfoLog (<< "Received an in dialog refer in a non-invite dialog: " << request.brief());  //                InfoLog (<< "Received an in dialog refer in a non-invite dialog: " << request.brief());
498                 SipMessage failure;  //                SipMessage failure;
499                 makeResponse(failure, request, 603);  //                makeResponse(failure, request, 603);
500                 mDum.sendResponse(failure);  //                mDum.sendResponse(failure);
501                 return;  //                return;
502              }  //             }
503              else if  (!request.exists(h_ReferTo))  //             else
504    
505                if  (!request.exists(h_ReferTo))
506              {              {
507                 InfoLog (<< "Received refer w/out a Refer-To: " << request.brief());                 InfoLog (<< "Received refer w/out a Refer-To: " << request.brief());
508                 SipMessage failure;                 SipMessage failure;
# Line 412  Line 512 
512              }              }
513              else              else
514              {              {
515                   if (request.exists(h_ReferSub) && request.header(h_ReferSub).value()=="false")
516                   {
517                      assert(mInviteSession);
518                      mInviteSession->referNoSub(msg);
519                   }
520                   else
521                   {
522                 ServerSubscription* server = findMatchingServerSub(request);                 ServerSubscription* server = findMatchingServerSub(request);
523                 ServerSubscriptionHandle serverHandle;                 ServerSubscriptionHandle serverHandle;
524                 if (server)                 if (server)
# Line 426  Line 533 
533                    serverHandle = server->getHandle();                    serverHandle = server->getHandle();
534                    server->dispatch(request);                    server->dispatch(request);
535                 }                 }
536    
537                      if (mInviteSession)
538                      {
539                 mDum.mInviteSessionHandler->onRefer(mInviteSession->getSessionHandle(), serverHandle, msg);                 mDum.mInviteSessionHandler->onRefer(mInviteSession->getSessionHandle(), serverHandle, msg);
540              }              }
541                      
542                   }
543                }
544           }           }
545           break;           break;
546           case NOTIFY:           case NOTIFY:
# Line 440  Line 553 
553              else              else
554              {              {
555                 BaseCreator* creator = mDialogSet.getCreator();                 BaseCreator* creator = mDialogSet.getCreator();
556                 if (creator && (creator->getLastRequest().header(h_RequestLine).method() == SUBSCRIBE ||                    if (creator && (creator->getLastRequest()->header(h_RequestLine).method() == SUBSCRIBE ||
557                                 creator->getLastRequest().header(h_RequestLine).method() == REFER))  // ?slg? OOD Refer?  Click-to-Call?                       creator->getLastRequest()->header(h_RequestLine).method() == REFER))  
558                 {                 {
559                    DebugLog (<< "Making subscription (from creator) request: " << creator->getLastRequest());                       DebugLog (<< "Making subscription (from creator) request: " << *creator->getLastRequest());
560                    ClientSubscription* sub = makeClientSubscription(creator->getLastRequest());                       ClientSubscription* sub = makeClientSubscription(*creator->getLastRequest());
561                    mClientSubscriptions.push_back(sub);                    mClientSubscriptions.push_back(sub);
562                    sub->dispatch(request);                    sub->dispatch(request);
563                 }                 }
564                 else                 else
565                 {                 {
566                             if (mInviteSession != 0 && (!msg.exists(h_Event) || msg.header(h_Event).value() == "refer"))                       if (mInviteSession != 0 && (!msg.exists(h_Event) || msg.header(h_Event).value() == "refer") &&
567                             mDum.getClientSubscriptionHandler("refer")!=0)
568                     {                     {
569                            DebugLog (<< "Making subscription from NOTIFY: " << msg);                            DebugLog (<< "Making subscription from NOTIFY: " << msg);
570                        ClientSubscription* sub = makeClientSubscription(msg);                        ClientSubscription* sub = makeClientSubscription(msg);
571                        mClientSubscriptions.push_back(sub);                        mClientSubscriptions.push_back(sub);
572                                    ClientSubscriptionHandle client = sub->getHandle();                                                                    ClientSubscriptionHandle client = sub->getHandle();                                
                       sub->dispatch(request);  
                       mInviteSession->mSentRefer = false;  
                       if (client.isValid())  
                       {  
573                           mDum.mInviteSessionHandler->onReferAccepted(mInviteSession->getSessionHandle(), client, msg);                           mDum.mInviteSessionHandler->onReferAccepted(mInviteSession->getSessionHandle(), client, msg);
574                            sub->dispatch(request);
575                        }                        }
576                        else                        else
577                        {                        {
578                           mDum.mInviteSessionHandler->onReferRejected(mInviteSession->getSessionHandle(), msg);                          SharedPtr<SipMessage> response(new SipMessage);
579                        }                          makeResponse(*response, msg, 406);
                                    }  
                                    else  
                                    {  
                       SipMessage response;  
                       makeResponse(response, msg, 406);  
580                        send(response);                        send(response);
581                                     }                                     }
582                             }                             }
# Line 493  Line 599 
599        {        {
600               bool handledByAuth = false;               bool handledByAuth = false;
601           if (mDum.mClientAuthManager.get() &&           if (mDum.mClientAuthManager.get() &&
602               mDum.mClientAuthManager->handle(*mDialogSet.getUserProfile(), r->second, msg))               mDum.mClientAuthManager->handle(*mDialogSet.getUserProfile(), *r->second, msg))
603           {           {
604              InfoLog( << "about to re-send request with digest credentials" );              InfoLog( << "about to re-send request with digest credentials" << r->second->brief());
             InfoLog( << r->second );  
605    
606              assert (r->second.isRequest());              assert (r->second->isRequest());
607    
608              mLocalCSeq++;              mLocalCSeq++;
609              send(r->second);              send(r->second);
610                          handledByAuth = true;                          handledByAuth = true;
   
             if((r->second.header(h_RequestLine).method() == INVITE || r->second.header(h_RequestLine).method() == UPDATE) &&  
                mInviteSession != 0)  
             {  
                 // Copy INVITE or UPDATE with Authorization headers back to InviteSession - needed to populate ACKs with Authoriziation headers  
                 mInviteSession->mLastSessionModification = r->second;  
             }  
611           }           }
612           mRequests.erase(r);           mRequests.erase(r);
613                   if (handledByAuth) return;                   if (handledByAuth) return;
# Line 517  Line 615 
615    
616        const SipMessage& response = msg;        const SipMessage& response = msg;
617        int code = response.header(h_StatusLine).statusCode();        int code = response.header(h_StatusLine).statusCode();
618        if (code >=200 && code < 300)        // If this is a 200 response to the initial request, then store the routeset (if present)
619          BaseCreator* creator = mDialogSet.getCreator();
620          if (creator && (creator->getLastRequest()->header(h_CSeq) == response.header(h_CSeq)) && code >=200 && code < 300)
621        {        {
622           if (response.exists(h_RecordRoutes))           if (response.exists(h_RecordRoutes))
623           {           {
624              mRouteSet = response.header(h_RecordRoutes).reverse();              mRouteSet = response.header(h_RecordRoutes).reverse();
625           }           }
626             else
627             {
628                // Ensure that if the route-set in the 200 is empty, then we overwrite any existing route-sets
629                mRouteSet.clear();
630             }
631        }        }
632    
633        // !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
# Line 558  Line 663 
663                   case REFER:                   case REFER:
664              if(mInviteSession)              if(mInviteSession)
665              {              {
                mInviteSession->mSentRefer = false;  
   
666                 if (code >= 300)                 if (code >= 300)
667                 {                 {
668                    mDum.mInviteSessionHandler->onReferRejected(mInviteSession->getSessionHandle(), msg);                    mDum.mInviteSessionHandler->onReferRejected(mInviteSession->getSessionHandle(), msg);
669                 }                 }
670                   else
671                   {
672                      //!dys! the OR condition below is not draft compliant.
673                      if (!mInviteSession->mReferSub &&
674                          ((msg.exists(h_ReferSub) && msg.header(h_ReferSub).value()=="false") ||
675                           !msg.exists(h_ReferSub)))
676                      {
677                         DebugLog(<< "refer accepted with norefersub");
678                         mDum.mInviteSessionHandler->onReferAccepted(mInviteSession->getSessionHandle(), ClientSubscriptionHandle::NotValid(), msg);
679                      }
680                 // else no need for action - first Notify will cause onReferAccepted to be called                 // else no need for action - first Notify will cause onReferAccepted to be called
681              }              }
682                   mInviteSession->nitComplete();
683              break;              break;
684                }
685                // fall through, out of dialog refer was sent.
686    
687           case SUBSCRIBE:           case SUBSCRIBE:
688           {           {
689              int code = response.header(h_StatusLine).statusCode();              int code = response.header(h_StatusLine).statusCode();
             if (code < 300)  
             {  
                // throw it away  
                return;  
             }  
             else  
             {  
690                 ClientSubscription* client = findMatchingClientSub(response);                 ClientSubscription* client = findMatchingClientSub(response);
691                 if (client)                 if (client)
692                 {                 {
693                    client->dispatch(response);                    client->dispatch(response);
694                 }                 }
695                else if (code < 300)
696                {
697                   /*
698                      we're capturing the  value from the expires header off
699                      the 2xx because the ClientSubscription is only created
700                      after receiving the NOTIFY that comes (usually) after
701                      this 2xx.  We really should be creating the
702                      ClientSubscription at either the 2xx or the NOTIFY
703                      whichever arrives first. .mjf.
704                      Note: we're capturing a duration here (not the
705                      absolute time because all the inputs to
706                      ClientSubscription desling with the expiration are expecting
707                      duration type values from the headers. .mjf.
708                    */
709                   if(response.exists(h_Expires))
710                   {
711                      mDefaultSubExpiration = response.header(h_Expires).value();
712                   }
713                   else
714                   {
715                      //?dcm? defaults to 3600 in ClientSubscription if no expires value
716                      //is provided anywhere...should we assume the value from the
717                      //sub in the basecreator if it exists?
718                      mDefaultSubExpiration = 0;
719                   }              
720                   return;
721                }
722                 else                 else
723                 {                 {
724                    //!dcm! -- can't subscribe in an existing Dialog, this is all                    //!dcm! -- can't subscribe in an existing Dialog, this is all
725                    //a bit of a hack; currently, spurious failure messages may cause callbacks                    //a bit of a hack; currently, spurious failure messages may cause callbacks
726                    BaseCreator* creator = mDialogSet.getCreator();                    BaseCreator* creator = mDialogSet.getCreator();
727                    if (!creator || !creator->getLastRequest().exists(h_Event))                 if (!creator || !creator->getLastRequest()->exists(h_Event))
728                    {                    {
729                       return;                       return;
730                    }                    }
731                    else                    else
732                    {                    {
733                       ClientSubscriptionHandler* handler =                       ClientSubscriptionHandler* handler =
734                          mDum.getClientSubscriptionHandler(creator->getLastRequest().header(h_Event).value());                       mDum.getClientSubscriptionHandler(creator->getLastRequest()->header(h_Event).value());
735                       if (handler)                       if (handler)
736                       {                       {
737                          ClientSubscription* sub = makeClientSubscription(creator->getLastRequest());                       ClientSubscription* sub = makeClientSubscription(*creator->getLastRequest());
738                          mClientSubscriptions.push_back(sub);                          mClientSubscriptions.push_back(sub);
739                          sub->dispatch(response);                          sub->dispatch(response);
740                       }                       }
741                    }                    }
742                 }                 }
743              }  
744           }           }
745           break;           break;
746           case NOTIFY:           case NOTIFY:
# Line 810  Line 946 
946     request.header(h_CallId) = mCallId;     request.header(h_CallId) = mCallId;
947    
948     request.remove(h_RecordRoutes);  //!dcm! -- all of this is rather messy     request.remove(h_RecordRoutes);  //!dcm! -- all of this is rather messy
949       request.remove(h_Replaces);
950    
951     request.remove(h_Contacts);     request.remove(h_Contacts);
952     request.header(h_Contacts).push_front(mLocalContact);     request.header(h_Contacts).push_front(mLocalContact);
# Line 859  Line 996 
996        if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::Supported)) request.header(h_Supporteds) = mDum.getMasterProfile()->getSupportedOptionTags();        if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::Supported)) request.header(h_Supporteds) = mDum.getMasterProfile()->getSupportedOptionTags();
997     }     }
998    
999     DebugLog ( << "Dialog::makeRequest: " << request );     if (mDialogSet.mUserProfile->isAnonymous())
1000       {
1001          request.header(h_Privacys).push_back(PrivacyCategory(Symbols::id));
1002       }
1003    
1004       DebugLog ( << "Dialog::makeRequest: " << std::endl << std::endl << request );
1005  }  }
1006    
1007    
# Line 894  Line 1036 
1036           && code >= 200 && code < 300)           && code >= 200 && code < 300)
1037        {        {
1038           // Check if we should add our capabilites to the invite success response           // Check if we should add our capabilites to the invite success response
1039           if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::Allow)) response.header(h_Allows) = mDum.getMasterProfile()->getAllowedMethods();           if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::Allow))
1040           if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::AcceptEncoding)) response.header(h_AcceptEncodings) = mDum.getMasterProfile()->getSupportedEncodings();           {
1041           if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::AcceptLanguage)) response.header(h_AcceptLanguages) = mDum.getMasterProfile()->getSupportedLanguages();              response.header(h_Allows) = mDum.getMasterProfile()->getAllowedMethods();
1042           if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::AllowEvents)) response.header(h_AllowEvents) = mDum.getMasterProfile()->getAllowedEvents();           }
1043           if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::Supported)) response.header(h_Supporteds) = mDum.getMasterProfile()->getSupportedOptionTags();           if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::AcceptEncoding))
1044             {
1045                response.header(h_AcceptEncodings) = mDum.getMasterProfile()->getSupportedEncodings();
1046             }
1047             if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::AcceptLanguage))
1048             {
1049                response.header(h_AcceptLanguages) = mDum.getMasterProfile()->getSupportedLanguages();
1050             }
1051             if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::AllowEvents))
1052             {
1053                response.header(h_AllowEvents) = mDum.getMasterProfile()->getAllowedEvents();
1054             }
1055             if(mDialogSet.getUserProfile()->isAdvertisedCapability(Headers::Supported))
1056             {
1057                response.header(h_Supporteds) = mDum.getMasterProfile()->getSupportedOptionTags();
1058             }
1059        }        }
1060     }     }
1061     else     else
# Line 906  Line 1063 
1063        Helper::makeResponse(response, request, code);        Helper::makeResponse(response, request, code);
1064        response.header(h_To).param(p_tag) = mId.getLocalTag();        response.header(h_To).param(p_tag) = mId.getLocalTag();
1065     }     }
1066     DebugLog ( << "Dialog::makeResponse: " << response);  
1067       DebugLog ( << "Dialog::makeResponse: " << std::endl << std::endl << response);
1068  }  }
1069    
1070    
# Line 925  Line 1083 
1083  ClientSubscription*  ClientSubscription*
1084  Dialog::makeClientSubscription(const SipMessage& request)  Dialog::makeClientSubscription(const SipMessage& request)
1085  {  {
1086     return new ClientSubscription(mDum, *this, request);     return new ClientSubscription(mDum, *this, request, mDefaultSubExpiration);
1087  }  }
1088    
1089    
# Line 948  Line 1106 
1106    
1107    
1108  void  void
1109  Dialog::send(SipMessage& msg)  Dialog::send(SharedPtr<SipMessage> msg)
1110  {  {
1111     if (msg.isRequest() && msg.header(h_CSeq).method() != ACK)     if (msg->isRequest() && msg->header(h_CSeq).method() != ACK)
1112     {     {
1113        mRequests[msg.header(h_CSeq).sequence()] = msg;        mRequests[msg->header(h_CSeq).sequence()] = msg;
1114     }     }
1115     mDum.send(msg);     mDum.send(msg);
1116  }  }
# Line 969  Line 1127 
1127    
1128  void Dialog::possiblyDie()  void Dialog::possiblyDie()
1129  {  {
1130     // !slg! Note:  dialogs should really stick around for 32s, in order to ensure that all 2xx retransmissions get 481 correctly     // !slg! Note:  dialogs should really stick around for 32s, in order to ensure that all 2xx retransmissions get Ack'd, then BYE'd correctly
1131     if (!mDestroying)     if (!mDestroying)
1132     {     {
1133        if (mClientSubscriptions.empty() &&        if (mClientSubscriptions.empty() &&
# Line 982  Line 1140 
1140     }     }
1141  }  }
1142    
1143  ostream&  EncodeStream&
1144  resip::operator<<(ostream& strm, const Dialog& dialog)  resip::operator<<(EncodeStream& strm, const Dialog& dialog)
1145  {  {
1146     strm     strm
1147        << "mClientSubscriptions("        << "mClientSubscriptions("
# Line 1047  Line 1205 
1205   */   */
1206    
1207    
1208    

Legend:
Removed from v.5596  
changed lines
  Added in v.8353

webmaster AT resiprocate DOT org
ViewVC Help
Powered by ViewVC 1.1.27