void DviSubscription::Remove() { iLock.Wait(); DviService* service = iService; if (service != NULL) { service->AddRef(); } iLock.Signal(); if (service != NULL) { service->RemoveSubscription(iSid); service->RemoveRef(); } }
void CpiDeviceDv::Unsubscribe(CpiSubscription& aSubscription, const Brx& aSid) { iLock.Wait(); Brn sid(aSid); SubscriptionMap::iterator it = iSubscriptions.find(sid); if (it == iSubscriptions.end()) { iLock.Signal(); return; } Subscription* subscription = it->second; iLock.Signal(); DviService* service = iDeviceDv.ServiceReference(aSubscription.ServiceType()); if (service != NULL) { service->RemoveSubscription(aSid); service->RemoveRef(); } subscription->iCp = NULL; subscription->iDv->RemoveRef(); // can't safely access subscription now - RemoveRef() above may have resulted in it being deleted }
void DviSessionUpnp::Unsubscribe() { LOG(kDvEvent, "Unsubscribe request: "); LOG(kDvEvent, iHeaderSid.Sid()); LOG(kDvEvent, "\n"); if (!iHeaderSid.Received()) { LOG2(kDvEvent, kError, "Unsubscribe failed - no sid\n"); Error(HttpStatus::kPreconditionFailed); } DviDevice* device; DviService* service; ParseRequestUri(DviProtocolUpnp::kEventUrlTail, &device, &service); if (device == NULL || service == NULL) { LOG2(kDvEvent, kError, "Unsubscribe failed - device=%p, service=%p\n", device, service); Error(HttpStatus::kPreconditionFailed); } DviSubscription* subscription = DviSubscriptionManager::Find(iHeaderSid.Sid()); if (subscription == NULL) { LOG2(kDvEvent, kError, "Unsubscribe failed - couldn't match sid "); LOG2(kDvEvent, kError, iHeaderSid.Sid()); LOG2(kDvEvent, kError, "\n"); Error(HttpStatus::kPreconditionFailed); } service->RemoveSubscription(iHeaderSid.Sid()); if (iHeaderExpect.Continue()) { iWriterResponse->WriteStatus(HttpStatus::kContinue, Http::eHttp11); iWriterResponse->WriteFlush(); } iResponseStarted = true; iWriterResponse->WriteStatus(HttpStatus::kOk, Http::eHttp11); iWriterResponse->WriteHeader(Http::kHeaderConnection, Http::kConnectionClose); iWriterResponse->WriteFlush(); iResponseEnded = true; LOG(kDvEvent, "Unsubscribe complete: "); LOG(kDvEvent, iHeaderSid.Sid()); LOG(kDvEvent, "\n"); }