TUint CpiDeviceDv::Subscribe(CpiSubscription& aSubscription, const OpenHome::Uri& /*aSubscriber*/) { Brh sid; iDeviceDv.CreateSid(sid); Brn tmp(sid); Brh transfer(tmp); aSubscription.SetSid(transfer); TUint durationSecs = iDeviceCp->GetCpStack().Env().InitParams()->SubscriptionDurationSecs(); DviSubscription* subscriptionDv = new DviSubscription(iDeviceDv.GetDvStack(), iDeviceDv, *this, NULL, sid); subscriptionDv->AddRef(); // guard against subscription expiring before client tries to renew or unsubscribe iDeviceDv.GetDvStack().SubscriptionManager().AddSubscription(*subscriptionDv); subscriptionDv->SetDuration(durationSecs); iLock.Wait(); if (iSubscriptions.size() == 0) { iShutdownSem.Wait(); // consume shutdown signal now the map is non-empty } Brn sid2(subscriptionDv->Sid()); Subscription* subscription = new Subscription(aSubscription, subscriptionDv); iSubscriptions.insert(std::pair<Brn,Subscription*>(sid2, subscription)); iDeviceCp->AddRef(); iLock.Signal(); DviService* service = iDeviceDv.ServiceReference(aSubscription.ServiceType()); ASSERT(service != NULL); service->AddSubscription(subscriptionDv); service->RemoveRef(); return durationSecs; }
void DviSubscriptionManager::QueueUpdate(DviSubscription& aSubscription) { aSubscription.AddRef(); iLock.Wait(); iList.push_back(&aSubscription); Signal(); iLock.Signal(); }
void DviSubscriptionManager::AddSubscription(DviSubscription& aSubscription) { iLock.Wait(); Brn sid(aSubscription.Sid()); iMap.insert(std::pair<Brn,DviSubscription*>(sid, &aSubscription)); aSubscription.AddRef(); iLock.Signal(); }
DviSubscription* DviSubscriptionManager::Find(const Brx& aSid) { DviSubscription* subs = NULL; iLock.Wait(); Brn sid(aSid); Map::iterator it = iMap.find(sid); if (it != iMap.end()) { subs = it->second; subs->AddRef(); } iLock.Signal(); return subs; }