/*---------------------------------------------------------------------- | PLT_MediaController::Seek +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::Seek(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, NPT_String unit, NPT_String target, void* userdata) { PLT_ActionReference action; NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction( device, "urn:schemas-upnp-org:service:AVTransport:1", "Seek", action)); // Set the unit if (NPT_FAILED(action->SetArgumentValue("Unit", unit))) { return NPT_ERROR_INVALID_PARAMETERS; } // Set the target if (NPT_FAILED(action->SetArgumentValue("Target", target))) { return NPT_ERROR_INVALID_PARAMETERS; } return InvokeActionWithInstance(action, instance_id, userdata); }
/*---------------------------------------------------------------------- | PLT_MediaRenderer::OnSetAVTransportURI +---------------------------------------------------------------------*/ NPT_Result PLT_MediaRenderer::OnSetAVTransportURI(PLT_ActionReference& action) { /*test*/ PLT_Service* serviceAVT; NPT_CHECK_WARNING(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceAVT)); // update service state variables //serviceAVT->SetStateVariable("TransportState", "TRANSITIONING"); /*test*/ if (m_Delegate) { return m_Delegate->OnSetAVTransportURI(action); } // default implementation is using state variable NPT_String uri; NPT_CHECK_WARNING(action->GetArgumentValue("CurrentURI", uri)); NPT_String metadata; NPT_CHECK_WARNING(action->GetArgumentValue("CurrentURIMetaData", metadata)); //PLT_Service* serviceAVT; //NPT_CHECK_WARNING(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceAVT)); // update service state variables serviceAVT->SetStateVariable("AVTransportURI", uri); serviceAVT->SetStateVariable("AVTransportURIMetaData", metadata); //serviceAVT->SetStateVariable("TransportState", "PLAYING");//test OutputDebugString(uri.GetChars()); return NPT_SUCCESS; }
bool InvokeUpdateObject(const char* id, const char* curr_value, const char* new_value) { CURL url(id); PLT_DeviceDataReference device; PLT_Service* cds; PLT_ActionReference action; CLog::Log(LOGDEBUG, "UPNP: attempting to invoke UpdateObject for %s", id); // check this server supports UpdateObject action NPT_CHECK_LABEL(FindServer(url.GetHostName().c_str(), device),failed); NPT_CHECK_LABEL(device->FindServiceById("urn:upnp-org:serviceId:ContentDirectory", cds),failed); NPT_CHECK_LABEL(m_CtrlPoint->CreateAction( device, "urn:schemas-upnp-org:service:ContentDirectory:1", "UpdateObject", action), failed); NPT_CHECK_LABEL(action->SetArgumentValue("ObjectID", url.GetFileName().c_str()), failed); NPT_CHECK_LABEL(action->SetArgumentValue("CurrentTagValue", curr_value), failed); NPT_CHECK_LABEL(action->SetArgumentValue("NewTagValue", new_value), failed); NPT_CHECK_LABEL(m_CtrlPoint->InvokeAction(action, NULL),failed); CLog::Log(LOGDEBUG, "UPNP: invoked UpdateObject successfully"); return true; failed: CLog::Log(LOGINFO, "UPNP: invoking UpdateObject failed"); return false; }
/*---------------------------------------------------------------------- | PLT_MediaRenderer::OnSetAVTransportURI +---------------------------------------------------------------------*/ NPT_Result PLT_MediaRenderer::OnSetAVTransportURI(PLT_ActionReference& action) { if (m_Delegate) { return m_Delegate->OnSetAVTransportURI(action); } // default implementation is using state variable NPT_String uri; NPT_CHECK_WARNING(action->GetArgumentValue("CurrentURI", uri)); NPT_String metadata; NPT_CHECK_WARNING(action->GetArgumentValue("CurrentURIMetaData", metadata)); PLT_Service* serviceAVT; NPT_CHECK_WARNING(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceAVT)); // update service state variables serviceAVT->SetStateVariable("AVTransportURI", uri); serviceAVT->SetStateVariable("AVTransportURIMetaData", metadata); serviceAVT->SetStateVariable("TransportState", "STOPPED"); serviceAVT->SetStateVariable("TransportStatus", "OK"); serviceAVT->SetStateVariable("TransportPlaySpeed", "1"); NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnGetCurrentTransportActionsResponse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnGetCurrentTransportActionsResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata) { NPT_String actions; PLT_StringList values; if (NPT_FAILED(res) || action->GetErrorCode() != 0) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("Actions", actions))) { goto bad_action; } // parse the list of actions and return a list to listener ParseCSV(actions, values); m_Delegate->OnGetCurrentTransportActionsResult(NPT_SUCCESS, device, &values, userdata); return NPT_SUCCESS; bad_action: m_Delegate->OnGetCurrentTransportActionsResult(NPT_FAILURE, device, NULL, userdata); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | CUPnPRenderer::OnSetAVTransportURI +---------------------------------------------------------------------*/ NPT_Result CUPnPRenderer::OnSetAVTransportURI(PLT_ActionReference& action) { NPT_String uri, meta; PLT_Service* service; NPT_CHECK_SEVERE(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", service)); NPT_CHECK_SEVERE(action->GetArgumentValue("CurrentURI", uri)); NPT_CHECK_SEVERE(action->GetArgumentValue("CurrentURIMetaData", meta)); // if not playing already, just keep around uri & metadata // and wait for play command if (!g_application.m_pPlayer->IsPlaying() && g_windowManager.GetActiveWindow() != WINDOW_SLIDESHOW) { service->SetStateVariable("TransportState", "STOPPED"); service->SetStateVariable("TransportStatus", "OK"); service->SetStateVariable("TransportPlaySpeed", "1"); service->SetStateVariable("AVTransportURI", uri); service->SetStateVariable("AVTransportURIMetaData", meta); service->SetStateVariable("NextAVTransportURI", ""); service->SetStateVariable("NextAVTransportURIMetaData", ""); NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); return NPT_SUCCESS; } return PlayMedia(uri, meta, action.AsPointer()); }
/*---------------------------------------------------------------------- | PLT_MediaController::GetCurrentConnectionInfo +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::GetCurrentConnectionInfo(PLT_DeviceDataReference& device, NPT_UInt32 connection_id, void* userdata) { PLT_ActionReference action; NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction( device, "urn:schemas-upnp-org:service:ConnectionManager:1", "GetCurrentConnectionInfo", action)); // set the New PlayMode if (NPT_FAILED(action->SetArgumentValue("ConnectionID", NPT_String::FromInteger(connection_id)))) { return NPT_ERROR_INVALID_PARAMETERS; } // set the arguments on the action, this will check the argument values if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) { return NPT_ERROR_INVALID_PARAMETERS; } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaController::SetVolume +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::SetVolume(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, const char* channel, int volume, void* userdata) { PLT_ActionReference action; NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction( device, "urn:schemas-upnp-org:service:RenderingControl:1", "SetVolume", action)); // set the channel if (NPT_FAILED(action->SetArgumentValue("Channel", channel))) { return NPT_ERROR_INVALID_PARAMETERS; } if (NPT_FAILED(action->SetArgumentValue("DesiredVolume", NPT_String::FromInteger(volume)))) { return NPT_ERROR_INVALID_PARAMETERS; } return InvokeActionWithInstance(action, instance_id, userdata); }
/*---------------------------------------------------------------------- | PLT_MediaConnect::OnIsValidated +---------------------------------------------------------------------*/ NPT_Result PLT_MediaConnect::OnIsValidated(PLT_ActionReference& action, PLT_MediaConnectInfo* mc_info) { bool validated = true; NPT_String deviceID; action->GetArgumentValue("DeviceID", deviceID); /* is there a device ID passed ? */ if (deviceID.GetLength()) { /* lookup the MediaConnectInfo from the UDN */ NPT_String MAC; PLT_MediaConnectInfo* device_info; if (NPT_FAILED(LookUpMediaConnectInfo(deviceID, device_info))) { validated = false; } else { validated = device_info->m_Validated; } } else { validated = mc_info?mc_info->m_Validated:true; } action->SetArgumentValue("Result", validated?"1":"0"); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnGetCurrentConnectionIDsResponse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnGetCurrentConnectionIDsResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata) { NPT_String value; PLT_StringList IDs; if (NPT_FAILED(res) || action->GetErrorCode() != 0) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("ConnectionIDs", value))) { goto bad_action; } // parse the list of medias and return a list to listener ParseCSV(value, IDs); m_Listener->OnGetCurrentConnectionIDsResult(NPT_SUCCESS, device, &IDs, userdata); return NPT_SUCCESS; bad_action: m_Listener->OnGetCurrentConnectionIDsResult(NPT_FAILURE, device, NULL, userdata); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnGetMuteResponse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnGetMuteResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata) { NPT_String channel, mute; if (NPT_FAILED(res) || action->GetErrorCode() != 0) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("Channel", channel))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("CurrentMute", mute))) { goto bad_action; } m_Delegate->OnGetMuteResult( NPT_SUCCESS, device, channel, PLT_Service::IsTrue(mute)?true:false, userdata); return NPT_SUCCESS; bad_action: m_Delegate->OnGetMuteResult(NPT_FAILURE, device, "", false, userdata); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnGetVolumeResponse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnGetVolumeResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata) { NPT_String channel; NPT_String current_volume; NPT_UInt32 volume; if (NPT_FAILED(res) || action->GetErrorCode() != 0) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("Channel", channel))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("CurrentVolume", current_volume))) { goto bad_action; } if (NPT_FAILED(current_volume.ToInteger(volume))) { goto bad_action; } m_Delegate->OnGetVolumeResult(NPT_SUCCESS, device, channel, volume, userdata); return NPT_SUCCESS; bad_action: m_Delegate->OnGetVolumeResult(NPT_FAILURE, device, "", 0, userdata); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnGetProtocolInfoResponse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnGetProtocolInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata) { NPT_String source_info, sink_info; PLT_StringList sources, sinks; if (NPT_FAILED(res) || action->GetErrorCode() != 0) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("Source", source_info))) { goto bad_action; } ParseCSV(source_info, sources); if (NPT_FAILED(action->GetArgumentValue("Sink", sink_info))) { goto bad_action; } ParseCSV(sink_info, sinks); m_Delegate->OnGetProtocolInfoResult(NPT_SUCCESS, device, &sources, &sinks, userdata); return NPT_SUCCESS; bad_action: m_Delegate->OnGetProtocolInfoResult(NPT_FAILURE, device, NULL, NULL, userdata); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnGetTransportSettingsResponse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnGetTransportSettingsResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata) { PLT_TransportSettings settings; if (NPT_FAILED(res) || action->GetErrorCode() != 0) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("PlayMode", settings.play_mode))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("RecQualityMode", settings.rec_quality_mode))) { goto bad_action; } m_Delegate->OnGetTransportSettingsResult(NPT_SUCCESS, device, &settings, userdata); return NPT_SUCCESS; bad_action: m_Delegate->OnGetTransportSettingsResult(NPT_FAILURE, device, NULL, userdata); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnGetTransportInfoResponse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnGetTransportInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata) { PLT_TransportInfo info; if (NPT_FAILED(res) || action->GetErrorCode() != 0) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("CurrentTransportState", info.cur_transport_state))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("CurrentTransportStatus", info.cur_transport_status))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("CurrentSpeed", info.cur_speed))) { goto bad_action; } m_Delegate->OnGetTransportInfoResult(NPT_SUCCESS, device, &info, userdata); return NPT_SUCCESS; bad_action: m_Delegate->OnGetTransportInfoResult(NPT_FAILURE, device, NULL, userdata); return NPT_FAILURE; }
NPT_Result GPAC_GenericDevice::OnAction(PLT_ActionReference& action, const PLT_HttpRequestContext& context) { NPT_COMPILER_UNUSED(context); #ifdef GPAC_HAS_SPIDERMONKEY gf_mx_p(m_pMutex); #endif PLT_ActionDesc &act_desc = action->GetActionDesc(); NPT_String name = act_desc.GetName(); #ifdef GPAC_HAS_SPIDERMONKEY assert(!m_pSema); #endif GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, ("[UPnP] Action %s called (thread %d)\n", (char *) name, gf_th_id() )); #ifdef GPAC_HAS_SPIDERMONKEY if (JSVAL_IS_NULL(act_proc)) { gf_mx_v(m_pMutex); return NPT_SUCCESS; } jsval argv[2]; m_pUPnP->LockJavascript(GF_TRUE); JSObject *js_action = JS_NewObject(m_pUPnP->m_pJSCtx, &m_pUPnP->upnpDeviceClass._class, 0, 0); argv[0] = OBJECT_TO_JSVAL(js_action); SMJS_SET_PRIVATE(m_pUPnP->m_pJSCtx, js_action, this); act_ref = action; JS_DefineProperty(m_pUPnP->m_pJSCtx, js_action, "Name", STRING_TO_JSVAL( JS_NewStringCopyZ(m_pUPnP->m_pJSCtx, name) ), 0, 0, JSPROP_READONLY | JSPROP_PERMANENT); GPAC_Service *service = (GPAC_Service *) act_desc.GetService(); JS_DefineProperty(m_pUPnP->m_pJSCtx, js_action, "Service", service->m_pObj ? OBJECT_TO_JSVAL( service->m_pObj) : JSVAL_NULL, 0, 0, JSPROP_READONLY | JSPROP_PERMANENT); JS_DefineFunction(m_pUPnP->m_pJSCtx, js_action, "GetArgument", upnp_action_get_argument, 1, 0); JS_DefineFunction(m_pUPnP->m_pJSCtx, js_action, "SendReply", upnp_action_send_reply, 1, 0); /*create a semaphore*/ m_pSema = gf_sema_new(1, 0); jsval rval; JS_CallFunctionValue(m_pUPnP->m_pJSCtx, obj, act_proc, 1, argv, &rval); SMJS_SET_PRIVATE(m_pUPnP->m_pJSCtx, js_action, NULL); m_pUPnP->LockJavascript(GF_FALSE); if (JSVAL_IS_INT(rval) && (JSVAL_TO_INT(rval) != 0)) { action->SetError(JSVAL_TO_INT(rval), "Action Failed"); } /*wait on the semaphore*/ if (!gf_sema_wait_for(m_pSema, 10000)) { GF_LOG(GF_LOG_WARNING, GF_LOG_NETWORK, ("[UPnP] Reply processing to action %s timeout - sending incomplete reply)\n", (char *) name)); } gf_sema_del(m_pSema); m_pSema = NULL; gf_mx_v(m_pMutex); #endif return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaController::SetAVTransportURI +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::SetAVTransportURI(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, const char* uri, const char* metadata, void* userdata) { PLT_ActionReference action; NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction( device, "urn:schemas-upnp-org:service:AVTransport:1", "SetAVTransportURI", action)); // set the uri if (NPT_FAILED(action->SetArgumentValue("CurrentURI", uri))) { return NPT_ERROR_INVALID_PARAMETERS; } // set the uri metadata if (NPT_FAILED(action->SetArgumentValue("CurrentURIMetaData", metadata))) { return NPT_ERROR_INVALID_PARAMETERS; } return InvokeActionWithInstance(action, instance_id, userdata); }
/*---------------------------------------------------------------------- | PLT_MediaConnect::OnRegisterDevice +---------------------------------------------------------------------*/ NPT_Result PLT_MediaConnect::OnRegisterDevice(PLT_ActionReference& action) { NPT_String reqMsgBase64; NPT_CHECK_WARNING(action->GetArgumentValue("RegistrationReqMsg", reqMsgBase64)); NPT_String respMsgBase64; NPT_CHECK_WARNING(action->SetArgumentValue("RegistrationRespMsg", respMsgBase64)); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnGetPositionInfoResponse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnGetPositionInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata) { NPT_String value; PLT_PositionInfo info; if (NPT_FAILED(res) || action->GetErrorCode() != 0) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("Track", info.track))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("TrackDuration", value))) { goto bad_action; } if (NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.track_duration))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("TrackMetaData", info.track_metadata))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("TrackURI", info.track_uri))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("RelTime", value))) { goto bad_action; } if (NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.rel_time))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("AbsTime", value))) { goto bad_action; } if (NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.abs_time))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("RelCount", info.rel_count))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("AbsCount", info.abs_count))) { goto bad_action; } m_Listener->OnGetPositionInfoResult(NPT_SUCCESS, device, &info, userdata); return NPT_SUCCESS; bad_action: m_Listener->OnGetPositionInfoResult(NPT_FAILURE, device, NULL, userdata); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | PLT_MediaRenderer::OnGetCurrentConnectionInfo +---------------------------------------------------------------------*/ NPT_Result PLT_MediaRenderer::OnGetCurrentConnectionInfo(PLT_ActionReference& action) { if (NPT_FAILED(action->VerifyArgumentValue("ConnectionID", "0"))) { action->SetError(706,"No Such Connection."); return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("RcsID", "0"))){ return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("AVTransportID", "0"))) { return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("ProtocolInfo", "http-get:*:*:*"))) { return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("PeerConnectionManager", "/"))) { return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("PeerConnectionID", "-1"))) { return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("Direction", "Input"))) { return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("Status", "Unknown"))) { return NPT_FAILURE; } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaServer::OnGetCurrentConnectionInfo +---------------------------------------------------------------------*/ NPT_Result PLT_MediaServer::OnGetCurrentConnectionInfo(PLT_ActionReference& action, const PLT_HttpRequestContext& context) { NPT_COMPILER_UNUSED(context); if (NPT_FAILED(action->VerifyArgumentValue("ConnectionID", "0"))) { action->SetError(706,"No Such Connection."); return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("RcsID", "-1"))){ return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("AVTransportID", "-1"))) { return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("ProtocolInfo", "http-get:*:*:*"))) { return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("PeerConnectionManager", "/"))) { return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("PeerConnectionID", "-1"))) { return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("Direction", "Output"))) { return NPT_FAILURE; } if (NPT_FAILED(action->SetArgumentValue("Status", "Unknown"))) { return NPT_FAILURE; } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaController::OnGetMediaInfoResponse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaController::OnGetMediaInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata) { NPT_String value; PLT_MediaInfo info; if (NPT_FAILED(res) || action->GetErrorCode() != 0) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("NrTracks", info.num_tracks))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("MediaDuration", value))) { goto bad_action; } if (NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.media_duration))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("CurrentURI", info.cur_uri))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("CurrentURIMetaData", info.cur_metadata))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("NextURI", info.next_uri))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("NextURIMetaData", info.next_metadata))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("PlayMedium", info.play_medium))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("RecordMedium", info.rec_medium))) { goto bad_action; } if (NPT_FAILED(action->GetArgumentValue("WriteStatus", info.write_status))) { goto bad_action; } m_Delegate->OnGetMediaInfoResult(NPT_SUCCESS, device, &info, userdata); return NPT_SUCCESS; bad_action: m_Delegate->OnGetMediaInfoResult(NPT_FAILURE, device, NULL, userdata); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | PLT_MediaConnect::OnRegisterDevice +---------------------------------------------------------------------*/ NPT_Result PLT_MediaConnect::OnRegisterDevice(PLT_ActionReference& action, PLT_MediaConnectInfo* mc_info) { NPT_COMPILER_UNUSED(mc_info); NPT_String reqMsgBase64; action->GetArgumentValue("RegistrationReqMsg", reqMsgBase64); NPT_String respMsgBase64; action->SetArgumentValue("RegistrationRespMsg", respMsgBase64); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | CUPnPRenderer::OnSetAVTransportURI +---------------------------------------------------------------------*/ NPT_Result CUPnPRenderer::OnSetNextAVTransportURI(PLT_ActionReference& action) { NPT_String uri, meta; PLT_Service* service; NPT_CHECK_SEVERE(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", service)); NPT_CHECK_SEVERE(action->GetArgumentValue("NextURI", uri)); NPT_CHECK_SEVERE(action->GetArgumentValue("NextURIMetaData", meta)); CFileItemPtr item = GetFileItem(uri, meta); if (!item) { return NPT_FAILURE; } #if 0 if (g_application.m_pPlayer->IsPlaying()) { int playlist = PLAYLIST_MUSIC; if(item->IsVideo()) playlist = PLAYLIST_VIDEO; { CSingleLock lock(g_graphicsContext); g_playlistPlayer.ClearPlaylist(playlist); g_playlistPlayer.Add(playlist, item); g_playlistPlayer.SetCurrentSong(-1); g_playlistPlayer.SetCurrentPlaylist(playlist); } CGUIMessage msg(GUI_MSG_PLAYLIST_CHANGED, 0, 0); g_windowManager.SendThreadMessage(msg); service->SetStateVariable("NextAVTransportURI", uri); service->SetStateVariable("NextAVTransportURIMetaData", meta); NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable()); return NPT_SUCCESS; } else if (g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW) { return NPT_FAILURE; } else { return NPT_FAILURE; } #endif return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_FileMediaConnectDelegate::OnSearchContainer +---------------------------------------------------------------------*/ NPT_Result PLT_FileMediaConnectDelegate::OnSearchContainer(PLT_ActionReference& action, const char* object_id, const char* search_criteria, const char* filter, NPT_UInt32 starting_index, NPT_UInt32 requested_count, const char* sort_criteria, const PLT_HttpRequestContext& context) { /* parse search criteria */ /* TODO: HACK TO PASS DLNA */ if (search_criteria && NPT_StringsEqual(search_criteria, "Unknownfieldname")) { /* error */ NPT_LOG_WARNING_1("Unsupported or invalid search criteria %s", search_criteria); action->SetError(708, "Unsupported or invalid search criteria"); return NPT_FAILURE; } /* locate the file from the object ID */ NPT_String dir; if (NPT_FAILED(GetFilePath(object_id, dir))) { /* error */ NPT_LOG_WARNING("ObjectID not found."); action->SetError(710, "No Such Container."); return NPT_FAILURE; } /* retrieve the item type */ NPT_FileInfo info; NPT_Result res = NPT_File::GetInfo(dir, &info); if (NPT_FAILED(res) || (info.m_Type != NPT_FileInfo::FILE_TYPE_DIRECTORY)) { /* error */ NPT_LOG_WARNING("No such container"); action->SetError(710, "No such container"); return NPT_FAILURE; } /* hack for now to return something back to XBox 360 */ return OnBrowseDirectChildren(action, object_id, filter, starting_index, requested_count, sort_criteria, context); }
/*---------------------------------------------------------------------- | PLT_MediaServer::OnUpdate +---------------------------------------------------------------------*/ NPT_Result PLT_MediaServer::OnUpdate(PLT_ActionReference& action, const PLT_HttpRequestContext& context) { if (!m_Delegate) return NPT_ERROR_NOT_IMPLEMENTED; int err; const char* msg = NULL; NPT_String object_id, current_xml, new_xml; NPT_Map<NPT_String,NPT_String> curr_values; NPT_Map<NPT_String,NPT_String> new_values; NPT_CHECK_LABEL(action->GetArgumentValue("ObjectID", object_id), args); NPT_CHECK_LABEL(object_id.IsEmpty(),args); NPT_CHECK_LABEL(action->GetArgumentValue("CurrentTagValue", current_xml), args); NPT_CHECK_LABEL(action->GetArgumentValue("NewTagValue", new_xml), args); if (NPT_FAILED(ParseTagList(current_xml, curr_values))) { err = 702; msg = "Invalid currentTagvalue"; goto failure; } if (NPT_FAILED(ParseTagList(new_xml, new_values))) { err = 703; msg = "Invalid newTagValue"; goto failure; } if (curr_values.GetEntryCount() != new_values.GetEntryCount()) { err = 706; msg = "Paramater mismatch"; goto failure; } return m_Delegate->OnUpdateObject(action, object_id, curr_values, new_values, context); args: err = 402; msg = "Invalid args"; failure: NPT_LOG_WARNING(msg); action->SetError(err, msg); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | CUPnPRenderer::OnSetVolume +---------------------------------------------------------------------*/ NPT_Result CUPnPRenderer::OnSetVolume(PLT_ActionReference& action) { NPT_String volume; NPT_CHECK_SEVERE(action->GetArgumentValue("DesiredVolume", volume)); g_application.SetVolume((float)strtod((const char*)volume, NULL)); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaServer::OnGetSystemUpdateID +---------------------------------------------------------------------*/ NPT_Result PLT_MediaServer::OnGetSystemUpdateID(PLT_ActionReference& action, const PLT_HttpRequestContext& context) { NPT_COMPILER_UNUSED(context); return action->SetArgumentsOutFromStateVariable(); }
/*---------------------------------------------------------------------- | PLT_LightSampleDevice::OnAction +---------------------------------------------------------------------*/ NPT_Result PLT_LightSampleDevice::OnAction(PLT_ActionReference& action, NPT_SocketInfo* /* info */) { /* parse the action name */ NPT_String name = action->GetActionDesc()->GetName(); if (name.Compare("SetTarget") == 0) { NPT_String value; action->GetArgumentValue("newTargetValue", value); PLT_StateVariable* variable = action->GetActionDesc()->GetService()->FindStateVariable("Status"); if (NPT_FAILED(variable->SetValue(value))) { action->SetError(402, "Invalid Args"); return NPT_FAILURE; } return NPT_SUCCESS; } else if (name.Compare("GetStatus") == 0) { PLT_StateVariable* variable = action->GetActionDesc()->GetService()->FindStateVariable("Status"); if (variable) { action->SetArgumentValue("ResultStatus", variable->GetValue()); return NPT_SUCCESS; } } action->SetError(501, "Action Failed"); return NPT_FAILURE; }
/*---------------------------------------------------------------------- | PLT_MediaBrowser::Browse +---------------------------------------------------------------------*/ NPT_Result PLT_MediaBrowser::Browse(PLT_DeviceDataReference& device, const char* obj_id, NPT_UInt32 start_index, NPT_UInt32 count, bool browse_metadata, const char* filter, const char* sort_criteria, void* userdata) { // verify device still in our list PLT_DeviceDataReference device_data; NPT_CHECK_WARNING(FindServer(device->GetUUID(), device_data)); // create action PLT_ActionReference action; NPT_CHECK_SEVERE(m_CtrlPoint->CreateAction( device, "urn:schemas-upnp-org:service:ContentDirectory:1", "Browse", action)); // Set the object id PLT_Arguments args; if (NPT_FAILED(action->SetArgumentValue("ObjectID", obj_id))) { return NPT_ERROR_INVALID_PARAMETERS; } // set the browse_flag if (NPT_FAILED(action->SetArgumentValue("BrowseFlag", browse_metadata?"BrowseMetadata":"BrowseDirectChildren"))) { return NPT_ERROR_INVALID_PARAMETERS; } // set the Filter if (NPT_FAILED(action->SetArgumentValue("Filter", filter))) { return NPT_ERROR_INVALID_PARAMETERS; } // set the Starting Index if (NPT_FAILED(action->SetArgumentValue("StartingIndex", NPT_String::FromInteger(start_index)))) { return NPT_ERROR_INVALID_PARAMETERS; } // set the Requested Count if (NPT_FAILED(action->SetArgumentValue("RequestedCount", NPT_String::FromInteger(count)))) { return NPT_ERROR_INVALID_PARAMETERS; } // set the Requested Count if (NPT_FAILED(action->SetArgumentValue("SortCriteria", sort_criteria))) { return NPT_ERROR_INVALID_PARAMETERS; } // invoke the action if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) { return NPT_ERROR_INVALID_PARAMETERS; } return NPT_SUCCESS; }