/*---------------------------------------------------------------------- | PLT_MediaServer::OnSearch +---------------------------------------------------------------------*/ NPT_Result PLT_MediaServer::OnSearch(PLT_ActionReference& action, const PLT_HttpRequestContext& context) { NPT_COMPILER_UNUSED(context); NPT_Result res; NPT_String container_id; NPT_String search; NPT_String filter; NPT_String start; NPT_String count; NPT_String sort; NPT_List<NPT_String> sort_list; if (NPT_FAILED(action->GetArgumentValue("ContainerId", container_id)) || NPT_FAILED(action->GetArgumentValue("SearchCriteria", search)) || NPT_FAILED(action->GetArgumentValue("Filter", filter)) || NPT_FAILED(action->GetArgumentValue("StartingIndex", start)) || NPT_FAILED(action->GetArgumentValue("RequestedCount", count)) || NPT_FAILED(action->GetArgumentValue("SortCriteria", sort))) { NPT_LOG_WARNING("Missing arguments"); action->SetError(402, "Invalid args"); return NPT_SUCCESS; } /* convert index and counts to int */ NPT_UInt32 starting_index, requested_count; if (NPT_FAILED(start.ToInteger(starting_index)) || NPT_FAILED(count.ToInteger(requested_count))) { NPT_LOG_WARNING_2("Invalid arguments (%s, %s)", start.GetChars(), count.GetChars()); action->SetError(402, "Invalid args"); return NPT_FAILURE; } /* parse sort criteria */ if (NPT_FAILED(ParseSort(sort, sort_list))) { NPT_LOG_WARNING_1("Unsupported or invalid sort criteria error (%s)", sort.GetChars()); action->SetError(709, "Unsupported or invalid sort criteria error"); return NPT_FAILURE; } NPT_LOG_INFO_5("Processing Search from %s with id=\"%s\", search=\"%s\", start=%d, count=%d", (const char*)context.GetRemoteAddress().GetIpAddress().ToString(), (const char*)container_id, (const char*)search, starting_index, requested_count); if (search.IsEmpty() || search == "*") { res = OnBrowseDirectChildren( action, container_id, filter, starting_index, requested_count, sort, context); } else { res = OnSearchContainer( action, container_id, search, filter, starting_index, requested_count, sort, context); } if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) { action->SetError(800, "Internal error"); } return res; }
NPT_Result GPAC_MediaRenderer::OnAction(PLT_ActionReference& action, const PLT_HttpRequestContext& context) { NPT_COMPILER_UNUSED(context); /* parse the action name */ NPT_String name = action->GetActionDesc().GetName(); m_ip_src = context.GetRemoteAddress().GetIpAddress().ToString(); /* Is it a ConnectionManager Service Action ? */ if (name.Compare("GetCurrentConnectionIDs", true) == 0) { if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) { return NPT_FAILURE; } return NPT_SUCCESS; } if (name.Compare("GetProtocolInfo", true) == 0) { if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) { return NPT_FAILURE; } return NPT_SUCCESS; } if (name.Compare("GetCurrentConnectionInfo", true) == 0) { return OnGetCurrentConnectionInfo(action); } if (name.Compare("StopForMigration", true) == 0) { NPT_String res = m_pUPnP->OnMigrate(); m_pMigrationService->SetStateVariable("MigrationStatus", "OK"); m_pMigrationService->SetStateVariable("MigrationMetaData", res); if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) { return NPT_FAILURE; } return NPT_SUCCESS; } /* Is it a AVTransport Service Action ? */ // since all actions take an instance ID and we only support 1 instance // verify that the Instance ID is 0 and return an error here now if not NPT_String serviceType = action->GetActionDesc().GetService()->GetServiceType(); if (serviceType.Compare("urn:schemas-upnp-org:service:AVTransport:1", true) == 0) { if (NPT_FAILED(action->VerifyArgumentValue("InstanceID", "0"))) { action->SetError(802,"Not valid InstanceID."); return NPT_FAILURE; } } if (name.Compare("GetCurrentTransportActions", true) == 0) { if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) { return NPT_FAILURE; } return NPT_SUCCESS; } if (name.Compare("GetDeviceCapabilities", true) == 0) { if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) { return NPT_FAILURE; } return NPT_SUCCESS; } if (name.Compare("GetMediaInfo", true) == 0) { if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) { return NPT_FAILURE; } return NPT_SUCCESS; } if (name.Compare("GetPositionInfo", true) == 0) { if (m_pUPnP->m_pTerm->root_scene) { char szVal[100]; m_pAVService->SetStateVariable("CurrentTrack", "0"); format_time_string(szVal, m_Duration); m_pAVService->SetStateVariable("CurrentTrackDuration", szVal); m_pAVService->SetStateVariable("CurrentTrackMetadata", ""); m_pAVService->SetStateVariable("CurrentTrackURI", ""); format_time_string(szVal, m_Time); m_pAVService->SetStateVariable("RelativeTimePosition", szVal); m_pAVService->SetStateVariable("AbsoluteTimePosition", szVal); m_pAVService->SetStateVariable("RelativeCounterPosition", "2147483647"); // means NOT_IMPLEMENTED m_pAVService->SetStateVariable("AbsoluteCounterPosition", "2147483647"); // means NOT_IMPLEMENTED } else { if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) { return NPT_FAILURE; } } return NPT_SUCCESS; } if (name.Compare("GetTransportInfo", true) == 0) { if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) { return NPT_FAILURE; } return NPT_SUCCESS; } if (name.Compare("GetTransportSettings", true) == 0) { if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) { return NPT_FAILURE; } return NPT_SUCCESS; } if (name.Compare("Next", true) == 0) { return OnNext(action); } if (name.Compare("Pause", true) == 0) { return OnPause(action); } if (name.Compare("Play", true) == 0) { return OnPlay(action); } if (name.Compare("Previous", true) == 0) { return OnPrevious(action); } if (name.Compare("Seek", true) == 0) { return OnSeek(action); } if (name.Compare("Stop", true) == 0) { return OnStop(action); } if (name.Compare("SetAVTransportURI", true) == 0) { return OnSetAVTransportURI(action); } if (name.Compare("SetPlayMode", true) == 0) { return OnSetPlayMode(action); } /* Is it a RendererControl Service Action ? */ if (serviceType.Compare("urn:schemas-upnp-org:service:RenderingControl:1", true) == 0) { /* we only support master channel */ if (NPT_FAILED(action->VerifyArgumentValue("Channel", "Master"))) { action->SetError(402,"Invalid Args."); return NPT_FAILURE; } } if (name.Compare("GetVolume", true) == 0) { NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); return NPT_SUCCESS; } if (name.Compare("GetMute", true) == 0) { NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); return NPT_SUCCESS; } if (name.Compare("SetVolume", true) == 0) { return OnSetVolume(action); } if (name.Compare("SetMute", true) == 0) { return OnSetMute(action); } action->SetError(401,"No Such Action."); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | PLT_MediaServer::OnBrowse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaServer::OnBrowse(PLT_ActionReference& action, const PLT_HttpRequestContext& context) { NPT_Result res; NPT_String object_id; NPT_String browse_flag_val; NPT_String filter; NPT_String start; NPT_String count; NPT_String sort; NPT_List<NPT_String> sort_list; if (NPT_FAILED(action->GetArgumentValue("ObjectId", object_id)) || NPT_FAILED(action->GetArgumentValue("BrowseFlag", browse_flag_val)) || NPT_FAILED(action->GetArgumentValue("Filter", filter)) || NPT_FAILED(action->GetArgumentValue("StartingIndex", start)) || NPT_FAILED(action->GetArgumentValue("RequestedCount", count)) || NPT_FAILED(action->GetArgumentValue("SortCriteria", sort))) { NPT_LOG_WARNING("Missing arguments"); action->SetError(402, "Invalid args"); return NPT_SUCCESS; } /* extract flag */ BrowseFlags flag; if (NPT_FAILED(ParseBrowseFlag(browse_flag_val, flag))) { /* error */ NPT_LOG_WARNING_1("BrowseFlag value not allowed (%s)", (const char*)browse_flag_val); action->SetError(402, "Invalid args"); return NPT_SUCCESS; } /* convert index and counts to int */ NPT_UInt32 starting_index, requested_count; if (NPT_FAILED(start.ToInteger(starting_index)) || NPT_FAILED(count.ToInteger(requested_count)) || PLT_Didl::ConvertFilterToMask(filter) == 0) { NPT_LOG_WARNING_3("Invalid arguments (%s, %s, %s)", start.GetChars(), count.GetChars(), filter.GetChars()); action->SetError(402, "Invalid args"); return NPT_FAILURE; } /* parse sort criteria for validation */ if (NPT_FAILED(ParseSort(sort, sort_list))) { NPT_LOG_WARNING_1("Unsupported or invalid sort criteria error (%s)", sort.GetChars()); action->SetError(709, "Unsupported or invalid sort criteria error"); return NPT_FAILURE; } NPT_LOG_FINE_6("Processing %s from %s with id=\"%s\", filter=\"%s\", start=%d, count=%d", (const char*)browse_flag_val, (const char*)context.GetRemoteAddress().GetIpAddress().ToString(), (const char*)object_id, (const char*)filter, starting_index, requested_count); /* Invoke the browse function */ if (flag == BROWSEMETADATA) { res = OnBrowseMetadata( action, object_id, filter, starting_index, requested_count, sort, context); } else { res = OnBrowseDirectChildren( action, object_id, filter, starting_index, requested_count, sort, context); } if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) { action->SetError(800, "Internal error"); } return res; }