static bool parseProfileInfo(ProfileType profileType, Profile* p, const SETTINGS& s, const char* filename, RuntimeInfo& pi) { bool hasBbMajor = false, hasBbMinor = false; pi.isBlackberry = false; pi.hasLimitedResourceSize = false; pi.isCldc10 = false; pi.iconSize = "default"; int iconX = -1; int iconY = -1; if (profileType == DEVICE_BASED) { ifstream file(filename); setName(file, filename); if (!file.good()) return false; while (file.good()) { string line; getline(file, line); if (line.find("#define MA_PROF_BUG_RESOURCE_SIZE_LIMITED") == 0) { pi.hasLimitedResourceSize = true; } hasBbMajor |= parseIntProp(line, "MA_PROF_BLACKBERRY_VERSION", pi.blackberryVersion); hasBbMinor |= parseIntProp(line, "MA_PROF_BLACKBERRY_VERSION_MINOR", pi.blackberryMinor); if (line.find("#define MA_PROF_SUPPORT_CLDC_10") == 0) { pi.isCldc10 = true; } parseIntProp(line, "MA_PROF_CONST_ICONSIZE_X", iconX); parseIntProp(line, "MA_PROF_CONST_ICONSIZE_Y", iconY); } //pi.isBlackberry = (hasBbMajor && hasBbMinor); //rapc is not available. } else { Capability iconSize = p->getCapability("IconSize"); if (iconSize.getValue().length() > 0) { pi.iconSize = iconSize.getValue().c_str(); } pi.isBlackberry = p->getFamily() == "BlackBerry"; if (pi.isBlackberry) { Capability major = p->getCapability("Version/Major"); Capability minor = p->getCapability("Version/Minor"); sscanf(major.getValue().c_str(), "%i", &pi.blackberryVersion); sscanf(minor.getValue().c_str(), "%i", &pi.blackberryMinor); } Capability cldc = p->getCapability("CLDC"); pi.isCldc10 = (cldc.getValue() == "1.0"); } if (iconX > 0 && iconY > 0) { char buf[32]; sprintf(buf, "%ix%i", iconX, iconY); pi.iconSize = buf; } return true; }
bool ProfileDB::internalMatchProfile(Profile* profile, vector<Capability>& requiredCapabilites, vector<Capability>& optionalCapabilites, string& matchToken) { bool match = true; // When can we NOT reuse a specific runtime? // Only if fragmentation is set to BUILDTIME and if either a) one supports the capability and // the other does not OR b) the capability value differs. // So we add strings to create a unique match token for every // runtime that need be built for (vector<Capability>::iterator capability = requiredCapabilites.begin(); capability != requiredCapabilites.end(); capability++) { Capability matchedCapability = profile->getCapability( capability->getName()); CapabilityState matchedState = matchedCapability.getState(); // Ok, so we don't support this, bail out! if (matchedState == NOT_IMPLEMENTED || matchedState == UNSUPPORTED) { match = false; } Fragmentation fragmentation = matchedCapability.getFragmentation(); string valueStr = fragmentation == BUILDTIME ? matchedCapability.getValue() : ""; matchToken.append(valueStr); matchToken.append("|"); } // So, the optional capabilities are matched in a different way. // We add stuff to the matchTokens string to produce a string that // is unique to the optional capabilities being matched. for (vector<Capability>::iterator capability = optionalCapabilites.begin(); capability != optionalCapabilites.end(); capability++) { Capability matchedCapability = profile->getCapability( capability->getName()); CapabilityState matchedState = matchedCapability.getState(); Fragmentation fragmentation = matchedCapability.getFragmentation(); string valueStr = fragmentation == BUILDTIME ? matchedCapability.getValue() : ""; bool capSupported = fragmentation == BUILDTIME && (matchedState == NOT_IMPLEMENTED || matchedState == UNSUPPORTED); matchToken.append((capSupported ? "+" : "-") + valueStr); matchToken.append("|"); } // Finally we add PROPERTIES of the runtime which are buildtime fragmented. // For example, different device types or icon sizes should always generate // a unique runtime. set<string> allCapabilities = profile->getCapabilities(); for (set<string>::iterator allCapabilitesIt = allCapabilities.begin(); allCapabilitesIt != allCapabilities.end(); allCapabilitesIt++) { string capabilityName = *allCapabilitesIt; Capability capability = profile->getCapability(capabilityName); if (capability.getType() == "property") { Fragmentation fragmentation = capability.getFragmentation(); string valueStr = fragmentation == BUILDTIME ? capability.getValue() : "-"; matchToken.append(valueStr); matchToken.append("|"); } } return match; }