[reSIProcate] How to maintain SUBSCRIBE AppDialogSets?

Dien Ba Quang dienbaquang at gmail.com
Tue May 8 09:12:31 CDT 2007


Thank you very much Scott.
I appreciated that.

Best regards,
DBQ.

On 5/7/07, Scott Godin <slgodin at icescape.com> wrote:
>
>>
>
>
> *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/20070508/b15e79f8/attachment.htm>


More information about the resiprocate-devel mailing list