/** * 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 {
/** * 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(); }
/** * Implementation of native method to queue a new Invocation. * The state of the InvocationImpl is copied to the heap * and inserted in the head of the invocation queue. * An StoredInvoc struct is allocated on the native heap and * the non-null strings for each field of the InvocationImpl class * are copied to the heap. * A new transaction ID is assigned to this Invocation * and returned in the tid field of the InvocationImpl. * @param invoc the InvocationImpl to store * @throws OutOfMemoryError if the memory allocation fails * @see StoredInvoc * @see #invocQueue */ KNIEXPORT KNI_RETURNTYPE_VOID Java_com_sun_midp_content_InvocationStore_put0(void) { StoredInvoc* invoc = NULL; KNI_StartHandles(4); KNI_DeclareHandle(invocObj); KNI_DeclareHandle(classObj); KNI_DeclareHandle(argsObj); KNI_DeclareHandle(str); KNI_GetParameterAsObject(1, invocObj); init(invocObj, classObj); do { /* On any error break out of this block */ /* Allocate a new zero'ed struct to save the values in */ invoc = (StoredInvoc*) pcsl_mem_calloc(1, sizeof (StoredInvoc)); if (invoc == NULL) { KNI_ThrowNew(midpOutOfMemoryError, "InvocationStore_put0 no memory for [invoc]"); break; } /* Assign a new transaction id and set it */ invoc->tid = invocNextTid(); KNI_SetIntField(invocObj, tidFid, invoc->tid); /* * Copy all the parameters to native * Includes ID, type,url, action, args, data */ if (KNI_TRUE != setParamsFromObj(invoc, invocObj, str, argsObj)) break; invoc->previousTid = KNI_GetIntField(invocObj, previousTidFid); invoc->status = KNI_GetIntField(invocObj, statusFid); invoc->responseRequired = KNI_GetBooleanField(invocObj, responseRequiredFid); invoc->suiteId = KNI_GetIntField(invocObj, suiteIdFid); KNI_GetObjectField(invocObj, classnameFid, str); if (PCSL_STRING_OK != midp_jstring_to_pcsl_string(str, &invoc->classname)) break; KNI_GetObjectField(invocObj, invokingAuthorityFid, str); if (PCSL_STRING_OK != midp_jstring_to_pcsl_string(str, &invoc->invokingAuthority)) break; KNI_GetObjectField(invocObj, invokingAppNameFid, str); if (PCSL_STRING_OK != midp_jstring_to_pcsl_string(str, &invoc->invokingAppName)) break; invoc->invokingSuiteId = KNI_GetIntField(invocObj, invokingSuiteIdFid); KNI_GetObjectField(invocObj, invokingClassnameFid, str); if (PCSL_STRING_OK != midp_jstring_to_pcsl_string(str, &invoc->invokingClassname)) break; KNI_GetObjectField(invocObj, invokingIDFid, str); if (PCSL_STRING_OK != midp_jstring_to_pcsl_string(str, &invoc->invokingID)) break; KNI_GetObjectField(invocObj, usernameFid, str); if (PCSL_STRING_OK != midp_jstring_to_pcsl_string(str, &invoc->username)) break; KNI_GetObjectField(invocObj, passwordFid, str); if (PCSL_STRING_OK != midp_jstring_to_pcsl_string(str, &invoc->password)) break; /* Insert the new Invocation at the end of the queue */ if (!invocPut(invoc)) break; unblockWaitingThreads(STATUS_OK); /* Clear to skip cleanup and throwing exception */ invoc = NULL; } while (0); if (invoc != NULL) { /* An allocation error occurred; free any remaining */ invocFree(invoc); KNI_ThrowNew(midpOutOfMemoryError, "invocStore.c allocation failed"); } KNI_EndHandles(); KNI_ReturnVoid(); }
/** * (Internal) Fill landmark structure from the Landmark Object. */ static jboolean fill_landmark(jobject landmarkObj, javacall_landmarkstore_landmark *landmark, jobject stringObj) { /* Fill javacall_landmarkstore_landmark structure */ /* landmark.name */ KNI_GetObjectField(landmarkObj, landmarkImplFieldID.name, stringObj); if (!KNI_IsNullHandle(stringObj) && KNI_GetStringLength(stringObj)<=JAVACALL_LANDMARKSTORE_MAX_LANDMARK_NAME) { if (JAVACALL_OK != jsrop_jstring_to_utf16(stringObj, landmark->name, JAVACALL_LANDMARKSTORE_MAX_LANDMARK_NAME)) { return KNI_FALSE; } } else { return KNI_FALSE; } /* landmark.description */ KNI_GetObjectField(landmarkObj, landmarkImplFieldID.description, stringObj); jsr179_jstring_to_utf16(stringObj, landmark->description, JAVACALL_LANDMARKSTORE_MAX_LANDMARK_DESCRIPTION); landmark->isValidCoordinate = KNI_GetBooleanField(landmarkObj, landmarkImplFieldID.isCoordinates); if (landmark->isValidCoordinate) { /* landmark.latitude */ landmark->latitude = KNI_GetDoubleField(landmarkObj, landmarkImplFieldID.latitude); /* landmark.longitude */ landmark->longitude = KNI_GetDoubleField(landmarkObj, landmarkImplFieldID.longitude); /* landmark.altitude */ landmark->altitude = KNI_GetFloatField(landmarkObj, landmarkImplFieldID.altitude); /* landmark.horizontalAccuracy */ landmark->horizontalAccuracy = KNI_GetFloatField(landmarkObj, landmarkImplFieldID.horizontalAccuracy); /* landmark.altitude */ landmark->verticalAccuracy = KNI_GetFloatField(landmarkObj, landmarkImplFieldID.verticalAccuracy); } /* AddressInfo */ landmark->addressInfoFieldNumber = KNI_GetIntField(landmarkObj, landmarkImplFieldID.numAddressInfoFields); if (landmark->addressInfoFieldNumber > 0) { jint counter = 0; /* AddressInfo_EXTENSION */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_EXTENSION, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_EXTENSION) == KNI_TRUE)) { counter++; } /* AddressInfo_STREET */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_STREET, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_STREET) == KNI_TRUE)) { counter++; } /* AddressInfo_POSTAL_CODE */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_POSTAL_CODE, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_POSTAL_CODE) == KNI_TRUE)) { counter++; } /* AddressInfo_CITY */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_CITY, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_CITY) == KNI_TRUE)) { counter++; } /* AddressInfo_COUNTY */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_COUNTY, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_COUNTY) == KNI_TRUE)) { counter++; } /* AddressInfo_STATE */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_STATE, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_STATE) == KNI_TRUE)) { counter++; } /* AddressInfo_COUNTRY */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_COUNTRY, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_COUNTRY) == KNI_TRUE)) { counter++; } /* AddressInfo_COUNTRY_CODE */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_COUNTRY_CODE, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_COUNTRY_CODE) == KNI_TRUE)) { counter++; } /* AddressInfo_DISTRICT */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_DISTRICT, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_DISTRICT) == KNI_TRUE)) { counter++; } /* AddressInfo_BUILDING_NAME */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_BUILDING_NAME, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_BUILDING_NAME) == KNI_TRUE)) { counter++; } /* AddressInfo_BUILDING_FLOOR */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_BUILDING_FLOOR, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_BUILDING_FLOOR) == KNI_TRUE)) { counter++; } /* AddressInfo_BUILDING_ROOM */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_BUILDING_ROOM, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_BUILDING_ROOM) == KNI_TRUE)) { counter++; } /* AddressInfo_BUILDING_ZONE */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_BUILDING_ZONE, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_BUILDING_ZONE) == KNI_TRUE)) { counter++; } /* AddressInfo_CROSSING1 */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_CROSSING1, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_CROSSING1) == KNI_TRUE)) { counter++; } /* AddressInfo_CROSSING2 */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_CROSSING2, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_CROSSING2) == KNI_TRUE)) { counter++; } /* AddressInfo_URL */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_URL, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_URL) == KNI_TRUE)) { counter++; } /* AddressInfo_PHONE_NUMBER */ if ((counter < landmark->addressInfoFieldNumber) && (fill_adressInfoField(landmarkObj, landmarkImplFieldID.AddressInfo_PHONE_NUMBER, stringObj, &landmark->fields[counter], JAVACALL_LOCATION_ADDRESSINFO_PHONE_NUMBER) == KNI_TRUE)) { counter++; } } return KNI_TRUE; }
/** * 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. */ }
/** * KNI function that creates native resource for the current StringItem. * <p> * Java declaration: * <pre> * createNativeResource0(ISIII[OII)I * </pre> * * @param ownerId Owner screen's native resource id (MidpDisplayable *) * @param label - label to be used for this ChoiceGroup * @param layout layout directive associated with this ChoiceGroup * @param choiceType - should be EXCLUSIVE, MULTIPLE, IMPLICIT, POPUP * @param fitPolicy - to be used to display created ChoiceGroup * @param cgElements - elements array with string, image, font, selected state * information per element * @param numChoices - number of elements in the ChoiceGroup * @param selectedIndex - currently selected index (for EXCLUSIVE, IMPLICIT, and * POPUP) * @return native resource id (MidpItem *) of this StringItem */ KNIEXPORT KNI_RETURNTYPE_INT Java_javax_microedition_lcdui_ChoiceGroupLFImpl_createNativeResource0() { MidpError err = KNI_OK; MidpDisplayable *ownerPtr = NULL; MidpItem *cgPtr = NULL; pcsl_string label_str; MidpChoiceGroupElement *cgChoices = NULL; int choiceType, layout; int fitPolicy; int numChoices = 0; int selectedIndex; int i = 0; pcsl_string_status perr; ownerPtr = (MidpDisplayable *)KNI_GetParameterAsInt(1); layout = KNI_GetParameterAsInt(3); choiceType = KNI_GetParameterAsInt(4); fitPolicy = KNI_GetParameterAsInt(5); numChoices = KNI_GetParameterAsInt(7); selectedIndex = KNI_GetParameterAsInt(8); KNI_StartHandles(8); KNI_DeclareHandle(labelJString); KNI_DeclareHandle(cgElementsJObject); KNI_DeclareHandle(cgElement); KNI_DeclareHandle(strJString); KNI_DeclareHandle(imgJImage); KNI_DeclareHandle(fontJFont); KNI_DeclareHandle(cgElementHandle); KNI_DeclareHandle(fontHandle); KNI_GetParameterAsObject(2, labelJString); KNI_GetParameterAsObject(6, cgElementsJObject); if (numChoices > 0) { jobjectArray cgElementsArray; KNI_FindClass("javax/microedition/lcdui/ChoiceGroup$CGElement", cgElementHandle); KNI_FindClass("javax/microedition/lcdui/Font", fontHandle); cgElementsArray = (jobjectArray)cgElementsJObject; cgChoices = (MidpChoiceGroupElement *) midpMalloc(sizeof(MidpChoiceGroupElement) * numChoices); if (cgChoices == NULL) { err = KNI_ENOMEM; } for (i = 0; err == KNI_OK && i < numChoices; i++) { KNI_GetObjectArrayElement(cgElementsArray, i, cgElement); KNI_GetObjectField(cgElement, _CACHE_FIELDID(cgElementHandle, "stringEl", "Ljava/lang/String;", _cgEl_stringEl_cache), strJString); perr = midp_jstring_to_pcsl_string(strJString, &cgChoices[i].string); if (PCSL_STRING_OK != perr) { err = KNI_ENOMEM; } else { KNI_GetObjectField(cgElement, _CACHE_FIELDID(cgElementHandle, "imageDataEl", "Ljavax/microedition/lcdui/ImageData;", _cgEl_imageDataEl_cache), imgJImage); if (KNI_IsNullHandle(imgJImage) == KNI_TRUE) { cgChoices[i].image = NULL; } else { cgChoices[i].image = gxp_get_imagedata(imgJImage); } cgChoices[i].selected = KNI_GetBooleanField(cgElement, _CACHE_FIELDID(cgElementHandle, "selected", "Z", _cgEl_selected_cache)); KNI_GetObjectField(cgElement, _CACHE_FIELDID(cgElementHandle, "fontEl", "Ljavax/microedition/lcdui/Font;", _cgEl_font_cache), fontJFont); if (KNI_IsNullHandle(fontJFont) == KNI_TRUE) { cgChoices[i].font = NULL; } else { int face, style, size; /* usually only few fonts are set */ face = KNI_GetIntField(fontJFont, _CACHE_FIELDID(fontHandle, "face", "I", _f_face_cache)); style = KNI_GetIntField(fontJFont, _CACHE_FIELDID(fontHandle, "style", "I", _f_style_cache)); size = KNI_GetIntField(fontJFont, _CACHE_FIELDID(fontHandle, "size", "I", _f_size_cache)); if ((err = lfpport_get_font(&(cgChoices[i].font), face, style, size)) != KNI_OK) { err = KNI_ENOMEM; i++; break; } } } } } if (err == KNI_OK) { if(PCSL_STRING_OK != midp_jstring_to_pcsl_string(labelJString, &label_str)) { err = KNI_ENOMEM; } } KNI_EndHandles(); if (err == KNI_OK) { cgPtr = MidpNewItem(ownerPtr, MIDP_EXCLUSIVE_CHOICE_GROUP_TYPE + choiceType - 1); if (cgPtr == NULL) { err = KNI_ENOMEM; } else { err = lfpport_choicegroup_create(cgPtr, ownerPtr, &label_str, layout, choiceType, cgChoices, numChoices, selectedIndex, fitPolicy); } } // do clean up pcsl_string_free(&label_str); for (i--; i >= 0; i--) { pcsl_string_free(&cgChoices[i].string); } midpFree(cgChoices); if (err != KNI_OK) { MidpDeleteItem(cgPtr); KNI_ThrowNew(midpOutOfMemoryError, NULL); } KNI_ReturnInt(cgPtr); }