[reSIProcate] How to maintain SUBSCRIBE AppDialogSets?

Scott Godin slgodin at icescape.com
Mon May 7 08:11:46 CDT 2007


...

 

From: Dien Ba Quang [mailto:dienbaquang at gmail.com] 
Sent: Friday, May 04, 2007 11:43 AM
To: Scott Godin
Cc: resiprocate-devel at list.resiprocate.org
Subject: Re: [reSIProcate] How to maintain SUBSCRIBE AppDialogSets?

 

Thanks Scott,

So I should store Subscription handles that were taken from in the two
callback functions?:

void onNewSubscription(ServerSubscriptionHandle is, const SipMessage&
sub) 
void onNewSubscription(ClientSubscriptionHandle, const SipMessage&
notify)

[Scott] yes.



How can I know the Subscription handles are still valid (alive)? Do I
have to do it manual by tracking the status with callback functions: 



[Scott] handle->isValid()


void onTerminated(ClientSubscriptionHandle is, const SipMessage& msg)
virtual void onTerminated(ServerSubscriptionHandle)

And the last one: How can I re-send the subscribe messages (using the
same Subscription handles)?

[Scott] Refreshes are send automatically.  Look at ClientSubscription
and ServerSubscription headers to see what calls you make using the
handles.



Thank you very much.

Regards,
DBQ.

On 5/4/07, Scott Godin <slgodin at icescape.com> wrote:
>  
>  
>  
> 
> Either way should work.  Storing subscription handles is easier to
implement 
> in a safe manner. 
> 
>   
>  
>  
>  
> 
> From: Dien Ba Quang [mailto:dienbaquang at gmail.com] 
>  Sent: Thursday, May 03, 2007 4:18 PM 
>  To: Scott Godin
>  Cc: resiprocate-devel at list.resiprocate.org
>  Subject: Re: [reSIProcate] How to maintain SUBSCRIBE AppDialogSets? 
>   
> 
>   
> 
> Hi Scott,
>  
>  >>"When your app shuts down you should end() all subscriptions " 
>  
>  Thank you for your instructions, but how can I end() all
subscriptions? 
> Call end() function from AppSetDialog class or
> ServerSubscriptionHandle/ClientSubscriptionHandle? So I
> should store all the SUBSCRIBE AppSetDialog or all the SUBSCRIBE
handles? 
>  
>  Thanks in advanced. 
>  
>  Best reagrds,
>  DBQ.
>  
>  
>  
> 
> On 5/3/07, Scott Godin <slgodin at icescape.com> wrote: 
>  
>  
> 
> In general you should not be deleting AppDialogSets - DUM manages
their
> lifetime and will delete them, when they are no longer required.  
> 
> When your app shuts down you should end() all subscriptions and
execute a 
> dum->shutdown while running the process loop, when all dialogs are
destroyed
> the shutdown callback will be called. 
> 
>   
>  
>  
>  
> 
> From: resiprocate-devel-bounces at list.resiprocate.org
> [mailto:resiprocate-devel-bounces at list.resiprocate.org] On
> Behalf Of Dien Ba Quang
>  Sent: Thursday, May 03, 2007 11:35 AM
>  To: resiprocate-devel at list.resiprocate.org
>  Subject: [reSIProcate] How to maintain SUBSCRIBE AppDialogSets? 
>  
> 
>   
> 
> Hi,
>  In my soft phone, I implemented SUBSCRIBE and NOTIFY messages to
maintain a
> buddy list. But I have some problems with the SUBSCRIBE AppDialogSets,
it
> crashed sometimes. Below is my implementation:
>  After received 200 OK for REGISTER messages, send SUBSCRIBE messages
for
> every contacts in my buddy list (code below). 
>  
>  1. The problem is when I try to delete all the AppDialogSets (when
closing 
> soft phone), it crashed my app. So do you know how DUM deletes the
> AppDialogSet? and What's the good ways to maintain the SUBSCRIBE
> AppDialogSets? 
>  2. When I repeated sending SUBSCRIBE messages from another instant
(the 
> same code) to the soft phone, it crashed (just sometime). I don't know
> what's the problem with DUM? It's always crash at line 775 in
dialogset.cxx
>  
>  AppDialog* appDialog =
> mAppDialogSet->createAppDialog(msg);
>  
>  Best regards,
>  DBQ.
>  
>  void SendSubscribe(char* contact, int exp_time)
>  {
>      try {
>          string validContact = validateSipAddress(contact); 
>          NameAddr uasAor(validContact.c_str());
>          Data mevent("presence");
>  
>          //Check if the contact already has the AppDialogSet or not 
>          testAppDialogSet *m_pADS =
uac.getSubscribeDialog(uasAor.uri());
>          if (m_pADS == NULL) //if not -> create a new one and store
into a
> list(contact, group, AppDialogSet) 
>          {
>              testAppDialogSet *m_pADS = new
testAppDialogSet(*(clientDum), 
> "UAC(SUBSCRIBE)"); 
>              uac.addBuddy(uasAor.uri(), "Friends", m_pADS);
>          } 
>  
>          SharedPtr<SipMessage> SubscribeMessage =
> clientDum->makeSubscription(uasAor, mevent, exp_time, 
> m_pADS);        
>          clientDum->send(SubscribeMessage);
>      }
>      catch (BaseException& e) {
>          return;
>      }
>  
>  //delete all SUBSCRIBE AppDialogSets 
>  void TestUac::deleteSubscribeDialog()
>  {
>     TestUac::BuddyIterator i;
>     i = mBuddies.begin ();    
>     while ( i != mBuddies.end() )
>     {
>          if ( i->presDialog != NULL ) 
>          {
>              delete i->presDialog;
>              i->presDialog = NULL; 
>          }
>          i = mBuddies.erase (i);
>     }
>  }
>  
>  //Subscription Callbacks 
>  void TestUac::onUpdateActive(ClientSubscriptionHandle is,
> const SipMessage& notify, bool outOfOrder) 
>  {
>      if (notify.header(h_Event).value() == Data("message-summary"))
>      {
>          is->acceptUpdate();
>          //TODO:check voice message
>  
>          return;
>      }
>      is->acceptUpdate(); 
>      Contents *body = notify.getContents ();
>      //Received NOTIFY message event with no contents
>      if (!body){
>          return;
>      }
>      Pidf* pidf = dynamic_cast<Pidf*>(body);    
>      Uri uri = pidf->getEntity(); 
>      //update status of uri as Online
>      PresenceNotify((char*)uri.user().c_str(), 1, 0);
>  }
>  
>  void TestUac::onNewSubscription(ServerSubscriptionHandle
> is, const SipMessage& sub) 
>  {
>      SharedPtr<SipMessage> sipmsg = is->accept(); 
>      is->send(sipmsg);
>      Data fromAor(sub.header(h_From).uri().getAor());
>      string name = str_get_username(fromAor.c_str ());
>      if (sub.header(h_Expires).value() != 0){
>          Token state;
>          state.value() = Data("active");
>          Pidf *doc = new Pidf(Mime("application", "pidf-xml")); 
>          doc->setEntity(myUri);
>          doc->setSimpleStatus(true);
>          sipmsg = is->update(doc); 
>          sipmsg->header(h_SubscriptionState) = state;
>          is->send(sipmsg); 
>          delete doc;
>  
>          //check if the name is not online --> resend SUBSCRIBE
message
>          PresenceNotify((char*)name.c_str(), 1, 1); 
>      }
>      else {
>          //in case Unsubscribe expire = 0 
>          PresenceNotify((char*)name.c_str(), 0, 0);
>      }
>  } 
> 
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20070507/1970456d/attachment.htm>


More information about the resiprocate-devel mailing list