/** * Gets location of the class path for the suite with the specified suiteId. * * Note that memory for the in/out parameter classPath is * allocated by the callee. The caller is responsible for * freeing it using pcsl_mem_free(). * * @param suiteId The application suite ID * @param storageId storage ID, INTERNAL_STORAGE_ID for the internal storage * @param checkSuiteExists true if suite should be checked for existence or not * @param classPath The in/out parameter that contains returned class path * @return error code that should be one of the following: * <pre> * ALL_OK, OUT_OF_MEMORY, NOT_FOUND, * SUITE_CORRUPTED_ERROR, BAD_PARAMS * </pre> */ MIDPError midp_suite_get_class_path(SuiteIdType suiteId, StorageIdType storageId, jboolean checkSuiteExists, pcsl_string *classPath) { MIDPError status = ALL_OK; int suiteExistsOrNotChecked; if (checkSuiteExists) { status = midp_suite_exists(suiteId); suiteExistsOrNotChecked = (status == ALL_OK || status == SUITE_CORRUPTED_ERROR); } else { /* * Don't need to check is the suite exist, * just construct the classpath for the given suite ID. */ suiteExistsOrNotChecked = 1; } if (suiteExistsOrNotChecked) { status = get_class_path_impl(COMPONENT_REGULAR_SUITE, suiteId, UNUSED_COMPONENT_ID, storageId, classPath, &JAR_EXTENSION); } else { *classPath = PCSL_STRING_NULL; } return status; }
/** * Builds a full file name using the storage root and MIDlet suite by ID. * get_suite_filename is used to build a filename after validation checks. * * @param suiteId suite ID * @param filename filename without a root path * @param res receives full name of the file * * @return the status: * ALL_OK if ok, * NOT_FOUND mean the suite does not exist, * OUT_OF_MEMORY if out of memory, * IO_ERROR if an IO_ERROR */ MIDPError build_suite_filename(SuiteIdType suiteId, const pcsl_string* filename, pcsl_string* res) { MIDPError status; *res = PCSL_STRING_NULL; status = midp_suite_exists(suiteId); /* Ignore if suite is corrupted */ if ((status != ALL_OK) && (status != SUITE_CORRUPTED_ERROR)) { return status; } return get_suite_filename(suiteId, filename, res); }
/** * Change the enabled state of a suite. * * @param suiteId ID of the suite * @param enabled true if the suite is be enabled * * @return an error code (ALL_OK if no errors) */ static MIDPError change_enabled_state(SuiteIdType suiteId, jboolean enabled) { char* pszError; MIDPError status; jbyte* pPermissions; int numberOfPermissions; jbyte pushInterrupt; jint pushOptions; jboolean temp; lockStorageList* node; MidletSuiteData* pData; /* * This is a public API which can be called without the VM running * so we need automatically init anything needed, to make the * caller's code less complex. * * Initialization is performed in steps so that we do use any * extra resources such as the VM for the operation being performed. */ if (midpInit(LIST_LEVEL) != 0) { return OUT_OF_MEMORY; } status = midp_suite_exists(suiteId); if ((status != ALL_OK) && (status != SUITE_CORRUPTED_ERROR)) { return status; } node = find_storage_lock(suiteId); if (node != NULL) { if (node->update == KNI_TRUE) { /* Suite is being updated currently. */ return SUITE_LOCKED; } } status = read_settings(&pszError, suiteId, &temp, &pushInterrupt, &pushOptions, &pPermissions, &numberOfPermissions); if (status != ALL_OK) { storageFreeError(pszError); return status; } status = begin_transaction(TRANSACTION_ENABLE_SUITE, suiteId, NULL); if (status != ALL_OK) { return status; } status = write_settings(&pszError, suiteId, enabled, pushInterrupt, pushOptions, pPermissions, numberOfPermissions, NULL); pcsl_mem_free(pPermissions); if (status != ALL_OK) { storageFreeError(pszError); /* nothing was written, so nothing to rollback, just finish */ (void)finish_transaction(); return status; } /* synchronize the settings in the list of MidletSuiteData structures */ pData = get_suite_data(suiteId); /* * We can assert that pData is not NULL because midp_suite_exists() * was called above to ensure that the suite with the given ID exists. */ if (pData != NULL) { int status; char* pszError; pData->isEnabled = enabled; /* IMPL_NOTE: these settings must be cached and saved on AMS exit. */ status = write_suites_data(&pszError); storageFreeError(pszError); if (status != ALL_OK) { (void)rollback_transaction(); return IO_ERROR; } } (void)finish_transaction(); return ALL_OK; }