[reSIProcate] How to maintain SUBSCRIBE AppDialogSets?
Dien Ba Quang
dienbaquang at gmail.com
Thu May 3 15:17:43 CDT 2007
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/20070503/28210b5c/attachment.htm>
More information about the resiprocate-devel
mailing list