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; }
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; } }