Example #1
0
ConditionResponse Condition::evaluateCapabilities(Request* req){
	LOGD("condition: device-cap size %d",req->getResourceAttrs()["device-cap"]->size());
	vector<match_info_str*> my_capabilities_params;
	vector<string>* req_capabilities_params = new vector<string>();
	map<string, vector<string>* > requestResource_attrs = req->getResourceAttrs();
	bool anyUndetermined = false;
	bool found;
	
	for(map<string, vector<match_info_str*> >::iterator it = resource_attrs.begin(); it!= resource_attrs.end(); it++)
	{
		if (it->first != API_FEATURE)

		{
			if(requestResource_attrs.find(it->first) == requestResource_attrs.end())
			{
				LOGD("Capabilities %s undetermined ",it->first.data());		
				anyUndetermined = true;
			}
			else
			{
				LOGD("Capabilities %s determined ",it->first.data());	
				my_capabilities_params.insert(my_capabilities_params.end(), it->second.begin(), it->second.end());
			}
		}
	}
	LOGD("[ANY CAP] %d", anyUndetermined);

	for(map<string, vector<string>* >::iterator itr = requestResource_attrs.begin(); itr!= requestResource_attrs.end(); itr++)
	{
		if (itr->first != API_FEATURE)
		{
//			LOGD("REQ Capabilities %s", itr->first.data());
//			LOGD("REQ Capabilities size %d", itr->second->size());
			req_capabilities_params->insert(req_capabilities_params->end(), itr->second->begin(), itr->second->end());
		}
	}
	
	if(combine == AND){
		// find any No Match
		LOGD("my_capabilities_params.size() %d",my_capabilities_params.size());
		for(unsigned int j=0; j<my_capabilities_params.size(); j++){
			found = false;
			LOGD("req_capabilities_params->size() %d",req_capabilities_params->size());
			for(unsigned int i=0; i<req_capabilities_params->size(); i++){
				string mod_function = my_capabilities_params[j]->mod_func;
				string s = (mod_function != "") 
							? modFunction(mod_function, req_capabilities_params->at(i))
							: req_capabilities_params->at(i);
				
				LOGD("Confronto %s con %s",s.data(),my_capabilities_params[j]->value.data());
				if(equals(s.data(),my_capabilities_params[j]->value.data(), string2strcmp_mode(my_capabilities_params[j]->equal_func)))
//				if(equals(req_capabilities_params->at(i).data(),my_capabilities_params[j]->value.data(), string2strcmp_mode(my_capabilities_params[j]->equal_func)))
				{
					LOGD("UGUALI");
					found = true;
					break;
				}
				else
					LOGD("DIVERSI");
			}
			if (found == false)
				return NO_MATCH;
		}
		if (anyUndetermined)
			return NOT_DETERMINED;
		else
			return MATCH;
	}
	else if(combine == OR){
	// find any Match
		for(unsigned int j=0; j<my_capabilities_params.size(); j++){
			for(unsigned int i=0; i<req_capabilities_params->size(); i++){
				string mod_function = my_capabilities_params[j]->mod_func;
				string s = (mod_function != "") 
							? modFunction(mod_function, req_capabilities_params->at(i))
							: req_capabilities_params->at(i);
				
				LOGD("Compare %s with %s",s.data(),my_capabilities_params[j]->value.data());
//				LOGD("Compare %s with %s",req_capabilities_params->at(i).data(),my_capabilities_params[j]->value.data());
				if(equals(s.data(),my_capabilities_params[j]->value.data(), string2strcmp_mode(my_capabilities_params[j]->equal_func))){
//				if(equals(req_capabilities_params->at(i),my_capabilities_params[j]->value, string2strcmp_mode(my_capabilities_params[j]->equal_func)))
					return MATCH;
				}
			}
		}
		if (anyUndetermined)
			return NOT_DETERMINED;
		else
			return NO_MATCH;
	}
	// TODO: is that right? What should happen if policy invalid?
	return NOT_DETERMINED;
}
ConditionResponse Condition::evaluateFeatures(Request* req){
	LOGD("[COND EVALUATE FEAT] 1 : %d",resource_attrs.size());
	map<string,vector<match_info_str*> >::iterator it;
	vector<match_info_str*> my_features = (it = resource_attrs.find(API_FEATURE))!=resource_attrs.end() 
			? it->second 
			: vector<match_info_str*>();
	
	map<string, vector<string>* > requestResource_attrs = req->getResourceAttrs();
	map<string, vector<string>* >::iterator rraIT = requestResource_attrs.find(API_FEATURE);
	vector<string>* req_features = (rraIT != requestResource_attrs.end())
			? rraIT->second
			: NULL;
	
	bool found;	
	bool anyUndetermined = resource_attrs.find(API_FEATURE)!= resource_attrs.end() 
			&& requestResource_attrs.find(API_FEATURE) == requestResource_attrs.end();	

	LOGD("Condition.evaluateFeatures - 03");
	if(combine == AND){
		LOGD("Condition.evaluateFeatures - 04");
		// find any No Match
		for(unsigned int j=0; req_features && j<my_features.size(); j++){
			found = false;
			for(unsigned int i=0; i<req_features->size(); i++){
				string mod_function = my_features[j]->mod_func;
				string s = (mod_function != "") 
							? modFunction(mod_function, req_features->at(i))
							: req_features->at(i);
				if(equals(s,my_features[j]->value, string2strcmp_mode(my_features[j]->equal_func)))
				{
					found = true;
					break;
				}
			}
			if (found == false)
				return NO_MATCH;
		}
		if (anyUndetermined)
			return NOT_DETERMINED;
		else
			return MATCH;
	}
	else if(combine == OR){
		LOGD("Condition.evaluateFeatures - 05");
		// find any Match
		for(unsigned int j=0; req_features && j<my_features.size(); j++){
			for(unsigned int i=0; i<req_features->size(); i++){
				string mod_function = my_features[j]->mod_func;
				string s = (mod_function != "") 
							? modFunction(mod_function, req_features->at(i))
							: req_features->at(i);
				if(equals(s,my_features[j]->value, string2strcmp_mode(my_features[j]->equal_func)))
					return MATCH;
			}
		}
		if (anyUndetermined)
			return NOT_DETERMINED;
		else
			return NO_MATCH;
	}
	// TODO: is that right? What should happen if policy is invalid?
	LOGD("Condition.evaluateFeatures - 09");
	return NOT_DETERMINED;
}
Example #3
0
ConditionResponse Condition::evaluateEnvironment(Request* req){	
	vector<match_info_str*> my_environment_params;
	map<string, string> requestEnvironment_attrs = req->getEnvironmentAttrs();
	
	map<string,vector<match_info_str*> >::iterator it;
	match_info_str * my_roaming = (it = environment_attrs.find("roaming"))!=environment_attrs.end() 
		? it->second.at(0) 
		: NULL;
	
	vector<match_info_str *> my_bearer_vet = (it = environment_attrs.find("bearer-type"))!=environment_attrs.end() 
		? it->second 
		: vector<match_info_str*>();
	
	vector<match_info_str *> my_profile_vet = (it = environment_attrs.find("profile"))!=environment_attrs.end() 
		? it->second 
		: vector<match_info_str*>();
	
	if(combine == OR){
		LOGD("[ENVIRONMENT] dentro OR");
		if(my_roaming != NULL){
			string req_roaming = requestEnvironment_attrs["roaming"];
			LOGD("[ENVIRONMENT] req_roaming : %s",req_roaming.data());
			if(equals(req_roaming, my_roaming->value, string2strcmp_mode(my_roaming->equal_func)))
				return MATCH;
		}
		else
			LOGD("[ENVIRONMENT] my_roaming null");
		
		string req_bearer = requestEnvironment_attrs["bearer-type"];
		for(unsigned int j=0; j<my_bearer_vet.size(); j++){
			if(equals(req_bearer, my_bearer_vet[j]->value, string2strcmp_mode(my_bearer_vet[j]->equal_func)))
				return MATCH;
		}
		string req_profile = requestEnvironment_attrs["profile"];
		for(unsigned int j=0; j<my_profile_vet.size(); j++){
			if(equals(req_profile, my_profile_vet[j]->value, string2strcmp_mode(my_profile_vet[j]->equal_func)))
				return MATCH;
		}
		return NO_MATCH;
	}
	else{ //combine == AND
		// find any No Match
		LOGD("[ENVIRONMENT] dentro AND");
		if(my_roaming != NULL){
			string req_roaming = requestEnvironment_attrs["roaming"];
			LOGD("[ENVIRONMENT] confronto : %s con %s",req_roaming.data(),my_roaming->value.data());
			if(!equals(req_roaming, my_roaming->value, string2strcmp_mode(my_roaming->equal_func)))
				return NO_MATCH;
		}
		else
			LOGD("[ENVIRONMENT] my_roaming null");
		
		string req_bearer = requestEnvironment_attrs["bearer-type"];
		for(unsigned int j=0; j<my_bearer_vet.size(); j++){
			if(!equals(req_bearer, my_bearer_vet[j]->value, string2strcmp_mode(my_bearer_vet[j]->equal_func)))
				return NO_MATCH;
		}
		string req_profile = requestEnvironment_attrs["profile"];
		for(unsigned int j=0; j<my_profile_vet.size(); j++){
			if(!equals(req_profile, my_profile_vet[j]->value, string2strcmp_mode(my_profile_vet[j]->equal_func)))
				return NO_MATCH;
		}
		return MATCH;
	}
}