Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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 ;
}
Пример #4
0
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();
	}

}
Пример #5
0
int16 ScriptManager::inventoryGetItem(int8 id) {
	if (id < 49 && id >= 0)
		return getStateValue(StateKey_Inv_1_Slot + id);
	return -1;
}
Пример #6
0
int8 ScriptManager::inventoryGetCount() {
	return getStateValue(StateKey_Inv_Cnt_Slot);
}
Пример #7
0
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;
}