/** * Restore the state of the MIDlet suite loader. * <p> * Java declaration: * <pre> * restoreCommandState(Lcom/sun/midp/CommandState;)V * </pre> */ KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(com_sun_midp_main_CommandState_restoreCommandState) { KNI_StartHandles(5); KNI_DeclareHandle(runtimeInfo); KNI_DeclareHandle(commandState); KNI_DeclareHandle(clazz); KNI_DeclareHandle(rtiClazz); KNI_DeclareHandle(string); KNI_GetParameterAsObject(1, commandState); KNI_GetObjectClass(commandState, clazz); KNI_GetObjectField(commandState, midp_get_field_id(KNIPASSARGS clazz, "runtimeInfo", "Lcom/sun/midp/main/RuntimeInfo;"), runtimeInfo); KNI_GetObjectClass(runtimeInfo, rtiClazz); KNI_RESTORE_INT_FIELD(commandState, clazz, "status", MidpCommandState.status); KNI_RESTORE_BOOLEAN_FIELD(commandState, clazz, "logoDisplayed", MidpCommandState.logoDisplayed); KNI_RESTORE_PCSL_STRING_FIELD(commandState, clazz, "midletClassName", &MidpCommandState.midletClassName, string); KNI_RESTORE_INT_FIELD(commandState, clazz, "suiteId", MidpCommandState.suiteId); KNI_RESTORE_INT_FIELD(commandState, clazz, "lastSuiteId", MidpCommandState.lastSuiteId); KNI_RESTORE_INT_FIELD(commandState, clazz, "debugMode", MidpCommandState.debugMode); KNI_RESTORE_INT_FIELD(runtimeInfo, rtiClazz, "memoryReserved", MidpCommandState.runtimeInfo.memoryReserved); KNI_RESTORE_INT_FIELD(runtimeInfo, rtiClazz, "memoryTotal", MidpCommandState.runtimeInfo.memoryTotal); KNI_RESTORE_INT_FIELD(runtimeInfo, rtiClazz, "priority", MidpCommandState.runtimeInfo.priority); KNI_RESTORE_PCSL_STRING_FIELD(commandState, clazz, "lastMidletClassName", &MidpCommandState.lastMidletClassName, string); KNI_RESTORE_PCSL_STRING_FIELD(commandState, clazz, "lastArg0", &MidpCommandState.lastArg0, string); KNI_RESTORE_PCSL_STRING_FIELD(commandState, clazz, "lastArg1", &MidpCommandState.lastArg1, string); KNI_RESTORE_PCSL_STRING_FIELD(commandState, clazz, "arg0", &MidpCommandState.arg0, string); KNI_RESTORE_PCSL_STRING_FIELD(commandState, clazz, "arg1", &MidpCommandState.arg1, string); KNI_RESTORE_PCSL_STRING_FIELD(commandState, clazz, "arg2", &MidpCommandState.arg2, string); KNI_RESTORE_PCSL_STRING_FIELD(runtimeInfo, rtiClazz, "profileName", &MidpCommandState.profileName, string); KNI_EndHandles(); KNI_ReturnVoid(); }
static jboolean initializeSurfaceFieldIds(jobject objectHandle) { static const FieldDesc surfaceFieldDesc[] = { { "nativePtr", "J" }, { NULL, NULL } }; jboolean retVal; if (fieldIdsInitialized) { return KNI_TRUE; } retVal = KNI_FALSE; KNI_StartHandles(1); KNI_DeclareHandle(classHandle); KNI_GetObjectClass(objectHandle, classHandle); if (initializeFieldIds(fieldIds, classHandle, surfaceFieldDesc)) { retVal = KNI_TRUE; fieldIdsInitialized = KNI_TRUE; } KNI_EndHandles(); return retVal; }
/** * Gets the field ids of a Java event object and cache them * in local static storage. * * @param eventObj handle to an NativeEvent Java object * @param classObj handle to the NativeEvent class */ static void cacheEventFieldIDs(jobject eventObj, jclass classObj) { if (eventFieldIDsObtained) { return; } KNI_GetObjectClass(eventObj, classObj); typeFieldID = KNI_GetFieldID(classObj, "type", "I"); intParam1FieldID = KNI_GetFieldID(classObj, "intParam1", "I"); intParam2FieldID = KNI_GetFieldID(classObj, "intParam2", "I"); intParam3FieldID = KNI_GetFieldID(classObj, "intParam3", "I"); intParam4FieldID = KNI_GetFieldID(classObj, "intParam4", "I"); intParam5FieldID = KNI_GetFieldID(classObj, "intParam5", "I"); stringParam1FieldID = KNI_GetFieldID(classObj, "stringParam1", "Ljava/lang/String;"); stringParam2FieldID = KNI_GetFieldID(classObj, "stringParam2", "Ljava/lang/String;"); stringParam3FieldID = KNI_GetFieldID(classObj, "stringParam3", "Ljava/lang/String;"); stringParam4FieldID = KNI_GetFieldID(classObj, "stringParam4", "Ljava/lang/String;"); stringParam5FieldID = KNI_GetFieldID(classObj, "stringParam5", "Ljava/lang/String;"); stringParam6FieldID = KNI_GetFieldID(classObj, "stringParam6", "Ljava/lang/String;"); eventFieldIDsObtained = 1; }
/** * Native method void finalize of * com.sun.midp.midletsuite.MIDletSuiteImpl. * <p> * * native finalizer * */ KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(com_sun_midp_midletsuite_MIDletSuiteImpl_finalize) { SuiteIdType suiteId; jboolean locked; KNI_StartHandles(2); KNI_DeclareHandle(object); KNI_DeclareHandle(clazz); KNI_GetThisPointer(object); KNI_GetObjectClass(object, clazz); locked = KNI_GetBooleanField(object, midp_get_field_id(KNIPASSARGS clazz, "locked", "Z")); if (locked) { suiteId = KNI_GetIntField(object, midp_get_field_id(KNIPASSARGS clazz, "id", "I")); unlock_storage(suiteId); } KNI_EndHandles(); KNI_ReturnVoid(); }
static jboolean initializeFinalizerFieldIds(jobject objectHandle) { static const FieldDesc finalizerFieldDesc[] = { { "guardedObject", "Lcom/sun/pisces/NativeFinalization;" }, { NULL, NULL } }; jboolean retVal; if (fieldIdsInitialized) { return KNI_TRUE; } retVal = KNI_FALSE; KNI_StartHandles(1); KNI_DeclareHandle(classHandle); KNI_GetObjectClass(objectHandle, classHandle); if (initializeFieldIds(fieldIds, classHandle, finalizerFieldDesc)) { retVal = KNI_TRUE; fieldIdsInitialized = KNI_TRUE; } KNI_EndHandles(); return retVal; }
/* * Reads information about the installed midlet suite's component * from the storage. * * @param componentId unique ID of the component * @param ci ComponentInfo object to fill with the information about * the midlet suite's component having the given ID * * @exception IOException if an the information cannot be read * @exception IllegalArgumentException if suiteId is invalid or ci is null */ KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL( com_sun_midp_midletsuite_DynamicComponentStorage_getComponentInfo) { ComponentIdType componentId = KNI_GetParameterAsInt(1); MIDPError status = ALL_OK; KNI_StartHandles(3); KNI_DeclareHandle(componentInfoObject); KNI_DeclareHandle(componentInfoClass); KNI_DeclareHandle(tmpHandle); KNI_GetParameterAsObject(2, componentInfoObject); KNI_GetObjectClass(componentInfoObject, componentInfoClass); do { char *pszError = NULL; MidletSuiteData *pData = NULL; /* Ensure that suite data are read */ status = read_suites_data(&pszError); storageFreeError(pszError); if (status != ALL_OK) { break; } pData = get_component_data(componentId); if (!pData) { status = NOT_FOUND; break; } KNI_RESTORE_INT_FIELD(componentInfoObject, componentInfoClass, "componentId", componentId); KNI_RESTORE_INT_FIELD(componentInfoObject, componentInfoClass, "suiteId", pData->suiteId); KNI_RESTORE_PCSL_STRING_FIELD(componentInfoObject, componentInfoClass, "displayName", &(pData->varSuiteData.displayName), tmpHandle); KNI_RESTORE_PCSL_STRING_FIELD(componentInfoObject, componentInfoClass, "version", &(pData->varSuiteData.suiteVersion), tmpHandle); KNI_RESTORE_BOOLEAN_FIELD(componentInfoObject, componentInfoClass, "trusted", pData->isTrusted); } while (0); if (status != ALL_OK) { if (status == NOT_FOUND) { KNI_ThrowNew(midpIllegalArgumentException, "bad component ID"); } else { KNI_ThrowNew(midpIOException, NULL); } } KNI_EndHandles(); KNI_ReturnVoid(); }
/** * Receives an SMS message. * * @param port The port number to be matched against incoming SMS messages. * @param handle The handle to the open SMS message connection. * @param messageObject The Java message object to be populated. * * @return The length of the SMS message (in bytes). */ KNIEXPORT KNI_RETURNTYPE_INT KNIDECL(com_sun_midp_io_j2me_sms_Protocol_receive0) { #if ENABLE_REENTRY MidpReentryData *info = (MidpReentryData*)SNI_GetReentryData(NULL); #endif int port, handle; int messageLength = -1; SmsMessage *psmsData = NULL; /* The midlet suite name for this connection. */ AppIdType msid = UNUSED_APP_ID; jboolean isOpen; KNI_StartHandles(6); KNI_DeclareHandle(this); KNI_DeclareHandle(thisClass); KNI_GetThisPointer(this); KNI_GetObjectClass(this, thisClass); isOpen = KNI_GetBooleanField(this, KNI_GetFieldID(thisClass, "open", "Z")); if (isOpen) { /* No close in progress */ KNI_DeclareHandle(messageClazz); KNI_DeclareHandle(messageObject); KNI_DeclareHandle(addressArray); KNI_DeclareHandle(byteArray); port = KNI_GetParameterAsInt(1); msid = KNI_GetParameterAsInt(2); handle = KNI_GetParameterAsInt(3); KNI_GetParameterAsObject(4, messageObject); do { #if ENABLE_REENTRY if (!info) { #endif psmsData = jsr120_sms_pool_peek_next_msg((jchar)port); if (psmsData == NULL) { #if ENABLE_REENTRY /* block and wait for a message. */ midp_thread_wait(WMA_SMS_READ_SIGNAL, handle, NULL); #else do { CVMD_gcSafeExec(_ee, { jsr120_wait_for_signal(handle, WMA_SMS_READ_SIGNAL); }); psmsData = jsr120_sms_pool_peek_next_msg((jchar)port); isOpen = KNI_GetBooleanField(this, KNI_GetFieldID(thisClass, "open", "Z")); } while (psmsData == NULL && isOpen); #endif } #if ENABLE_REENTRY } else {
static void setNativePointer(jobject linkObj, rendezvous *rp) { jfieldID nativePointerField; KNI_StartHandles(1); KNI_DeclareHandle(linkClass); KNI_GetObjectClass(linkObj, linkClass); nativePointerField = KNI_GetFieldID(linkClass, "nativePointer", "I"); KNI_SetIntField(linkObj, nativePointerField, (jint)rp); KNI_EndHandles(); }
static void setContents(jobject linkMessageObj, jobject contentsObj) { jfieldID contentsField; KNI_StartHandles(1); KNI_DeclareHandle(linkMessageClass); KNI_GetObjectClass(linkMessageObj, linkMessageClass); contentsField = KNI_GetFieldID(linkMessageClass, "contents", "Ljava/lang/Object;"); KNI_SetObjectField(linkMessageObj, contentsField, contentsObj); KNI_EndHandles(); }
KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(KNITest_testGetSetIntField) { jint x = KNI_GetParameterAsInt(1); jint y; jfieldID typeFieldID; KNI_StartHandles(2); KNI_DeclareHandle(this); KNI_DeclareHandle(clazz); KNI_GetThisPointer(this); KNI_GetObjectClass(this, clazz); typeFieldID = KNI_GetFieldID(clazz, "i", "I"); y = KNI_GetIntField(this, typeFieldID); KNI_SetIntField(this, typeFieldID, x*y); KNI_EndHandles(); KNI_ReturnVoid(); }
static rendezvous * getNativePointer(jobject linkObj) { rendezvous *rp; jfieldID nativePointerField; KNI_StartHandles(1); KNI_DeclareHandle(linkClass); KNI_GetObjectClass(linkObj, linkClass); nativePointerField = KNI_GetFieldID(linkClass, "nativePointer", "I"); rp = (rendezvous *)KNI_GetIntField(linkObj, nativePointerField); KNI_EndHandles(); return rp; }
static void setRange(jobject linkMessageObj, int offset, int length) { jfieldID offsetField; jfieldID lengthField; KNI_StartHandles(1); KNI_DeclareHandle(linkMessageClass); KNI_GetObjectClass(linkMessageObj, linkMessageClass); offsetField = KNI_GetFieldID(linkMessageClass, "offset", "I"); lengthField = KNI_GetFieldID(linkMessageClass, "length", "I"); KNI_SetIntField(linkMessageObj, offsetField, offset); KNI_SetIntField(linkMessageObj, lengthField, length); KNI_EndHandles(); }
/** * Set a jobject field from Java native functions. * * Always use KNI to set an object field instead of setting it directly * using SNI access, since there is more to setting a object in a field * than just moving a reference, there is a flag to tell the the garbage * collector that the field is set to an object and if this flag is not * set then the collector not count the field as a reference which can * lead to premature collection of the object the field is referencing * and then a crash since the field will reference will not be null, it * will be unchanged and invalid. * * @param obj a handle to Java object whose field will be set * @param fieldName field name * @param fieldSignature field signature string * @param newValue a handle to the new Java value of the field */ void midp_set_jobject_field(KNIDECLARGS jobject obj, const char *fieldName, const char *fieldSignature, jobject newValue) { if (KNI_IsNullHandle(obj)) { return; } KNI_StartHandles(1); KNI_DeclareHandle(clazz); KNI_GetObjectClass(obj, clazz); KNI_SetObjectField(obj, midp_get_field_id(KNIPASSARGS clazz, fieldName, fieldSignature), newValue); KNI_EndHandles(); }
/** * Native finalizer. */ KNIEXPORT KNI_RETURNTYPE_VOID Java_com_sun_midp_io_j2me_comm_Protocol_finalize() { int hPort; KNI_StartHandles(2); KNI_DeclareHandle(instance); KNI_DeclareHandle(clazz); KNI_GetThisPointer(instance); KNI_GetObjectClass(instance, clazz); hPort = KNI_GetIntField(instance, KNI_GetFieldID(clazz, "handle", "I")); if (hPort != -1) { REPORT_INFO1(LC_PROTOCOL, "closePort(1st) >> hPort=%d\n",hPort); closePort(hPort); } KNI_EndHandles(); KNI_ReturnVoid(); }
/* JAVADOC COMMENT ELIDED */ KNIEXPORT KNI_RETURNTYPE_VOID Java_com_sun_j2me_location_PlatformLocationProvider_finalize() { jint provider; KNI_StartHandles(2); KNI_DeclareHandle(this_obj); KNI_DeclareHandle(class_obj); KNI_GetThisPointer(this_obj); KNI_GetObjectClass(this_obj, class_obj); provider = KNI_GetIntField(this_obj, KNI_GetFieldID(class_obj, "provider", "I")); if (unregister_provider(provider) == KNI_TRUE) { jsr179_provider_close((jsr179_handle)provider); } KNI_EndHandles(); KNI_ReturnVoid(); }
/** * Cache the fieldIDs for each fields of the InvocationImpl class. * Initialize the invocation queue head. * @param invocObj the invocation object * @param classObj the Class object of Invocation */ static void init(jobject invocObj, jclass classObj) { if (urlFid != 0) { return; } KNI_GetObjectClass(invocObj, classObj); /* Get these field IDs from InvocationImpl */ tidFid = KNI_GetFieldID(classObj, "tid", "I" ); previousTidFid = KNI_GetFieldID(classObj, "previousTid", "I" ); suiteIdFid = KNI_GetFieldID(classObj, "suiteId", "I"); classnameFid = KNI_GetFieldID(classObj, "classname", "Ljava/lang/String;"); statusFid = KNI_GetFieldID(classObj, "status", "I"); invokingAuthorityFid = KNI_GetFieldID(classObj, "invokingAuthority", "Ljava/lang/String;"); invokingAppNameFid = KNI_GetFieldID(classObj, "invokingAppName", "Ljava/lang/String;"); invokingSuiteIdFid = KNI_GetFieldID(classObj, "invokingSuiteId", "I"); invokingClassnameFid = KNI_GetFieldID(classObj, "invokingClassname", "Ljava/lang/String;"); invokingIDFid = KNI_GetFieldID(classObj, "invokingID", "Ljava/lang/String;"); /* * Get the rest of the fields from Invocation (the InvocationImpl superclass) * KNI_GetSuperClass(classObj, classObj); */ urlFid = KNI_GetFieldID(classObj, "url", "Ljava/lang/String;"); typeFid = KNI_GetFieldID(classObj, "type", "Ljava/lang/String;"); actionFid = KNI_GetFieldID(classObj, "action", "Ljava/lang/String;"); IDFid = KNI_GetFieldID(classObj, "ID", "Ljava/lang/String;"); argumentsFid = KNI_GetFieldID(classObj, "arguments", "[Ljava/lang/String;"); argsLenFid = KNI_GetFieldID(classObj, "argsLen", "I"); dataFid = KNI_GetFieldID(classObj, "data", "[B"); dataLenFid = KNI_GetFieldID(classObj, "dataLen", "I"); responseRequiredFid = KNI_GetFieldID(classObj, "responseRequired", "Z"); usernameFid = KNI_GetFieldID(classObj, "username", "Ljava/lang/String;"); passwordFid = KNI_GetFieldID(classObj, "password", "Ljava/lang/String;"); #if REPORT_LEVEL <= LOG_CRITICAL if (urlFid == 0 || typeFid == 0 || actionFid == 0 || IDFid == 0 || statusFid == 0 || responseRequiredFid == 0 || tidFid == 0 || previousTidFid == 0 || suiteIdFid == 0 || classnameFid == 0 || invokingAuthorityFid == 0 || invokingAppNameFid == 0 || invokingSuiteIdFid == 0 || invokingClassnameFid == 0 || invokingIDFid == 0 || usernameFid == 0 || passwordFid == 0 || argumentsFid == 0 || argsLenFid == 0 || dataLenFid == 0 || dataFid == 0) { REPORT_CRIT(LC_NONE, "invocStore.c: fieldID initialization failed"); } #endif }
/* JAVADOC COMMENT ELIDED */ KNIEXPORT KNI_RETURNTYPE_BOOLEAN Java_com_sun_j2me_location_PlatformLocationProvider_getCriteria() { jsr179_provider_info provider_info; jsr179_result res; jboolean ret = KNI_FALSE; KNI_StartHandles(3); /* get NULL terminated provider name */ KNI_DeclareHandle(criteria); KNI_DeclareHandle(class_obj); GET_PARAMETER_AS_PCSL_STRING(1, name) /* call provider_open to get provider handler */ res = jsr179_provider_getinfo(name, &provider_info); if (res == JSR179_STATUSCODE_OK) { KNI_GetParameterAsObject(2, criteria); KNI_GetObjectClass(criteria, class_obj); KNI_SetBooleanField(criteria, locationProviderInfoFieldID.incurCost, provider_info.incurCost); KNI_SetBooleanField(criteria, locationProviderInfoFieldID.canReportAltitude, provider_info.canReportAltitude); KNI_SetBooleanField(criteria, locationProviderInfoFieldID.canReportAddressInfo, provider_info.canReportAddressInfo); KNI_SetBooleanField(criteria, locationProviderInfoFieldID.canReportSpeedCource, provider_info.canReportSpeedCource); KNI_SetIntField(criteria, locationProviderInfoFieldID.powerConsumption, provider_info.powerConsumption); KNI_SetIntField(criteria, locationProviderInfoFieldID.horizontalAccuracy, provider_info.horizontalAccuracy); KNI_SetIntField(criteria, locationProviderInfoFieldID.verticalAccuracy, provider_info.verticalAccuracy); KNI_SetIntField(criteria, locationProviderInfoFieldID.defaultTimeout, provider_info.defaultTimeout); KNI_SetIntField(criteria, locationProviderInfoFieldID.defaultMaxAge, provider_info.defaultMaxAge); KNI_SetIntField(criteria, locationProviderInfoFieldID.defaultInterval, provider_info.defaultInterval); KNI_SetIntField(criteria, locationProviderInfoFieldID.averageResponseTime, provider_info.averageResponseTime); KNI_SetIntField(criteria, locationProviderInfoFieldID.defaultStateInterval, provider_info.defaultStateInterval); ret = KNI_TRUE; } else if (res == JSR179_STATUSCODE_INVALID_ARGUMENT) { /* wrong provider name */ KNI_ThrowNew(midpIllegalArgumentException, "wrong provider name"); } RELEASE_PCSL_STRING_PARAMETER KNI_EndHandles(); KNI_ReturnBoolean(ret); }
/** * Save the state of the MIDlet suite loader. * <p> * Java declaration: * <pre> * saveCommandState(Lcom/sun/midp/CommandState;)V * </pre> */ KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(com_sun_midp_main_CommandState_saveCommandState) { KNI_StartHandles(5); KNI_DeclareHandle(runtimeInfo); KNI_DeclareHandle(commandState); KNI_DeclareHandle(clazz); KNI_DeclareHandle(rtiClazz); KNI_DeclareHandle(string); KNI_GetParameterAsObject(1, commandState); KNI_GetObjectClass(commandState, clazz); KNI_GetObjectField(commandState, midp_get_field_id(KNIPASSARGS clazz, "runtimeInfo", "Lcom/sun/midp/main/RuntimeInfo;"), runtimeInfo); KNI_GetObjectClass(runtimeInfo, rtiClazz); KNI_SAVE_INT_FIELD(commandState, clazz, "status", MidpCommandState.status); KNI_SAVE_INT_FIELD(commandState, clazz, "suiteId", MidpCommandState.suiteId); KNI_SAVE_INT_FIELD(commandState, clazz, "lastSuiteId", MidpCommandState.lastSuiteId); KNI_SAVE_BOOLEAN_FIELD(commandState, clazz, "logoDisplayed", MidpCommandState.logoDisplayed); KNI_SAVE_INT_FIELD(commandState, clazz, "debugMode", MidpCommandState.debugMode); KNI_SAVE_INT_FIELD(runtimeInfo, rtiClazz, "memoryReserved", MidpCommandState.runtimeInfo.memoryReserved); KNI_SAVE_INT_FIELD(runtimeInfo, rtiClazz, "memoryTotal", MidpCommandState.runtimeInfo.memoryTotal); KNI_SAVE_INT_FIELD(runtimeInfo, rtiClazz, "priority", MidpCommandState.runtimeInfo.priority); /* * We need to put these in the do/while block since the SAVE_STRING * macros may throw an OutOfMemoryException. If this happens, we * must exit the native function immediately. */ do { KNI_SAVE_PCSL_STRING_FIELD(commandState, clazz, "midletClassName", &MidpCommandState.midletClassName, string); KNI_SAVE_PCSL_STRING_FIELD(commandState, clazz, "lastMidletClassName", &MidpCommandState.lastMidletClassName, string); KNI_SAVE_PCSL_STRING_FIELD(commandState, clazz, "lastArg0", &MidpCommandState.lastArg0, string); KNI_SAVE_PCSL_STRING_FIELD(commandState, clazz, "lastArg1", &MidpCommandState.lastArg1, string); KNI_SAVE_PCSL_STRING_FIELD(commandState, clazz, "arg0", &MidpCommandState.arg0, string); KNI_SAVE_PCSL_STRING_FIELD(commandState, clazz, "arg1", &MidpCommandState.arg1, string); KNI_SAVE_PCSL_STRING_FIELD(commandState, clazz, "arg2", &MidpCommandState.arg2, string); KNI_SAVE_PCSL_STRING_FIELD(runtimeInfo, rtiClazz, "profileName", &MidpCommandState.profileName, string); } while (0); KNI_EndHandles(); KNI_ReturnVoid(); }
/** * Sends an SMS message. * * @param handle The handle to the open SMS connection. * @param messageType The type of message: binary or text. * @param address The SMS-formatted address. * @param destPort The port number of the recipient. * @param sourcePort The port number of the sender. * @param messageBuffer The buffer containing the SMS message. * * @return Always returns <code>0</code>. */ KNIEXPORT KNI_RETURNTYPE_INT KNIDECL(com_sun_midp_io_j2me_sms_Protocol_send0) { WMA_STATUS status = WMA_ERR; jint messageLength = 0; jint messageType; jint sourcePort; jint destPort; jint handle; jint msAddress_len; jchar* msAddress_data; int i; unsigned char *pAddress = NULL; unsigned char *pMessageBuffer = NULL; jboolean stillWaiting = KNI_FALSE; jboolean trySend = KNI_FALSE; void *pdContext = NULL; #if ENABLE_REENTRY MidpReentryData *info; jsr120_sms_message_state_data *messageStateData = NULL; #endif jboolean isOpen; KNI_StartHandles(4); KNI_DeclareHandle(this); KNI_DeclareHandle(thisClass); KNI_GetThisPointer(this); KNI_GetObjectClass(this, thisClass); isOpen = KNI_GetBooleanField(this, KNI_GetFieldID(thisClass, "open", "Z")); if (isOpen) { /* No close in progress */ KNI_DeclareHandle(messageBuffer); KNI_DeclareHandle(address); handle = KNI_GetParameterAsInt(1); messageType = KNI_GetParameterAsInt(2); KNI_GetParameterAsObject(3, address); destPort = KNI_GetParameterAsInt(4); sourcePort = KNI_GetParameterAsInt(5); KNI_GetParameterAsObject(6, messageBuffer); do { #if ENABLE_REENTRY info = (MidpReentryData*)SNI_GetReentryData(NULL); if (info == NULL) { /* First invocation. */ #endif if (KNI_IsNullHandle(address)) { KNI_ThrowNew(midpIllegalArgumentException, NULL); break; } else { msAddress_len = KNI_GetStringLength(address); msAddress_data = (jchar *)pcsl_mem_malloc(msAddress_len * sizeof (jchar)); if (msAddress_data == NULL) { KNI_ThrowNew(midpOutOfMemoryError, NULL); break; } else { KNI_GetStringRegion(address, 0, msAddress_len, msAddress_data); pAddress = (unsigned char*)pcsl_mem_malloc(msAddress_len + 1); if (pAddress != NULL) { for (i = 0; i < msAddress_len; i++) { pAddress[i] = (unsigned char)msAddress_data[i]; } pAddress[msAddress_len] = 0; } //pAddress = (unsigned char *)midpJcharsToChars(msAddress); pcsl_mem_free(msAddress_data); if (!KNI_IsNullHandle(messageBuffer)) { messageLength = KNI_GetArrayLength(messageBuffer); } if (messageLength >= 0) { if (messageLength > 0) { pMessageBuffer = (unsigned char *)pcsl_mem_malloc(messageLength); memset(pMessageBuffer, 0, messageLength); KNI_GetRawArrayRegion(messageBuffer, 0, messageLength, (jbyte *)pMessageBuffer); } trySend = KNI_TRUE; } } } #if ENABLE_REENTRY } else { /* Reinvocation after unblocking the thread. */ if (info->pResult == NULL) { /* waiting for mms_send_completed event */ if (info->status == WMA_ERR) { KNI_ThrowNew(midpInterruptedIOException, "Sending SMS"); } break; } messageStateData = info->pResult; pMessageBuffer = messageStateData->pMessageBuffer; pAddress = messageStateData->pAddress; pdContext = messageStateData->pdContext; trySend = KNI_TRUE; } #endif if (trySend == KNI_TRUE) { /* send message. */ status = jsr120_send_sms((jchar)messageType, pAddress, pMessageBuffer, (jchar)messageLength, (jchar)sourcePort, (jchar)destPort, handle, &pdContext); if (status == WMA_ERR) { KNI_ThrowNew(midpIOException, "Sending SMS"); break; } #if ENABLE_REENTRY else if (status == WMA_NET_WOULDBLOCK) { if (messageStateData == NULL) { messageStateData = (jsr120_sms_message_state_data *)pcsl_mem_malloc( sizeof(*messageStateData)); messageStateData->pMessageBuffer = pMessageBuffer; messageStateData->pAddress = pAddress; } messageStateData->pdContext = pdContext; /* Block calling Java Thread. */ midp_thread_wait(WMA_SMS_WRITE_SIGNAL, handle, messageStateData); stillWaiting = KNI_TRUE; break; } else { /* waiting for sms_send_completed event */ midp_thread_wait(WMA_SMS_WRITE_SIGNAL, handle, NULL); } #endif } } while (0); if (!stillWaiting) { pcsl_mem_free(pMessageBuffer); pcsl_mem_free(pAddress); } } KNI_EndHandles(); KNI_ReturnInt(0); /* currently ignored. */ }
/** * Reads information about the installed midlet suite's components * from the storage. * * @param suiteId unique ID of the suite * @param ci array of ComponentInfo objects to fill with the information * about the installed midlet suite's components * * @exception IOException if an the information cannot be read * @exception IllegalArgumentException if suiteId is invalid or ci is null */ KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(com_sun_midp_midletsuite_DynamicComponentStorage_getSuiteComponentsList) { SuiteIdType suiteId; int numberOfComponents = 0, arraySize; MidletSuiteData *pData = g_pSuitesData; KNI_StartHandles(4); KNI_DeclareHandle(components); KNI_DeclareHandle(componentObj); KNI_DeclareHandle(componentObjClass); KNI_DeclareHandle(tmpHandle); suiteId = KNI_GetParameterAsInt(1); KNI_GetParameterAsObject(2, components); arraySize = (int)KNI_GetArrayLength(components); do { if (arraySize <= 0) { break; } while (pData) { if (pData->suiteId == suiteId && pData->type == COMPONENT_DYNAMIC) { KNI_GetObjectArrayElement(components, (jint)numberOfComponents, componentObj); KNI_GetObjectClass(componentObj, componentObjClass); KNI_RESTORE_INT_FIELD(componentObj, componentObjClass, "componentId", (jint)pData->componentId); KNI_RESTORE_INT_FIELD(componentObj, componentObjClass, "suiteId", (jint)suiteId); KNI_RESTORE_BOOLEAN_FIELD(componentObj, componentObjClass, "trusted", pData->isTrusted); KNI_RESTORE_PCSL_STRING_FIELD(componentObj, componentObjClass, "displayName", &(pData->varSuiteData.displayName), tmpHandle); KNI_RESTORE_PCSL_STRING_FIELD(componentObj, componentObjClass, "version", &(pData->varSuiteData.suiteVersion), tmpHandle); numberOfComponents++; if (numberOfComponents == arraySize) { /* IMPL_NOTE: log an error! */ break; } } pData = pData->nextEntry; } } while (0); KNI_EndHandles(); KNI_ReturnVoid(); }