bool checkField(const TestDataField& field, Target target, ThreadState& state, ThreadState& ostate) { Value nv = getStateValue(state, target); Value ov = getStateValue(ostate, target); assert(nv.type == ov.type); std::string fieldName = getTargetName(target); if (field.hasOutput) { assert(field.output.type == nv.type); if (nv.type == Value::Type::Uint32) { if (nv.uint32Value != field.output.uint32Value) { gLog->error(" * Expected {} to be {:08x} but got {:08x}", fieldName, field.output.uint32Value, nv.uint32Value); return false; } } else if (nv.type == Value::Type::Double) { if (nv.doubleValue != field.output.doubleValue) { gLog->error(" * Expected {} to be {} but got {}", fieldName, field.output.doubleValue, nv.doubleValue); return false; } } else { assert(0); } } else { if (nv.type == Value::Type::Uint32) { if (nv.uint32Value != ov.uint32Value) { gLog->error(" * Expected {} to be unchanged but {:08x} != {:08x}", fieldName, nv.uint32Value, ov.uint32Value); return false; } } else if (nv.type == Value::Type::Double) { if (nv.uint32Value != ov.uint32Value) { gLog->error(" * Expected {} to be unchanged but {} != {}", fieldName, nv.doubleValue, ov.doubleValue); return false; } } else { assert(0); } } return true; }
int SimpleDMR::onAction(const ServiceDecl *serviceDecl, const ActionDecl *actionDecl, AbortableTask *task, const FrontEnd::InterfaceContext *ifctx, const FrontEnd::RequestContext& reqCtx, const NPT_HttpRequest *req, const NPT_List<NPT_String>& inputArgNames, const NPT_List<NPT_String>& inputArgValues, NPT_List<NPT_String>& outputArgValues) { WriteLocker locker(m_stateLock); if (NPT_String::Compare(serviceDecl->serviceId, "urn:upnp-org:serviceId:AVTransport") == 0) { if (NPT_String::Compare(actionDecl->name, "SetAVTransportURI") == 0) { if (inputArgValues.GetItemCount() != 3) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 718; } NPT_HttpClient httpClient; NPT_HttpRequest req(*inputArgValues.GetItem(1), NPT_HTTP_METHOD_GET, NPT_HTTP_PROTOCOL_1_1); Helper::setupHttpRequest(req); NPT_HttpResponse *resp; NPT_Result nr; HttpClientAbortCallback abortCallback(&httpClient); if (task->registerAbortCallback(&abortCallback)) { nr = httpClient.SendRequest(req, resp); task->unregisterAbortCallback(&abortCallback); } else { return 715; } if (NPT_FAILED(nr)) { return 716; } PtrHolder<NPT_HttpResponse> resp1(resp); if (resp->GetStatusCode() != 200) { return 716; } NPT_HttpHeader *hdrContentType = resp->GetHeaders().GetHeader(NPT_HTTP_HEADER_CONTENT_TYPE); if (!hdrContentType) { return 714; } setVar(DMRVAR_AVTransportURI, *inputArgValues.GetItem(1)); setVar(DMRVAR_AVTransportURIMetaData, *inputArgValues.GetItem(2)); setVar(DMRVAR_CurrentTrackMetaData, *inputArgValues.GetItem(2)); m_callback->doDmrOpen(this, *inputArgValues.GetItem(1), hdrContentType->GetValue(), *inputArgValues.GetItem(2)); return 0; } if (NPT_String::Compare(actionDecl->name, "GetMediaInfo") == 0) { if (inputArgValues.GetItemCount() != 1) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 718; } *outputArgValues.GetItem(0) = m_avtVars[DMRVAR_NumberOfTracks - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(1) = m_avtVars[DMRVAR_CurrentMediaDuration - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(2) = m_avtVars[DMRVAR_AVTransportURI - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(3) = m_avtVars[DMRVAR_AVTransportURIMetaData - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(4) = m_avtVars[DMRVAR_NextAVTransportURI - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(5) = m_avtVars[DMRVAR_NextAVTransportURIMetaData - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(6) = m_avtVars[DMRVAR_PlaybackStorageMedium - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(7) = m_avtVars[DMRVAR_RecordStorageMedium - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(8) = m_avtVars[DMRVAR_RecordMediumWriteStatus - DMRVAR_BaseIndexAVT]; return 0; } if (NPT_String::Compare(actionDecl->name, "GetTransportInfo") == 0) { if (inputArgValues.GetItemCount() != 1) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 718; } *outputArgValues.GetItem(0) = m_avtVars[DMRVAR_TransportState - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(1) = m_avtVars[DMRVAR_TransportStatus - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(2) = m_avtVars[DMRVAR_TransportPlaySpeed - DMRVAR_BaseIndexAVT]; return 0; } if (NPT_String::Compare(actionDecl->name, "GetPositionInfo") == 0) { if (inputArgValues.GetItemCount() != 1) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 718; } *outputArgValues.GetItem(0) = m_avtVars[DMRVAR_CurrentTrack - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(1) = m_avtVars[DMRVAR_CurrentTrackDuration - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(2) = m_avtVars[DMRVAR_CurrentTrackMetaData - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(3) = m_avtVars[DMRVAR_CurrentTrackURI - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(4) = m_avtVars[DMRVAR_RelativeTimePosition - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(5) = m_avtVars[DMRVAR_AbsoluteTimePosition - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(6) = m_avtVars[DMRVAR_RelativeCounterPosition - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(7) = m_avtVars[DMRVAR_AbsoluteCounterPosition - DMRVAR_BaseIndexAVT]; return 0; } if (NPT_String::Compare(actionDecl->name, "GetDeviceCapabilities") == 0) { if (inputArgValues.GetItemCount() != 1) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 718; } *outputArgValues.GetItem(0) = m_avtVars[DMRVAR_PossiblePlaybackStorageMedia - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(1) = m_avtVars[DMRVAR_PossibleRecordStorageMedia - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(2) = m_avtVars[DMRVAR_PossibleRecordQualityModes - DMRVAR_BaseIndexAVT]; return 0; } if (NPT_String::Compare(actionDecl->name, "GetTransportSettings") == 0) { if (inputArgValues.GetItemCount() != 1) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 718; } *outputArgValues.GetItem(0) = m_avtVars[DMRVAR_CurrentPlayMode - DMRVAR_BaseIndexAVT]; *outputArgValues.GetItem(1) = m_avtVars[DMRVAR_CurrentRecordQualityMode - DMRVAR_BaseIndexAVT]; return 0; } if (NPT_String::Compare(actionDecl->name, "Stop") == 0) { m_callback->doDmrStop(this); return 0; } if (NPT_String::Compare(actionDecl->name, "Play") == 0) { m_callback->doDmrPlay(this); return 0; } if (NPT_String::Compare(actionDecl->name, "Pause") == 0) { m_callback->doDmrPause(this); return 0; } if (NPT_String::Compare(actionDecl->name, "Seek") == 0) { if (inputArgValues.GetItemCount() != 3) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 718; } const NPT_String& seekMode = *inputArgValues.GetItem(1); const NPT_String& seekTarget = *inputArgValues.GetItem(2); if (seekMode.Compare("TRACK_NR") == 0) { // TODO: } else if (seekMode.Compare("REL_TIME") == 0) { NPT_UInt64 pos; if (NPT_FAILED(Helper::parseTrackDurationString(seekTarget, pos))) { // Illegal seek target return 711; } m_callback->doDmrSeekTo(this, pos); } else { // Seek mode not supported return 710; } return 0; } if (NPT_String::Compare(actionDecl->name, "Next") == 0) { return 0; } if (NPT_String::Compare(actionDecl->name, "Previous") == 0) { return 0; } return 602; } if (NPT_String::Compare(serviceDecl->serviceId, "urn:upnp-org:serviceId:RenderingControl") == 0) { if (NPT_String::Compare(actionDecl->name, "ListPresets") == 0) { if (inputArgValues.GetItemCount() != 1) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 702; } *outputArgValues.GetItem(0) = m_rcsVars[DMRVAR_PresetNameList - DMRVAR_BaseIndexRCS]; return 0; } if (NPT_String::Compare(actionDecl->name, "SelectPreset") == 0) { return 0; } if (NPT_String::Compare(actionDecl->name, "GetMute") == 0) { if (inputArgValues.GetItemCount() != 2) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 702; } *outputArgValues.GetItem(0) = m_rcsVars[DMRVAR_Mute - DMRVAR_BaseIndexRCS]; return 0; } if (NPT_String::Compare(actionDecl->name, "SetMute") == 0) { if (inputArgValues.GetItemCount() != 3) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 702; } const NPT_String& desiredMute = *inputArgValues.GetItem(2); m_callback->doDmrSetMute(this, desiredMute.Compare("true", true) == 0 || desiredMute.Compare("1") == 0); return 0; } if (NPT_String::Compare(actionDecl->name, "GetVolume") == 0) { if (inputArgValues.GetItemCount() != 2) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 702; } *outputArgValues.GetItem(0) = m_rcsVars[DMRVAR_Volume - DMRVAR_BaseIndexRCS]; return 0; } if (NPT_String::Compare(actionDecl->name, "SetVolume") == 0) { if (inputArgValues.GetItemCount() != 3) { // Invalid Args return 402; } if (inputArgValues.GetFirstItem()->Compare("0") != 0) { // Invalid InstanceID return 702; } const NPT_String& desiredVolume = *inputArgValues.GetItem(2); int volume; if (NPT_FAILED(NPT_ParseInteger(desiredVolume, volume))) { // Invalid Args return 402; } m_callback->doDmrSetVolume(this, volume); return 0; } return 602; } if (NPT_String::Compare(serviceDecl->serviceId, "urn:upnp-org:serviceId:ConnectionManager") == 0) { if (NPT_String::Compare(actionDecl->name, "GetProtocolInfo") == 0) { NPT_String v; if (getStateValue(serviceDecl->serviceId, "SourceProtocolInfo", v)) { *outputArgValues.GetItem(0) = v; } if (getStateValue(serviceDecl->serviceId, "SinkProtocolInfo", v)) { *outputArgValues.GetItem(1) = v; } return 0; } if (NPT_String::Compare(actionDecl->name, "GetCurrentConnectionIDs") == 0) { NPT_String v; if (getStateValue(serviceDecl->serviceId, "SourceProtocolInfo", v)) { *outputArgValues.GetItem(0) = v; } return 0; } if (NPT_String::Compare(actionDecl->name, "GetCurrentConnectionInfo") == 0) { *outputArgValues.GetItem(0) = "0"; *outputArgValues.GetItem(1) = "0"; *outputArgValues.GetItem(2) = ""; *outputArgValues.GetItem(3) = ""; *outputArgValues.GetItem(4) = "-1"; *outputArgValues.GetItem(5) = "Input"; // or "Output"? WTF! *outputArgValues.GetItem(6) = "OK"; return 0; } return 602; } return 501; }
void updateStateValueRequDepar(const vector<cServer>& _server_vec,const map<ID,cRequest*>& _hosted_request_map,const map<requesttype,unsigned int>& _hosted_requests_type_num_map) { //calculate the value for "NONE" state unsigned long int current_system_state_hash; if (system_state.first == NONE) { current_system_state_hash = calculateStateIndicator(_server_vec); } else cout<<"Error!!! Processing an unexpected event!"<<endl; //return the hash value of current system state such that no calculation is needed again system_state.second = current_system_state_hash; //calculate the total transition rate double total_transition_rate = 0; map<requesttype,pair<double,double>>::iterator iter_request_type = request_type_map.begin(); for (;iter_request_type != request_type_map.end();iter_request_type++) { total_transition_rate += iter_request_type->second.first; } map<requesttype,unsigned int>::const_iterator iter_hosted_requests_type_num_map = _hosted_requests_type_num_map.begin(); for (;iter_hosted_requests_type_num_map != _hosted_requests_type_num_map.end();iter_hosted_requests_type_num_map++) { total_transition_rate += (double)(iter_hosted_requests_type_num_map->second) * (request_type_map[iter_hosted_requests_type_num_map->first]).second; } //calculate the expected value //firstly, iterate the possible request arrival event double state_value = 0; map<pair<requesttype,unsigned long int>,double>::iterator iter_find_state_value; iter_request_type = request_type_map.begin(); for (;iter_request_type != request_type_map.end();iter_request_type++) { state_value += iter_request_type->second.first / total_transition_rate * getStateValue(iter_request_type->first,current_system_state_hash); } //calculate the expected value //secondly, iterate the possible request departure event map<ID,cRequest*>::const_iterator iter_hosted_request_map = _hosted_request_map.begin(); for (;iter_hosted_request_map != _hosted_request_map.end();iter_hosted_request_map++) { unsigned long int temp_stat_indicator = calculateRequestDepartureStateIndicator(_server_vec,iter_hosted_request_map->second); state_value += request_type_map[iter_hosted_request_map->second->getRequestType()].second / total_transition_rate * getStateValue(NONE,temp_stat_indicator); } state_value = state_value * discout_factor; //update state value and corresponding state policy map<pair<requesttype,unsigned long int>,double>::iterator iter_find_system_state_value_map = global_point_system_value_map[counting].find(make_pair(system_state.first,system_state.second)); if (iter_find_system_state_value_map == global_point_system_value_map[counting].end()) { //insert the info of current system state system_state_value_map.insert(make_pair(make_pair(system_state.first,system_state.second),state_value)); } else { iter_find_system_state_value_map->second = (1 - value_function_update_factor)* iter_find_system_state_value_map->second + value_function_update_factor * state_value; } return ; }
double obtainDeploymentProfits(vector<cServer>& _server_vec,cRequest* _request,\ map<requesttype,unsigned int>& _hosted_requests_type_num_map,\ map<ID,cRequest*>& _hosted_request_map,\ double* _hash_current_placement) { /**************************************************** * here the continue Markov chain will be calculated * *****************************************************/ unsigned long int current_system_state_hash; if (system_state.first == NONE) { current_system_state_hash = calculateStateIndicator(_server_vec); } else current_system_state_hash = calculateRequestStateIndicator(_server_vec,_request); //return the hash value of current system state such that no calculation is needed again *_hash_current_placement = current_system_state_hash; //calculate the total transition rate double total_transition_rate = 0; map<requesttype,pair<double,double>>::iterator iter_request_type = request_type_map.begin(); for (;iter_request_type != request_type_map.end();iter_request_type++) { total_transition_rate += iter_request_type->second.first; } map<requesttype,unsigned int>::iterator iter_hosted_requests_type_num_map = _hosted_requests_type_num_map.begin(); for (;iter_hosted_requests_type_num_map != _hosted_requests_type_num_map.end();iter_hosted_requests_type_num_map++) { total_transition_rate += (double)(iter_hosted_requests_type_num_map->second) * (request_type_map[iter_hosted_requests_type_num_map->first]).second; } //calculate the expected value //firstly, iterate the possible request arrival event double state_value = 0; map<pair<requesttype,double>,double>::iterator iter_find_state_value; iter_request_type = request_type_map.begin(); for (;iter_request_type != request_type_map.end();iter_request_type++) { state_value += iter_request_type->second.first / total_transition_rate * getStateValue(iter_request_type->first,current_system_state_hash); } //calculate the expected value //secondly, iterate the possible request departure event map<ID,cRequest*>::iterator iter_hosted_request_map = _hosted_request_map.begin(); for (;iter_hosted_request_map != _hosted_request_map.end();iter_hosted_request_map++) { unsigned long int temp_stat_indicator = calcPotentialRequDeparStateIndicator(_server_vec,_request,iter_hosted_request_map->second); state_value += request_type_map[iter_hosted_request_map->second->getRequestType()].second / total_transition_rate * getStateValue(NONE,temp_stat_indicator); } if (_request->getAccepted()) { return discout_factor * state_value + ((service_type_map[_request->getServiceType()])->getUnitReward() * _request->p_vm_vec->size()) * _request->getDurationTime(); } else { return discout_factor * state_value - (service_type_map[_request->getServiceType()])->getUnitPenalty()* _request->p_vm_vec->size() * _request->getDurationTime(); } }
int16 ScriptManager::inventoryGetItem(int8 id) { if (id < 49 && id >= 0) return getStateValue(StateKey_Inv_1_Slot + id); return -1; }
int8 ScriptManager::inventoryGetCount() { return getStateValue(StateKey_Inv_Cnt_Slot); }
int SimpleDMS::onAction(const ServiceDecl *serviceDecl, const ActionDecl *actionDecl, AbortableTask *task, const FrontEnd::InterfaceContext *ifctx, const FrontEnd::RequestContext& reqCtx, const NPT_HttpRequest *req, const NPT_List<NPT_String>& inputArgNames, const NPT_List<NPT_String>& inputArgValues, NPT_List<NPT_String>& outputArgValues) { if (NPT_String::Compare(serviceDecl->serviceId, "urn:upnp-org:serviceId:ContentDirectory") == 0) { if (NPT_String::Compare(actionDecl->name, "Browse") == 0) { NPT_UInt32 startingIndex; NPT_UInt32 requestedCount; NPT_ParseInteger(*inputArgValues.GetItem(3), startingIndex); NPT_ParseInteger(*inputArgValues.GetItem(4), requestedCount); NPT_String result; NPT_UInt32 numberReturned; NPT_UInt32 totalMatches; NPT_UInt32 updateID; int errorCode = m_store->browse(task, ifctx, reqCtx, NPT_String::Format("http://%s:%d%sdms/%%s", ifctx->m_ifAddr.ToString().GetChars(), ifctx->m_httpPort, frontEndContext()->m_httpRoot.GetChars()), *inputArgValues.GetItem(0), *inputArgValues.GetItem(1), *inputArgValues.GetItem(2), startingIndex, requestedCount, *inputArgValues.GetItem(5), result, numberReturned, totalMatches, updateID); if (errorCode == 0) { *outputArgValues.GetItem(0) = result; *outputArgValues.GetItem(1) = NPT_String::FromIntegerU(numberReturned); *outputArgValues.GetItem(2) = NPT_String::FromIntegerU(totalMatches); *outputArgValues.GetItem(3) = NPT_String::FromIntegerU(updateID); } return errorCode; } if (NPT_String::Compare(actionDecl->name, "Search") == 0) { NPT_UInt32 startingIndex; NPT_UInt32 requestedCount; NPT_ParseInteger(*inputArgValues.GetItem(3), startingIndex); NPT_ParseInteger(*inputArgValues.GetItem(4), requestedCount); NPT_String result; NPT_UInt32 numberReturned; NPT_UInt32 totalMatches; NPT_UInt32 updateID; int errorCode = m_store->search(task, ifctx, reqCtx, NPT_String::Format("http://%s:%d%sdms/%%s", ifctx->m_ifAddr.ToString().GetChars(), ifctx->m_httpPort, frontEndContext()->m_httpRoot.GetChars()), *inputArgValues.GetItem(0), *inputArgValues.GetItem(1), *inputArgValues.GetItem(2), startingIndex, requestedCount, *inputArgValues.GetItem(5), result, numberReturned, totalMatches, updateID); if (errorCode == 0) { *outputArgValues.GetItem(0) = result; *outputArgValues.GetItem(1) = NPT_String::FromIntegerU(numberReturned); *outputArgValues.GetItem(2) = NPT_String::FromIntegerU(totalMatches); *outputArgValues.GetItem(3) = NPT_String::FromIntegerU(updateID); } return errorCode; } if (NPT_String::Compare(actionDecl->name, "GetSearchCapabilities") == 0) { NPT_String v; if (getStateValue(serviceDecl->serviceId, "SearchCapabilities", v)) { *outputArgValues.GetItem(0) = v; } return 0; } if (NPT_String::Compare(actionDecl->name, "GetSortCapabilities") == 0) { NPT_String v; if (getStateValue(serviceDecl->serviceId, "SortCapabilities", v)) { *outputArgValues.GetItem(0) = v; } return 0; } if (NPT_String::Compare(actionDecl->name, "GetSystemUpdateID") == 0) { NPT_String v; if (getStateValue(serviceDecl->serviceId, "SystemUpdateID", v)) { *outputArgValues.GetItem(0) = v; } return 0; } return 602; } if (NPT_String::Compare(serviceDecl->serviceId, "urn:upnp-org:serviceId:ConnectionManager") == 0) { if (NPT_String::Compare(actionDecl->name, "GetProtocolInfo") == 0) { NPT_String v; if (getStateValue(serviceDecl->serviceId, "SourceProtocolInfo", v)) { *outputArgValues.GetItem(0) = v; } if (getStateValue(serviceDecl->serviceId, "SinkProtocolInfo", v)) { *outputArgValues.GetItem(1) = v; } return 0; } if (NPT_String::Compare(actionDecl->name, "GetCurrentConnectionIDs") == 0) { NPT_String v; if (getStateValue(serviceDecl->serviceId, "SourceProtocolInfo", v)) { *outputArgValues.GetItem(0) = v; } return 0; } if (NPT_String::Compare(actionDecl->name, "GetCurrentConnectionInfo") == 0) { *outputArgValues.GetItem(0) = "0"; *outputArgValues.GetItem(1) = "0"; *outputArgValues.GetItem(2) = ""; *outputArgValues.GetItem(3) = ""; *outputArgValues.GetItem(4) = "-1"; *outputArgValues.GetItem(5) = "Input"; // or "Output"? WTF! *outputArgValues.GetItem(6) = "OK"; return 0; } return 602; } if (NPT_String::Compare(serviceDecl->serviceId, "urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar") == 0) { if (NPT_String::Compare(actionDecl->name, "IsAuthorized") == 0) { *outputArgValues.GetItem(0) = "1"; return 0; } if (NPT_String::Compare(actionDecl->name, "IsValidated") == 0) { *outputArgValues.GetItem(0) = "1"; return 0; } if (NPT_String::Compare(actionDecl->name, "RegisterDevice") == 0) { return 0; } return 602; } return 501; }