bool RequestActionReturnableLongPolling_GetZoneMediaList::executeActionLongPolling() { auto id = getOptionValue("id"); std::vector<std::shared_ptr<Raumkernel::Media::Item::MediaItem>> mediaList; rapidjson::StringBuffer jsonStringBuffer; rapidjson::Writer<rapidjson::StringBuffer> jsonWriter(jsonStringBuffer); jsonWriter.StartArray(); // if we got an id we get the list if (!id.empty()) { auto mediaRenderer = getVirtualMediaRenderer(id); if (!mediaRenderer) { logError("Room or Zone with ID: " + id + " not found!", CURRENT_FUNCTION); return false; } std::string zonePlaylistId = Raumkernel::Manager::LISTID_ZONEIDENTIFIER + mediaRenderer->getUDN(); // zone playlists do not have to be extra read, they are always up to date! // So we do only get a copy of the list with shared pointers to media items mediaList = managerEngineer->getMediaListManager()->getList(zonePlaylistId); // add the list items to the jsonWriter // we do not have to lock when we are reading the copied list of the media items because they are shared pointers // and media items only will be created once and will never be updated! addMediaListToJson(mediaRenderer->getUDN(), mediaList, jsonWriter); } // if we have no id provided, then we get the playlist for all virtual renderers else { auto zoneInfoMap = getManagerEngineer()->getZoneManager()->getZoneInformationMap(); for (auto it : zoneInfoMap) { std::string zonePlaylistId = Raumkernel::Manager::LISTID_ZONEIDENTIFIER + it.second.UDN; mediaList = managerEngineer->getMediaListManager()->getList(zonePlaylistId); addMediaListToJson(it.second.UDN, mediaList, jsonWriter); } } jsonWriter.EndArray(); setResponseData(jsonStringBuffer.GetString()); return true; }
std::string RequestActionReturnableLongPolling_GetZoneMediaList::getLastUpdateId() { auto id = getOptionValue("id"); auto mediaRenderer = getVirtualMediaRenderer(id); if (!mediaRenderer) return ""; std::string zonePlaylistId = Raumkernel::Manager::LISTID_ZONEIDENTIFIER + mediaRenderer->getUDN(); auto lastUpdateId = getManagerEngineer()->getMediaListManager()->getLastUpdateIdForList(zonePlaylistId); return lastUpdateId; }
void UPnP::registerServers() { try { if(_address.empty()) getAddress(); if(_address.empty()) { _out.printError("Error: Could not get IP address."); return; } if(_udn.empty()) getUDN(); if(_udn.empty()) { _out.printError("Error: Could not get UDN."); return; } for(std::map<int32_t, Rpc::Server>::iterator i = GD::rpcServers.begin(); i != GD::rpcServers.end(); ++i) { BaseLib::Rpc::PServerInfo settings = i->second.getInfo(); if(settings->ssl || settings->authType != BaseLib::Rpc::ServerInfo::Info::AuthType::none || !settings->webServer) continue; _webserverEventHandler = i->second.addWebserverEventHandler(this); Packets* packet = &_packets[settings->port]; std::string notifyPacketBase = "NOTIFY * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nCACHE-CONTROL: max-age=1800\r\nSERVER: Homegear " + std::string(VERSION) + "\r\nLOCATION: " + "http://" + _address + ":" + std::to_string(settings->port) + "/description.xml\r\n"; std::string alivePacketRoot = notifyPacketBase + "NT: upnp:rootdevice\r\nUSN: " + _st + "::upnp:rootdevice\r\nNTS: ssdp:alive\r\n\r\n"; std::string alivePacketRootUUID = notifyPacketBase + "NT: " + _st + "\r\nUSN: " + _st + "\r\nNTS: ssdp:alive\r\n\r\n"; std::string alivePacket = notifyPacketBase + "NT: urn:schemas-upnp-org:device:basic:1\r\nUSN: " + _st + "\r\nNTS: ssdp:alive\r\n\r\n"; packet->notifyRoot = std::vector<char>(&alivePacketRoot.at(0), &alivePacketRoot.at(0) + alivePacketRoot.size()); packet->notifyRootUUID = std::vector<char>(&alivePacketRootUUID.at(0), &alivePacketRootUUID.at(0) + alivePacketRootUUID.size()); packet->notify = std::vector<char>(&alivePacket.at(0), &alivePacket.at(0) + alivePacket.size()); std::string byebyePacketRoot = notifyPacketBase + "NT: upnp:rootdevice\r\nUSN: " + _st + "::upnp:rootdevice\r\nNTS: ssdp:byebye\r\n\r\n"; std::string byebyePacketRootUUID = notifyPacketBase + "NT: " + _st + "\r\nUSN: " + _st + "\r\nNTS: ssdp:byebye\r\n\r\n"; std::string byebyePacket = notifyPacketBase + "NT: urn:schemas-upnp-org:device:basic:1\r\nUSN: " + _st + "\r\nNTS: ssdp:byebye\r\n\r\n"; packet->byebyeRoot = std::vector<char>(&byebyePacketRoot.at(0), &byebyePacketRoot.at(0) + byebyePacketRoot.size()); packet->byebyeRootUUID = std::vector<char>(&byebyePacketRootUUID.at(0), &byebyePacketRootUUID.at(0) + byebyePacketRootUUID.size()); packet->byebye = std::vector<char>(&byebyePacket.at(0), &byebyePacket.at(0) + byebyePacket.size()); std::string okPacketBase = std::string("HTTP/1.1 200 OK\r\nCache-Control: max-age=1800\r\nLocation: ") + "http://" + _address + ":" + std::to_string(settings->port) + "/description.xml\r\nServer: Homegear " + std::string(VERSION) + "\r\n"; std::string okPacketRoot = okPacketBase + "ST: upnp:rootdevice\r\nUSN: " + _st + "::upnp:rootdevice\r\n\r\n"; std::string okPacketRootUUID = okPacketBase + "ST: " + _st + "\r\nUSN: " + _st + "\r\n\r\n"; std::string okPacket = okPacketBase + "ST: urn:schemas-upnp-org:device:basic:1\r\nUSN: " + _st + "\r\n\r\n"; packet->okRoot = std::vector<char>(&okPacketRoot.at(0), &okPacketRoot.at(0) + okPacketRoot.size()); packet->okRootUUID = std::vector<char>(&okPacketRootUUID.at(0), &okPacketRootUUID.at(0) + okPacketRootUUID.size()); packet->ok = std::vector<char>(&okPacket.at(0), &okPacket.at(0) + okPacket.size()); std::string description = "<?xml version=\"1.0\"?><root xmlns=\"urn:schemas-upnp-org:device-1-0\"><specVersion><major>1</major><minor>0</minor></specVersion>"; description.append(std::string("<URLBase>") + "http://" + _address + ":" + std::to_string(settings->port) + "</URLBase>"); description.append("<device><deviceType>urn:schemas-upnp-org:device:Basic:1</deviceType><friendlyName>Homegear</friendlyName><manufacturer>Homegear UG (haftungsbeschränkt)</manufacturer><manufacturerURL>http://homegear.eu</manufacturerURL>"); description.append("<modelDescription>Homegear</modelDescription><modelName>Homegear</modelName><modelNumber>Homegear " + std::string(VERSION) + "</modelNumber><serialNumber>" + _udn + "</serialNumber><modelURL>http://homegear.eu</modelURL>"); description.append("<UDN>uuid:" + _udn + "</UDN><presentationURL>" + "http://" + _address + ":" + std::to_string(settings->port) + "</presentationURL></device></root>"); packet->description = std::vector<char>(&description.at(0), &description.at(0) + description.size()); } } catch(const std::exception& ex) { _out.printEx(__FILE__, __LINE__, __PRETTY_FUNCTION__, ex.what()); } catch(BaseLib::Exception& ex) { _out.printEx(__FILE__, __LINE__, __PRETTY_FUNCTION__, ex.what()); } catch(...) { _out.printEx(__FILE__, __LINE__, __PRETTY_FUNCTION__); } }