void Run() { do { // wait for a connection NPT_Socket* client = NULL; NPT_LOG_FINE_1("waiting for connection on port %d...", m_Port); NPT_Result result = m_Socket.WaitForNewClient(client, NPT_TIMEOUT_INFINITE); if (NPT_FAILED(result) || client == NULL) return; NPT_SocketInfo client_info; client->GetInfo(client_info); NPT_LOG_FINE_2("client connected (%s -> %s)", client_info.local_address.ToString().GetChars(), client_info.remote_address.ToString().GetChars()); // get the output stream NPT_OutputStreamReference output; client->GetOutputStream(output); // generate policy based on our current IP NPT_String policy = "<cross-domain-policy>"; policy += "<allow-access-from domain=\""+client_info.local_address.GetIpAddress().ToString()+"\" to-ports=\""+m_AuthorizedPorts+"\"/>"; policy += "<allow-access-from domain=\""+client_info.remote_address.GetIpAddress().ToString()+"\" to-ports=\""+m_AuthorizedPorts+"\"/>"; policy += "</cross-domain-policy>"; NPT_MemoryStream* mem_input = new NPT_MemoryStream(); mem_input->Write(policy.GetChars(), policy.GetLength()); NPT_InputStreamReference input(mem_input); NPT_StreamToStreamCopy(*input, *output); delete client; } while (!m_Aborted); }
/*---------------------------------------------------------------------- | NPT_DynamicLibrary::Load +---------------------------------------------------------------------*/ NPT_Result NPT_DynamicLibrary::Load(const char* name, NPT_Flags flags, NPT_DynamicLibrary*& library) { NPT_WIN32_USE_CHAR_CONVERSION; NPT_COMPILER_UNUSED(flags); if (name == NULL) return NPT_ERROR_INVALID_PARAMETERS; // default return value library = NULL; // load the lib NPT_LOG_FINE_2("loading library %s, flags=%x", name, flags); HMODULE handle = LoadLibraryW(NPT_WIN32_A2W(name)); if (handle == NULL) { NPT_LOG_FINE("library not found"); return NPT_FAILURE; } // instantiate the object NPT_LOG_FINE_1("library %s loaded", name); library = new NPT_DynamicLibrary(new NPT_Win32DynamicLibrary(handle, name)); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_SsdpSender::SendSsdp +---------------------------------------------------------------------*/ NPT_Result PLT_SsdpSender::SendSsdp(NPT_HttpRequest& request, const char* usn, const char* target, NPT_UdpSocket& socket, bool notify, const NPT_SocketAddress* addr /* = NULL */) { NPT_CHECK_SEVERE(FormatPacket(request, usn, target, socket, notify)); // logging NPT_LOG_FINE_2("Sending SSDP %s for %s", (const char*)request.GetMethod(), usn); PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, &request); // use a memory stream to write all the data NPT_MemoryStream stream; NPT_Result res = request.Emit(stream); if (NPT_FAILED(res)) return res; // copy stream into a data packet and send it NPT_LargeSize size; stream.GetSize(size); if (size != (NPT_Size)size) return NPT_ERROR_OUT_OF_RANGE; NPT_DataBuffer packet(stream.GetData(), (NPT_Size)size); return socket.Send(packet, addr); }
/*---------------------------------------------------------------------- | PLT_EventSubscriber::AddCallbackURL +---------------------------------------------------------------------*/ NPT_Result PLT_EventSubscriber::AddCallbackURL(const char* callback_url) { NPT_CHECK_POINTER_FATAL(callback_url); NPT_LOG_FINE_2("Adding callback \"%s\" to subscriber %s", callback_url, m_SID.GetChars()); return m_CallbackURLs.Add(callback_url); }
/*---------------------------------------------------------------------- | PLT_EventSubscriber::SetExpirationTime +---------------------------------------------------------------------*/ NPT_Result PLT_EventSubscriber::SetTimeout(NPT_Timeout seconds) { NPT_LOG_FINE_2("subscriber (%s) expiring in %d seconds", m_SID.GetChars(), seconds); // -1 means infinite but we default to 300 secs if (seconds == -1) seconds = 300; NPT_System::GetCurrentTimeStamp(m_ExpirationTime); m_ExpirationTime += NPT_TimeInterval((double)seconds); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnEventNotify +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars) { if (m_Listener) { // parse LastChange var into smaller vars PLT_StateVariable* lastChangeVar = NULL; if (NPT_SUCCEEDED(NPT_ContainerFind(*vars, PLT_ListStateVariableNameFinder("LastChange"), lastChangeVar))) { vars->Remove(lastChangeVar); PLT_Service* var_service = lastChangeVar->GetService(); NPT_String text = lastChangeVar->GetValue(); NPT_XmlNode* xml = NULL; NPT_XmlParser parser; if (NPT_FAILED(parser.Parse(text, xml)) || !xml || !xml->AsElementNode()) { delete xml; return NPT_FAILURE; } NPT_XmlElementNode* node = xml->AsElementNode(); if (!node->GetTag().Compare("Event", true)) { // look for the instance with attribute id = 0 NPT_XmlElementNode* instance = NULL; for (NPT_Cardinal i=0; i<node->GetChildren().GetItemCount(); i++) { NPT_XmlElementNode* child; if (NPT_FAILED(PLT_XmlHelper::GetChild(node, child, i))) continue; if (!child->GetTag().Compare("InstanceID", true)) { // extract the "val" attribute value NPT_String value; if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(child, "val", value)) && !value.Compare("0")) { instance = child; break; } } } // did we find an instance with id = 0 ? if (instance != NULL) { // all the children of the Instance node are state variables for (NPT_Cardinal j=0; j<instance->GetChildren().GetItemCount(); j++) { NPT_XmlElementNode* var_node; if (NPT_FAILED(PLT_XmlHelper::GetChild(instance, var_node, j))) continue; // look for the state variable in this service const NPT_String* value = var_node->GetAttribute("val"); PLT_StateVariable* var = var_service->FindStateVariable(var_node->GetTag()); if (value != NULL && var != NULL) { // get the value and set the state variable // if it succeeded, add it to the list of vars we'll event if (NPT_SUCCEEDED(var->SetValue(*value, false))) { vars->Add(var); NPT_LOG_FINE_2("PLT_MediaController received var change for (%s): %s", (const char*)var->GetName(), (const char*)var->GetValue()); } } } } } delete xml; } if (vars->GetItemCount()) { m_Listener->OnMRStateVariablesChanged(service, vars); } } return NPT_SUCCESS; }