/** * Gets the storage root for a MIDlet suite by ID. * Free the data of the string returned with pcsl_string_free(). * * @param suiteId suite ID * @param sRoot receives storage root (gets set to NULL in the case of an error) * * @return status: ALL_OK if success, * OUT_OF_MEMORY if out-of-memory */ MIDPError get_suite_storage_root(SuiteIdType suiteId, pcsl_string* sRoot) { StorageIdType storageId; const pcsl_string* root; MIDPError status; *sRoot = PCSL_STRING_EMPTY; /* get an id of the storage where the suite is located */ status = midp_suite_get_suite_storage(suiteId, &storageId); if (status != ALL_OK) { return status; } root = storage_get_root(storageId); pcsl_string_predict_size(sRoot, pcsl_string_length(root) + GET_SUITE_ID_LEN(suiteId)); if (PCSL_STRING_OK == pcsl_string_append(sRoot, root) && PCSL_STRING_OK == pcsl_string_append(sRoot, midp_suiteid2pcsl_string(suiteId))) { return ALL_OK; } pcsl_string_free(sRoot); *sRoot = PCSL_STRING_NULL; return OUT_OF_MEMORY; }
/** * Builds a full file name using the storage root and MIDlet suite by ID. * * @param suiteId suite ID * @param filename filename without a root path * @param sRoot receives full name of the file * * @return the status: ALL_OK if ok, OUT_OF_MEMORY if out of memory */ static MIDPError get_suite_filename(SuiteIdType suiteId, const pcsl_string* filename, pcsl_string* sRoot) { int sRoot_len; const pcsl_string* root; root = storage_get_root(INTERNAL_STORAGE_ID); *sRoot = PCSL_STRING_EMPTY; sRoot_len = pcsl_string_length(root) + GET_SUITE_ID_LEN(suiteId) + pcsl_string_length(filename); pcsl_string_predict_size(sRoot, sRoot_len); if (PCSL_STRING_OK == pcsl_string_append(sRoot, root) && PCSL_STRING_OK == pcsl_string_append(sRoot, midp_suiteid2pcsl_string(suiteId)) && PCSL_STRING_OK == pcsl_string_append(sRoot, filename)) { return ALL_OK; } else { pcsl_string_free(sRoot); *sRoot = PCSL_STRING_NULL; return OUT_OF_MEMORY; } }
/** * Builds a full file name using the storage root and MIDlet suite by ID. * * @param suiteId suite ID * @param filename filename without a root path * @param sRoot receives full name of the file * * @return the status: ALL_OK if ok, OUT_OF_MEMORY if out of memory */ static MIDPError get_suite_filename(SuiteIdType suiteId, const pcsl_string* filename, pcsl_string* sRoot) { int sRoot_len; const pcsl_string* root; StorageIdType storageId; MIDPError status; /* get an id of the storage where the suite is located */ status = midp_suite_get_suite_storage(suiteId, &storageId); if (status != ALL_OK) { return status; } root = storage_get_root(storageId); *sRoot = PCSL_STRING_EMPTY; sRoot_len = pcsl_string_length(root) + GET_SUITE_ID_LEN(suiteId) + pcsl_string_length(filename); pcsl_string_predict_size(sRoot, sRoot_len); if (PCSL_STRING_OK == pcsl_string_append(sRoot, root) && PCSL_STRING_OK == pcsl_string_append(sRoot, midp_suiteid2pcsl_string(suiteId)) && PCSL_STRING_OK == pcsl_string_append(sRoot, filename)) { return ALL_OK; } else { pcsl_string_free(sRoot); *sRoot = PCSL_STRING_NULL; return OUT_OF_MEMORY; } }
/** * Gets the classpath for the specified MIDlet suite id. * * 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 suite id used to identify the MIDlet suite * @param storageId storage ID, INTERNAL_STORAGE_ID for the internal storage * @param classPath The in/out parameter that contains returned class path * @param extension Extension of the file ( * * @return one of the error codes: * <pre> * ALL_OK, OUT_OF_MEMORY * </pre> */ static MIDPError get_class_path_impl(SuiteIdType suiteId, jint storageId, pcsl_string * classPath, const pcsl_string * extension) { const pcsl_string* root = storage_get_root(storageId); pcsl_string path = PCSL_STRING_NULL; jint suiteIdLen = GET_SUITE_ID_LEN(suiteId); *classPath = PCSL_STRING_NULL; /* performance hint: predict buffer capacity */ pcsl_string_predict_size(&path, pcsl_string_length(root) + suiteIdLen + pcsl_string_length(extension)); if (PCSL_STRING_OK != pcsl_string_append(&path, root) || PCSL_STRING_OK != pcsl_string_append(&path, midp_suiteid2pcsl_string(suiteId)) || PCSL_STRING_OK != pcsl_string_append(&path, extension)) { pcsl_string_free(&path); return OUT_OF_MEMORY; } *classPath = path; return ALL_OK; }
/** * Converts the given suite ID to array of chars. * NOTE: this function returns a pointer to the static buffer! * * @param value suite id to convert * * @return char[] representation of the given suite ID * or NULL in case of error. */ const char* midp_suiteid2chars(SuiteIdType value) { jsize resLen; static jbyte resChars[GET_SUITE_ID_LEN(value) + 1]; /* +1 for last zero */ const pcsl_string* pResString = midp_suiteid2pcsl_string(value); pcsl_string_status rc; rc = pcsl_string_convert_to_utf8(pResString, resChars, (jsize)SUITESTORE_COUNTOF(resChars), &resLen); return (rc == PCSL_STRING_OK) ? (char*)&resChars : NULL; }
/** * Gets the classpath for the specified MIDlet suite id. * * 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 suite id used to identify the MIDlet suite * @param storageId storage ID, INTERNAL_STORAGE_ID for the internal storage * @param classPath The in/out parameter that contains returned class path * @param extension Extension of the file ( * * @return one of the error codes: * <pre> * ALL_OK, OUT_OF_MEMORY * </pre> */ static MIDPError get_class_path_impl(ComponentType type, SuiteIdType suiteId, ComponentIdType componentId, jint storageId, pcsl_string * pClassPath, const pcsl_string * pExtension) { const pcsl_string* root = storage_get_root(storageId); pcsl_string path = PCSL_STRING_NULL; jint suiteIdLen = GET_SUITE_ID_LEN(suiteId); jint componentIdLen = 0; #if ENABLE_DYNAMIC_COMPONENTS if (type == COMPONENT_DYNAMIC) { componentIdLen = GET_COMPONENT_ID_LEN(componentId); } #else (void)type; (void)componentId; #endif *pClassPath = PCSL_STRING_NULL; /* performance hint: predict buffer capacity */ pcsl_string_predict_size(&path, pcsl_string_length(root) + suiteIdLen + componentIdLen + + pcsl_string_length(pExtension)); if (PCSL_STRING_OK != pcsl_string_append(&path, root) || PCSL_STRING_OK != pcsl_string_append(&path, midp_suiteid2pcsl_string(suiteId))) { pcsl_string_free(&path); return OUT_OF_MEMORY; } #if ENABLE_DYNAMIC_COMPONENTS if (type == COMPONENT_DYNAMIC) { if (PCSL_STRING_OK != pcsl_string_append(&path, midp_componentid2pcsl_string(componentId))) { pcsl_string_free(&path); return OUT_OF_MEMORY; } } #endif if (PCSL_STRING_OK != pcsl_string_append(&path, pExtension)) { pcsl_string_free(&path); return OUT_OF_MEMORY; } *pClassPath = path; return ALL_OK; }
/** * Gets location of the cached resource with specified name * for the suite with the specified suiteId. * * Note that when porting memory for the in/out parameter * filename MUST be allocated using pcsl_mem_malloc(). * The caller is responsible for freeing the memory associated * with filename parameter. * * @param suiteId The application suite ID * @param storageId storage ID, INTERNAL_STORAGE_ID for the internal storage * @param pResourceName Name of the cached resource * @param pFileName The in/out parameter that contains returned filename * @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_cached_resource_filename(SuiteIdType suiteId, StorageIdType storageId, const pcsl_string * pResourceName, pcsl_string * pFileName) { const pcsl_string* root = storage_get_root(storageId); pcsl_string returnPath = PCSL_STRING_NULL; pcsl_string resourceFileName = PCSL_STRING_NULL; jint suiteIdLen = GET_SUITE_ID_LEN(suiteId); jsize resourceNameLen = pcsl_string_length(pResourceName); *pFileName = PCSL_STRING_NULL; if (resourceNameLen > 0) { /* performance hint: predict buffer capacity */ int fileNameLen = PCSL_STRING_ESCAPED_BUFFER_SIZE( resourceNameLen + pcsl_string_length(&TMP_EXT)); pcsl_string_predict_size(&resourceFileName, fileNameLen); if ( /* Convert any slashes */ pcsl_esc_attach_string(pResourceName, &resourceFileName) != PCSL_STRING_OK || /* Add the extension */ pcsl_string_append(&resourceFileName, &TMP_EXT) != PCSL_STRING_OK) { pcsl_string_free(&resourceFileName); return OUT_OF_MEMORY; } } /* performance hint: predict buffer capacity */ pcsl_string_predict_size(&returnPath, pcsl_string_length(root) + suiteIdLen + pcsl_string_length(&resourceFileName)); if (PCSL_STRING_OK != pcsl_string_append(&returnPath, root) || PCSL_STRING_OK != pcsl_string_append(&returnPath, midp_suiteid2pcsl_string(suiteId)) || PCSL_STRING_OK != pcsl_string_append(&returnPath, &resourceFileName)) { pcsl_string_free(&resourceFileName); pcsl_string_free(&returnPath); return OUT_OF_MEMORY; } pcsl_string_free(&resourceFileName); *pFileName = returnPath; return ALL_OK; }
/** * Returns a storage system unique string for this record store file * based on the current vendor and suite of the running MIDlet. * <ul> * <li>The native storage path for the desired MIDlet suite * is acquired from the Scheduler. * * <li>The <code>filename</code> arg is converted into an ascii * equivalent safe to use directly in the underlying * file system and appended to the native storage path. See the * com.sun.midp.io.j2me.storage.File.unicodeToAsciiFilename() * method for conversion details. * * <li>Finally the extension number given by the extension parameter * is appended to the file name. * <ul> * @param suiteId ID of the MIDlet suite that owns the record store * @param storageId ID of the storage where the RMS will be located * @param name name of the record store * @param extension extension number to add to the end of the file name * * @return a unique identifier for this record store file */ static MIDP_ERROR rmsdb_get_unique_id_path(SuiteIdType suiteId, StorageIdType storageId, const pcsl_string* name, int extension, pcsl_string * res_path) { pcsl_string temp = PCSL_STRING_NULL; MIDP_ERROR midpErr; pcsl_string_status pcslErr; *res_path = PCSL_STRING_NULL; // null in case of any error if (pcsl_string_is_null(name)) { return MIDP_ERROR_ILLEGAL_ARGUMENT; } midpErr = midp_suite_get_rms_filename(suiteId, storageId, (extension == IDX_EXTENSION_INDEX ? MIDP_RMS_IDX_EXT : MIDP_RMS_DB_EXT), name, res_path); if (midpErr != MIDP_ERROR_NONE) { return midpErr; } if (pcsl_string_is_null(res_path)) { /* Assume this is special case where the suite was not installed and create a filename from the ID. */ pcslErr = pcsl_string_cat(storage_get_root(storageId), midp_suiteid2pcsl_string(suiteId), &temp); if (pcslErr != PCSL_STRING_OK || pcsl_string_is_null(&temp) ) { return MIDP_ERROR_FOREIGN; } pcslErr = pcsl_string_cat(&temp, name, res_path); pcsl_string_free(&temp); if (PCSL_STRING_OK != pcslErr) { return MIDP_ERROR_FOREIGN; } } return MIDP_ERROR_NONE; }
/** * The function is called upon MIDlet suite removal. * It deletes suites's private directory and all it's content. * * @param suiteId the ID of MIDlet suite */ void jsr75_suite_remove_cleanup(SuiteIdType suiteId) { const pcsl_string* pStg = storage_get_root(INTERNAL_STORAGE_ID); const jchar jsep = pcsl_file_getfileseparator(); pcsl_string dirName1 = PCSL_STRING_NULL; pcsl_string dirName2 = PCSL_STRING_NULL; pcsl_string dirName = PCSL_STRING_NULL; pcsl_string sep = PCSL_STRING_NULL; if (pcsl_string_convert_from_utf16(&jsep, 1, &sep) != PCSL_STRING_OK) { return; } if (pcsl_string_cat(pStg, &privateDir, &dirName1) != PCSL_STRING_OK) { pcsl_string_free(&sep); return; } if (pcsl_string_cat(&dirName1, &sep, &dirName2) != PCSL_STRING_OK) { pcsl_string_free(&sep); pcsl_string_free(&dirName1); return; } if (pcsl_string_cat(&dirName2, midp_suiteid2pcsl_string(suiteId), &dirName) != PCSL_STRING_OK) { pcsl_string_free(&sep); pcsl_string_free(&dirName1); pcsl_string_free(&dirName2); return; } pcsl_string_free(&dirName1); pcsl_string_free(&dirName2); do_cleanup(&dirName, &sep); pcsl_string_free(&sep); pcsl_string_free(&dirName); }
/** * Converts the given component ID to pcsl_string. * NOTE: this function returns a pointer to the static buffer! * * The current implementation uses the internal knowledge that * ComponentIdType and SuiteIdType are compatible integer types. * * @param value component id to convert * @return pcsl_string representation of the given component id */ const pcsl_string* midp_componentid2pcsl_string(ComponentIdType value) { return midp_suiteid2pcsl_string((SuiteIdType)value); }
/** * Gets location of the resource with specified type and name * for the suite with the specified suiteId. * * Note that the implementation of this function MUST allocate the memory * for the in/out parameter filename using pcsl_mem_malloc(). * The caller is responsible for freeing the memory associated * with filename parameter. * * @param suiteId The application suite ID * @param storageId storage ID where the RMS will be located * NOTE: currently this parameter is ignored due to limitation of our * implementation: RMS is always located at the same storage as the suite. * @param extension rms extension that can be MIDP_RMS_DB_EXT or * MIDP_RMS_IDX_EXT * @param pResourceName RMS name * @param pFileName The in/out parameter that contains returned filename * * @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_rms_filename(SuiteIdType suiteId, StorageIdType storageId, jint extension, const pcsl_string* pResourceName, pcsl_string* pFileName) { const pcsl_string* root; pcsl_string returnPath = PCSL_STRING_NULL; pcsl_string rmsFileName = PCSL_STRING_NULL; jint suiteIdLen = GET_SUITE_ID_LEN(suiteId); jsize resourceNameLen = pcsl_string_length(pResourceName); /* * IMPL_NOTE: currently we have a limitation that the suite's RMS * must be located at the same storage as the midlet suite. * See rms.c, rmsdb_get_record_store_space_available() for more details. */ root = storage_get_root(storageId); *pFileName = PCSL_STRING_NULL; if (resourceNameLen > 0) { const pcsl_string* ext; jsize extLen; int fileNameLen; if (MIDP_RMS_IDX_EXT == extension) { ext = &IDX_EXTENSION; extLen = pcsl_string_length(&IDX_EXTENSION); } else if (MIDP_RMS_DB_EXT == extension) { ext = &DB_EXTENSION; extLen = pcsl_string_length(&DB_EXTENSION); } else { return BAD_PARAMS; } /* performance hint: predict buffer capacity */ fileNameLen = PCSL_STRING_ESCAPED_BUFFER_SIZE(resourceNameLen + extLen); pcsl_string_predict_size(&rmsFileName, fileNameLen); if (pcsl_string_append_escaped_ascii(&rmsFileName, pResourceName) != PCSL_STRING_OK || pcsl_string_append(&rmsFileName, ext) != PCSL_STRING_OK) { pcsl_string_free(&rmsFileName); return OUT_OF_MEMORY; } } /* performance hint: predict buffer capacity */ pcsl_string_predict_size(&returnPath, pcsl_string_length(root) + suiteIdLen + pcsl_string_length(&rmsFileName)); if (PCSL_STRING_OK != pcsl_string_append(&returnPath, root) || PCSL_STRING_OK != pcsl_string_append(&returnPath, midp_suiteid2pcsl_string(suiteId)) || PCSL_STRING_OK != pcsl_string_append(&returnPath, &rmsFileName)) { pcsl_string_free(&rmsFileName); pcsl_string_free(&returnPath); return OUT_OF_MEMORY; } pcsl_string_free(&rmsFileName); *pFileName = returnPath; return ALL_OK; }