From: Dien Ba Quang
[mailto:dienbaquang@xxxxxxxxx]
Sent: Friday, May 04, 2007 11:43 AM
To: Scott Godin
Cc: resiprocate-devel@xxxxxxxxxxxxxxxxxxxx
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@xxxxxxxxxxxx>
wrote:
>
>
>
>
> Either way should work. Storing subscription handles is easier
to implement
> in a safe manner.
>
>
>
>
>
>
> From: Dien Ba Quang [mailto:dienbaquang@xxxxxxxxx]
> Sent: Thursday, May 03, 2007 4:18 PM
> To: Scott Godin
> Cc: resiprocate-devel@xxxxxxxxxxxxxxxxxxxx
> 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@xxxxxxxxxxxx>
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@xxxxxxxxxxxxxxxxxxxx
> [mailto:resiprocate-devel-bounces@xxxxxxxxxxxxxxxxxxxx]
On
> Behalf Of Dien Ba Quang
> Sent: Thursday, May 03, 2007 11:35 AM
> To: resiprocate-devel@xxxxxxxxxxxxxxxxxxxx
> 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);
> }
> }
>
>