int LocalNodeInfo::unsubscribe (uint16 ui16ClientId, const char *pszGroupName, uint16 ui16Tag) { char *pszOnDemandDataGroupName = getOnDemandDataGroupName (pszGroupName); if (pszOnDemandDataGroupName == NULL) { // The on-demand subscription group name could not be generated return -1; } _m.lock (306); SubscriptionList *pSL = _localSubscriptions.get (ui16ClientId); int rc = 0; if (pSL == NULL) { rc = -2; } else { Subscription *pSub = pSL->getSubscription (pszGroupName); if (pSub == NULL) { rc = -3; } else { uint8 ui8SubscriptionType = pSub->getSubscriptionType(); if ((ui8SubscriptionType == Subscription::GROUP_SUBSCRIPTION) && (ui16Tag == 0)) { if (pSL->removeGroup (pszGroupName)) { rc = -4; } else { if (pSL->removeGroup (pszOnDemandDataGroupName)) { rc = -5; } } } else if ((ui8SubscriptionType == Subscription::GROUP_TAG_SUBSCRIPTION) && (ui16Tag != 0)) { if (pSL->removeGroupTag (pszGroupName, ui16Tag)) { rc = -6; } else { if (pSL->removeGroupTag (pszOnDemandDataGroupName, ui16Tag)) { rc = -7; } } } } } if (rc == 0) { recomputeConsolidateSubsciptionList (); } free (pszOnDemandDataGroupName); _m.unlock (306); return rc; }
int LocalNodeInfo::subscribe (uint16 ui16ClientId, const char *pszGroupName, Subscription *pSubscription) { _m.lock (300); if (pszGroupName == NULL || pSubscription == NULL) { delete pSubscription; _m.unlock (300); return -1; } char *pszOnDemandDataGroupName = getOnDemandDataGroupName (pszGroupName); if (pszOnDemandDataGroupName == NULL) { // The on-demand subscription group name could not be generated delete pSubscription; _m.unlock (300); return -2; } Subscription *pOnDemandSubscription = pSubscription->getOnDemandSubscription(); if (pOnDemandSubscription == NULL) { free (pszOnDemandDataGroupName); delete pSubscription; _m.unlock (300); return -3; } SubscriptionList *pSL = _localSubscriptions.get (ui16ClientId); if (pSL == NULL) { pSL = new SubscriptionList(); _localSubscriptions.put (ui16ClientId, pSL); } if (pSL->addGroup (pszGroupName, pSubscription) != 0) { // The subscription could not be added free (pszOnDemandDataGroupName); delete pSubscription; delete pOnDemandSubscription; _m.unlock (300); return -4; } if (pSL->addGroup (pszOnDemandDataGroupName, pOnDemandSubscription) != 0) { // The on-demand subscription could not be added free (pszOnDemandDataGroupName); delete pOnDemandSubscription; pSL->removeGroup (pszGroupName, pSubscription); // Should delete pSubscription _m.unlock (300); return -5; } // The subscription was added, check if the ConsolidateList needs to be modified too. updateConsolidateSubsciptionList (pszGroupName, pSubscription); // The subscription was added, check if the ConsolidateList needs to be modified too. updateConsolidateSubsciptionList (pszOnDemandDataGroupName, pOnDemandSubscription); free (pszOnDemandDataGroupName); _m.unlock (300); return 0; }
int LocalNodeInfo::unsubscribe (uint16 ui16ClientId, const char *pszGroupName) { char *pszOnDemandDataGroupName = getOnDemandDataGroupName (pszGroupName); if (pszOnDemandDataGroupName == NULL) { // The on-demand subscription group name could not be generated return -1; } _m.lock (305); SubscriptionList *pSL = _localSubscriptions.get (ui16ClientId); if (pSL != NULL) { if ((pSL->removeGroup (pszGroupName) == 0) && (pSL->removeGroup (pszOnDemandDataGroupName) == 0)) { recomputeConsolidateSubsciptionList(); free (pszOnDemandDataGroupName); _m.unlock (305); return 0; } } free (pszOnDemandDataGroupName); _m.unlock (305); return -2; }