KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(KNITest_testGetSetStaticDoubleField) { jdouble x = KNI_GetParameterAsDouble(1); jdouble y; jfieldID typeFieldID; KNI_StartHandles(1); KNI_DeclareHandle(clazz); KNI_GetClassPointer(clazz); typeFieldID = KNI_GetStaticFieldID(clazz, "d", "D"); y = KNI_GetStaticDoubleField(clazz, typeFieldID); KNI_SetStaticDoubleField(clazz, typeFieldID, x*y); KNI_EndHandles(); KNI_ReturnVoid(); }
/* * Native finalizer. * Releases all native resources used by this connection. */ KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(com_sun_jsr082_bluetooth_btspp_BTSPPConnectionImpl_finalize) { javacall_handle handle; int status = JAVACALL_FAIL; REPORT_INFO(LC_PROTOCOL, "btspp::finalize"); KNI_StartHandles(2); KNI_DeclareHandle(thisHandle); KNI_DeclareHandle(classHandle); KNI_GetThisPointer(thisHandle); KNI_GetClassPointer(classHandle); GET_FIELDID(classHandle, "handle", "I", connHandleID) handle = (javacall_handle)KNI_GetIntField(thisHandle, connHandleID); if (handle != JAVACALL_BT_INVALID_HANDLE) { status = javacall_bt_rfcomm_close(handle); KNI_SetIntField(thisHandle, connHandleID, (jint)JAVACALL_BT_INVALID_HANDLE); // Need revisit: add resource counting /* if (midpDecResourceCount(RSC_TYPE_BT_CLI, 1) == 0) { REPORT_INFO(LC_PROTOCOL, "Resource limit update error"); } */ if (status == JAVACALL_FAIL) { char* pError; javacall_bt_rfcomm_get_error(handle, &pError); JAVAME_SNPRINTF(gBtBuffer, BT_BUFFER_SIZE, "IO error in btspp::finalize (%s)\n", pError); REPORT_ERROR(LC_PROTOCOL, gBtBuffer); } else if (status == JAVACALL_WOULD_BLOCK) { /* blocking during finalize is not supported */ REPORT_ERROR1(LC_PROTOCOL, "btspp::finalize blocked, handle= %d\n", handle); } } // Need revisit: add bluetooth activity indicator /* FINISH_BT_INDICATOR; */ REPORT_INFO(LC_PROTOCOL, "btspp::finalize done!"); KNI_EndHandles(); KNI_ReturnVoid(); }
/* * Native static class initializer. */ KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(com_sun_jsr082_bluetooth_btspp_BTSPPConnectionImpl_initialize) { REPORT_INFO(LC_PROTOCOL, "btspp::initialize"); KNI_StartHandles(1); KNI_DeclareHandle(classHandle); KNI_GetClassPointer(classHandle); GET_FIELDID(classHandle, "handle", "I", connHandleID) GET_FIELDID(classHandle, "remoteDeviceAddress", "[B", remoteAddrID) REPORT_INFO(LC_PROTOCOL, "btspp::initialize done!"); KNI_EndHandles(); KNI_ReturnVoid(); }
/* * Checks out (takes ownership of) an active server connection maintained * by push subsystem. * * @param url URL used during registration of the push entry * @param suiteId suite id * @return true if the operation succeeds, false otherwise */ KNIEXPORT KNI_RETURNTYPE_BOOLEAN Java_com_sun_jsr082_bluetooth_btl2cap_L2CAPNotifierImpl_pushCheckout(void) { jboolean retval = KNI_FALSE; SuiteIdType suiteId; MidpString wsUrl; char *szUrl; bt_port_t port; jfieldID notifHandleID = NULL; jfieldID pushHandleID = NULL; KNI_StartHandles(3); KNI_DeclareHandle(thisHandle); KNI_DeclareHandle(urlHandle); KNI_DeclareHandle(classHandle); KNI_GetThisPointer(thisHandle); KNI_GetClassPointer(classHandle); GET_FIELDID(classHandle, "handle", "I", notifHandleID) GET_FIELDID(classHandle, "pushHandle", "I", pushHandleID) KNI_GetParameterAsObject(1, urlHandle); suiteId = KNI_GetParameterAsInt(2); wsUrl = midpNewString(urlHandle); szUrl = midpJcharsToChars(wsUrl); if (bt_push_parse_url(szUrl, &port, NULL) == JAVACALL_OK) { if (pushcheckout(szUrl, 0, (char*)midp_suiteid2chars(suiteId)) == -2) { KNI_ThrowNew(midpIOException, "Port already in use."); } else { javacall_handle handle; bt_pushid_t pushid = bt_push_checkout_server(&port, &handle, NULL); if (pushid != BT_INVALID_PUSH_HANDLE) { KNI_SetIntField(thisHandle, pushHandleID, (jint)pushid); KNI_SetIntField(thisHandle, notifHandleID, (jint)handle); retval = KNI_TRUE; } } } midpFree(szUrl); MIDP_FREE_STRING(wsUrl); KNI_EndHandles(); KNI_ReturnBoolean(retval); }
/** * Native static class initializer. */ KNIEXPORT KNI_RETURNTYPE_VOID Java_com_sun_midp_io_j2me_btl2cap_L2CAPNotifierImpl_initialize(void) { REPORT_INFO(LC_PROTOCOL, "btl2cap_notif::initialize"); KNI_StartHandles(1); KNI_DeclareHandle(classHandle); KNI_GetClassPointer(classHandle); GET_FIELDID(classHandle, "handle", "I", notifHandleID) GET_FIELDID(classHandle, "peerHandle", "I", peerHandleID) GET_FIELDID(classHandle, "peerAddress", "[B", peerAddrID) GET_FIELDID(classHandle, "pushHandle", "I", pushHandleID) REPORT_INFO(LC_PROTOCOL, "btl2cap_notif::initialize done!"); KNI_EndHandles(); KNI_ReturnVoid(); }
/* JAVADOC COMMENT ELIDED */ KNIEXPORT KNI_RETURNTYPE_VOID Java_com_sun_j2me_location_LocationProviderInfo_initNativeClass() { KNI_StartHandles(1); KNI_DeclareHandle(class_obj); KNI_GetClassPointer(class_obj); if(!KNI_IsNullHandle(class_obj)) { locationProviderInfoFieldID.incurCost = KNI_GetFieldID(class_obj,"incurCost","Z"); locationProviderInfoFieldID.canReportAltitude = KNI_GetFieldID(class_obj,"canReportAltitude","Z"); locationProviderInfoFieldID.canReportAddressInfo = KNI_GetFieldID(class_obj,"canReportAddressInfo","Z"); locationProviderInfoFieldID.canReportSpeedCource = KNI_GetFieldID(class_obj,"canReportSpeedCource","Z"); locationProviderInfoFieldID.powerConsumption = KNI_GetFieldID(class_obj,"powerConsumption","I"); locationProviderInfoFieldID.horizontalAccuracy = KNI_GetFieldID(class_obj,"horizontalAccuracy","I"); locationProviderInfoFieldID.verticalAccuracy = KNI_GetFieldID(class_obj,"verticalAccuracy","I"); locationProviderInfoFieldID.defaultTimeout = KNI_GetFieldID(class_obj,"defaultTimeout","I"); locationProviderInfoFieldID.defaultMaxAge = KNI_GetFieldID(class_obj,"defaultMaxAge","I"); locationProviderInfoFieldID.defaultInterval = KNI_GetFieldID(class_obj,"defaultInterval","I"); locationProviderInfoFieldID.averageResponseTime = KNI_GetFieldID(class_obj,"averageResponseTime","I"); locationProviderInfoFieldID.defaultStateInterval = KNI_GetFieldID(class_obj,"defaultStateInterval","I"); } else { KNI_ThrowNew(midpNullPointerException, NULL); } KNI_EndHandles(); KNI_ReturnVoid(); }
KNIEXPORT KNI_RETURNTYPE_VOID Java_com_sun_midp_jsr82emul_EmulationPolling_getRequest() { static jfieldID bufID = 0; static jfieldID lengthID = 0; int len = emul_data.req_offset > 512? 512 : emul_data.req_offset; KNI_StartHandles(3); KNI_DeclareHandle(thisHandle); KNI_DeclareHandle(classHandle); KNI_DeclareHandle(bufHandle); if (bufID == 0) { KNI_GetClassPointer(classHandle); bufID = KNI_GetFieldID(classHandle, "requestBuf", "[B"); lengthID = KNI_GetFieldID(classHandle, "length", "I"); } KNI_GetThisPointer(thisHandle); KNI_SetIntField(thisHandle, lengthID, (jint)len); if (emul_data.req_offset > 0) { LOG1("EmulationPolling_getRequest(): getting %d request bytes", emul_data.req_offset); KNI_GetObjectField(thisHandle, bufID, bufHandle); memcpy(JavaByteArray(bufHandle), emul_data.request, len); if (len < emul_data.req_offset) { emul_data.req_offset -= len; memmove(emul_data.request, &emul_data.request[len], emul_data.req_offset); } else { emul_data.req_offset = 0; } } KNI_EndHandles(); KNI_ReturnVoid(); }
/** * Stores the romized byte array in corresponding Java array * @param the required resource (initialFont or defaultFont) * */ KNIEXPORT KNI_RETURNTYPE_VOID Java_com_sun_perseus_platform_ResourceHandler_getRomizedResource() { jbyte *font_data; int font_type = -1; int buflen = -1; int size = -1; KNI_StartHandles(2); KNI_DeclareHandle(clazz); KNI_DeclareHandle(bufHandle); KNI_GetClassPointer(clazz); font_type = KNI_GetParameterAsInt(1); if (font_type == DEFAULT_FONT) { KNI_GetStaticObjectField(clazz, KNI_GetStaticFieldID(clazz, "defaultFont", "[B"), bufHandle); size = sizeof(defaultFont); font_data = defaultFont; } else { KNI_GetStaticObjectField(clazz, KNI_GetStaticFieldID(clazz, "initialFont", "[B"), bufHandle); size = sizeof(initialFont); font_data = initialFont; } if (KNI_IsNullHandle(bufHandle)) { KNI_ThrowNew(midpNullPointerException, 0); } else { buflen = KNI_GetArrayLength(bufHandle); if (buflen < size) { //REPORT_ERROR(LC_HIGHUI, "java array too small"); KNI_ThrowNew(midpArrayIndexOutOfBoundsException, 0); } else { KNI_SetRawArrayRegion(bufHandle, 0, size, (jbyte*)font_data); } } KNI_EndHandles(); KNI_ReturnVoid(); }
/* JAVADOC COMMENT ELIDED */ KNIEXPORT KNI_RETURNTYPE_VOID Java_com_sun_j2me_location_LocationInfo_initNativeClass() { KNI_StartHandles(1); KNI_DeclareHandle(class_obj); KNI_GetClassPointer(class_obj); if(!KNI_IsNullHandle(class_obj)) { locationInfoFieldID.isValid = KNI_GetFieldID(class_obj, "isValid", "Z"); locationInfoFieldID.timestamp = KNI_GetFieldID(class_obj, "timestamp", "J"); locationInfoFieldID.latitude = KNI_GetFieldID(class_obj, "latitude", "D"); locationInfoFieldID.longitude = KNI_GetFieldID(class_obj, "longitude", "D"); locationInfoFieldID.altitude = KNI_GetFieldID(class_obj, "altitude", "F"); locationInfoFieldID.horizontalAccuracy = KNI_GetFieldID(class_obj, "horizontalAccuracy", "F"); locationInfoFieldID.verticalAccuracy = KNI_GetFieldID(class_obj, "verticalAccuracy", "F"); locationInfoFieldID.speed = KNI_GetFieldID(class_obj, "speed", "F"); locationInfoFieldID.course = KNI_GetFieldID(class_obj, "course", "F"); locationInfoFieldID.method = KNI_GetFieldID(class_obj, "method", "I"); locationInfoFieldID.isAddressInfo = KNI_GetFieldID(class_obj, "isAddressInfo", "Z"); locationInfoFieldID.AddressInfo_EXTENSION = KNI_GetFieldID(class_obj, "AddressInfo_EXTENSION", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_STREET = KNI_GetFieldID(class_obj, "AddressInfo_STREET", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_POSTAL_CODE = KNI_GetFieldID(class_obj, "AddressInfo_POSTAL_CODE", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_CITY = KNI_GetFieldID(class_obj, "AddressInfo_CITY", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_COUNTY = KNI_GetFieldID(class_obj, "AddressInfo_COUNTY", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_STATE = KNI_GetFieldID(class_obj, "AddressInfo_STATE", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_COUNTRY = KNI_GetFieldID(class_obj, "AddressInfo_COUNTRY", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_COUNTRY_CODE = KNI_GetFieldID(class_obj, "AddressInfo_COUNTRY_CODE", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_DISTRICT = KNI_GetFieldID(class_obj, "AddressInfo_DISTRICT", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_BUILDING_NAME = KNI_GetFieldID(class_obj, "AddressInfo_BUILDING_NAME", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_BUILDING_FLOOR = KNI_GetFieldID(class_obj, "AddressInfo_BUILDING_FLOOR", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_BUILDING_ROOM = KNI_GetFieldID(class_obj, "AddressInfo_BUILDING_ROOM", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_BUILDING_ZONE = KNI_GetFieldID(class_obj, "AddressInfo_BUILDING_ZONE", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_CROSSING1 = KNI_GetFieldID(class_obj, "AddressInfo_CROSSING1", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_CROSSING2 = KNI_GetFieldID(class_obj, "AddressInfo_CROSSING2", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_URL = KNI_GetFieldID(class_obj, "AddressInfo_URL", "Ljava/lang/String;"); locationInfoFieldID.AddressInfo_PHONE_NUMBER = KNI_GetFieldID(class_obj, "AddressInfo_PHONE_NUMBER", "Ljava/lang/String;"); locationInfoFieldID.extraInfoNMEA = KNI_GetFieldID(class_obj, "extraInfoNMEA", "Ljava/lang/String;"); locationInfoFieldID.extraInfoLIF = KNI_GetFieldID(class_obj, "extraInfoLIF", "Ljava/lang/String;"); locationInfoFieldID.extraInfoPlain = KNI_GetFieldID(class_obj, "extraInfoPlain", "Ljava/lang/String;"); locationInfoFieldID.extraInfoOther = KNI_GetFieldID(class_obj, "extraInfoOther", "Ljava/lang/String;"); locationInfoFieldID.extraInfoOtherMIMEType = KNI_GetFieldID(class_obj, "extraInfoOtherMIMEType", "Ljava/lang/String;"); } else { KNI_ThrowNew(midpNullPointerException, NULL); } KNI_EndHandles(); KNI_ReturnVoid(); }
/* * Accepts incoming client connection request. * * Note: the method gets native connection handle directly from * <code>handle<code> field of <code>BTSPPNotifierImpl</code> object. * * Note: new native connection handle to work with accepted incoming * client connection is setted directly to <code>handle</code> field of * appropriate <code>RFCOMMConnectionImpl</code> object. * * @throws IOException if an I/O error occurs */ KNIEXPORT KNI_RETURNTYPE_VOID Java_com_sun_jsr082_bluetooth_btspp_BTSPPNotifierImpl_accept0(void) { javacall_handle handle = JAVACALL_BT_INVALID_HANDLE; javacall_handle peer_handle = JAVACALL_BT_INVALID_HANDLE; MidpReentryData* info; int status = JAVACALL_FAIL; int processStatus = KNI_FALSE; void *context = NULL; javacall_bt_address peer_addr; jfieldID notifHandleID = NULL; jfieldID peerHandleID = NULL; jfieldID peerAddrID = NULL; jfieldID pushHandleID = NULL; KNI_StartHandles(3); KNI_DeclareHandle(thisHandle); KNI_DeclareHandle(arrayHandle); KNI_DeclareHandle(classHandle); KNI_GetClassPointer(classHandle); GET_FIELDID(classHandle, "handle", "I", notifHandleID) GET_FIELDID(classHandle, "peerHandle", "I", peerHandleID) GET_FIELDID(classHandle, "peerAddress", "[B", peerAddrID) GET_FIELDID(classHandle, "pushHandle", "I", pushHandleID) KNI_GetThisPointer(thisHandle); handle = (javacall_handle)KNI_GetIntField(thisHandle, notifHandleID); KNI_GetObjectField(thisHandle, peerAddrID, arrayHandle); if (handle == JAVACALL_BT_INVALID_HANDLE) { REPORT_ERROR(LC_PROTOCOL, "RFCOMM notifier was closed before btspp_notif::accept"); KNI_ThrowNew(midpInterruptedIOException, EXCEPTION_MSG( "RFCOMM notifier was closed")); } else { #ifndef NO_PUSH bt_pushid_t pushid = KNI_GetIntField(thisHandle, pushHandleID); if (pushid != BT_INVALID_PUSH_HANDLE) { if (bt_push_checkout_client(pushid, &peer_handle, peer_addr, NULL, NULL) == JAVACALL_OK) { pushcheckoutaccept((int)handle); processStatus = KNI_TRUE; status = JAVACALL_OK; } } #endif if (peer_handle == JAVACALL_BT_INVALID_HANDLE) { info = (MidpReentryData*)SNI_GetReentryData(NULL); if (info == NULL) { /* First invocation */ REPORT_INFO1(LC_PROTOCOL, "btspp_notif::accept handle=%d\n", handle); // Need revisit: add resource counting /* * An incoming socket connection counts against the client socket * resource limit. */ /* if (midpCheckResourceLimit(RSC_TYPE_BT_CLI, 1) == 0) { const char* pMsg = "Resource limit exceeded for BT client sockets"; REPORT_INFO(LC_PROTOCOL, pMsg); KNI_ThrowNew(midpIOException, EXCEPTION_MSG(pMsg)); */ // } else { status = javacall_bt_rfcomm_accept( handle, &peer_handle, &peer_addr); processStatus = KNI_TRUE; // } } else { /* Reinvocation after unblocking the thread */ if ((javacall_handle)info->descriptor != handle) { midp_snprintf(gKNIBuffer, KNI_BUFFER_SIZE, "btspp_notif::accept handles mismatched %d != %d\n", handle, info->descriptor); REPORT_CRIT(LC_PROTOCOL, gKNIBuffer); KNI_ThrowNew(midpIllegalStateException, EXCEPTION_MSG( "Internal error in btspp_notif::accept")); } else { // Need revisit: add resource counting /* if (midpCheckResourceLimit(RSC_TYPE_BT_CLI, 1) == 0) { const char* pMsg = "Resource limit exceeded for BT client sockets" REPORT_INFO(LC_PROTOCOL, pMsg); KNI_ThrowNew(midpIOException, EXCEPTION_MSG(pMsg)); } else { */ context = info->pResult; status = javacall_bt_rfcomm_accept( handle, &peer_handle, &peer_addr); processStatus = KNI_TRUE; // } } } } if (processStatus) { REPORT_INFO1(LC_PROTOCOL, "btspp_notif::accept server handle=%d\n", handle); if (status == JAVACALL_OK) { // Need revisit: add resource counting /* if (midpIncResourceCount(RSC_TYPE_BT_CLI, 1) == 0) { REPORT_INFO(LC_PROTOCOL, "btspp_notif: Resource limit update error"); } */ // store client native connection handle for temporary storing KNI_SetIntField(thisHandle, peerHandleID, (jint)peer_handle); // copy address to Java object field KNI_SetRawArrayRegion(arrayHandle, 0, JAVACALL_BT_ADDRESS_SIZE, (jbyte*) peer_addr); REPORT_INFO(LC_PROTOCOL, "btspp_notif::accept incoming connection accepted!"); } else if (status == JAVACALL_WOULD_BLOCK) { midp_thread_wait(NETWORK_READ_SIGNAL, (int)handle, context); } else if (status == JAVACALL_FAIL) { char* pError; javacall_bt_rfcomm_get_error(handle, &pError); midp_snprintf(gKNIBuffer, KNI_BUFFER_SIZE, "IO error in btspp_notif::accept (%s)\n", pError); REPORT_INFO(LC_PROTOCOL, gKNIBuffer); KNI_ThrowNew(midpIOException, EXCEPTION_MSG(gKNIBuffer)); } else { char* pMsg = "Unknown error during btspp_notif::accept"; REPORT_INFO(LC_PROTOCOL, pMsg); KNI_ThrowNew(midpIOException, EXCEPTION_MSG(pMsg)); } } } KNI_EndHandles(); KNI_ReturnVoid(); }
KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(com_sun_midp_chameleon_skins_resources_LoadedSkinData_beginReadingSkinFile) { const unsigned char* skin_description = lfj_get_skin_description(); if (skin_description != NULL) { gsSkinFileDataStart = gsSkinFileDataPos = (unsigned char*)skin_description; gsSkinFileDataEnd = gsSkinFileDataStart + lfj_get_skin_description_size(); } else { char* errorStr = NULL; int fileHandle = -1; int fileSize; int bytesRead; jfieldID fid; KNI_StartHandles(2); KNI_DeclareHandle(classHandle); KNI_GetClassPointer(classHandle); fid = KNI_GetStaticFieldID(classHandle, "STRING_ENCODING_USASCII", "B"); STRING_ENCODING_USASCII = (unsigned char) KNI_GetStaticByteField(classHandle, fid); fid = KNI_GetStaticFieldID(classHandle, "STRING_ENCODING_UTF8", "B"); STRING_ENCODING_UTF8 = (unsigned char) KNI_GetStaticByteField(classHandle, fid); GET_PARAMETER_AS_PCSL_STRING(1, fileName); do { /* * Open skin file */ fileHandle = storage_open(&errorStr, &fileName, OPEN_READ); if (errorStr != NULL) { KNI_ThrowNew(midpIOException, errorStr); storageFreeError(errorStr); break; } /* * Obtain file size */ fileSize = storageSizeOf(&errorStr, fileHandle); if (errorStr != NULL) { KNI_ThrowNew(midpIOException, errorStr); storageFreeError(errorStr); break; } /* * Read whole file into heap memory */ gsSkinFileDataStart = (unsigned char*)midpMalloc(fileSize); if (gsSkinFileDataStart == NULL) { KNI_ThrowNew(midpOutOfMemoryError, NULL); break; } bytesRead = storageRead(&errorStr, fileHandle, (char*)gsSkinFileDataStart, fileSize); if (errorStr != NULL) { KNI_ThrowNew(midpIOException, errorStr); storageFreeError(errorStr); midpFree(gsSkinFileDataStart); gsSkinFileDataStart = NULL; break; } if (bytesRead != fileSize) { KNI_ThrowNew(midpIOException, "Failed to read whole file"); midpFree(gsSkinFileDataStart); gsSkinFileDataStart = NULL; break; } gsSkinFileDataPos = gsSkinFileDataStart; gsSkinFileDataEnd = gsSkinFileDataStart + fileSize; } while (0); RELEASE_PCSL_STRING_PARAMETER; /* * Close skin file */ if (fileHandle != -1) { storageClose(&errorStr, fileHandle); } KNI_EndHandles(); } KNI_ReturnVoid(); }
/* JAVADOC COMMENT ELIDED */ KNIEXPORT KNI_RETURNTYPE_VOID KNIDECL(com_sun_j2me_location_LandmarkImpl_initNativeClass) { KNI_StartHandles(1); KNI_DeclareHandle(class_obj); KNI_GetClassPointer(class_obj); if(!KNI_IsNullHandle(class_obj)) { landmarkImplFieldID.name = KNI_GetFieldID(class_obj, "name", "Ljava/lang/String;"); landmarkImplFieldID.description = KNI_GetFieldID(class_obj, "description", "Ljava/lang/String;"); landmarkImplFieldID.isCoordinates = KNI_GetFieldID(class_obj, "isCoordinates", "Z"); landmarkImplFieldID.latitude = KNI_GetFieldID(class_obj, "latitude", "D"); landmarkImplFieldID.longitude = KNI_GetFieldID(class_obj, "longitude", "D"); landmarkImplFieldID.altitude = KNI_GetFieldID(class_obj, "altitude", "F"); landmarkImplFieldID.horizontalAccuracy = KNI_GetFieldID(class_obj, "horizontalAccuracy", "F"); landmarkImplFieldID.verticalAccuracy = KNI_GetFieldID(class_obj, "verticalAccuracy", "F"); landmarkImplFieldID.isAddressInfo = KNI_GetFieldID(class_obj, "isAddressInfo", "Z"); landmarkImplFieldID.numAddressInfoFields = KNI_GetFieldID(class_obj, "numAddressInfoFields", "I"); landmarkImplFieldID.AddressInfo_EXTENSION = KNI_GetFieldID(class_obj, "AddressInfo_EXTENSION", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_STREET = KNI_GetFieldID(class_obj, "AddressInfo_STREET", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_POSTAL_CODE = KNI_GetFieldID(class_obj, "AddressInfo_POSTAL_CODE", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_CITY = KNI_GetFieldID(class_obj, "AddressInfo_CITY", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_COUNTY = KNI_GetFieldID(class_obj, "AddressInfo_COUNTY", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_STATE = KNI_GetFieldID(class_obj, "AddressInfo_STATE", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_COUNTRY = KNI_GetFieldID(class_obj, "AddressInfo_COUNTRY", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_COUNTRY_CODE = KNI_GetFieldID(class_obj, "AddressInfo_COUNTRY_CODE", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_DISTRICT = KNI_GetFieldID(class_obj, "AddressInfo_DISTRICT", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_BUILDING_NAME = KNI_GetFieldID(class_obj, "AddressInfo_BUILDING_NAME", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_BUILDING_FLOOR = KNI_GetFieldID(class_obj, "AddressInfo_BUILDING_FLOOR", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_BUILDING_ROOM = KNI_GetFieldID(class_obj, "AddressInfo_BUILDING_ROOM", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_BUILDING_ZONE = KNI_GetFieldID(class_obj, "AddressInfo_BUILDING_ZONE", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_CROSSING1 = KNI_GetFieldID(class_obj, "AddressInfo_CROSSING1", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_CROSSING2 = KNI_GetFieldID(class_obj, "AddressInfo_CROSSING2", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_URL = KNI_GetFieldID(class_obj, "AddressInfo_URL", "Ljava/lang/String;"); landmarkImplFieldID.AddressInfo_PHONE_NUMBER = KNI_GetFieldID(class_obj, "AddressInfo_PHONE_NUMBER", "Ljava/lang/String;"); } else { KNI_ThrowNew(jsropNullPointerException, NULL); } KNI_EndHandles(); KNI_ReturnVoid(); }
/* * Performs client connection establishment. * * Note: the method gets native connection handle directly from * <code>handle<code> field of <code>L2CAPConnectionImpl</code> object. * * @param addr bluetooth address of device to connect to * @param psm Protocol Service Multiplexor (PSM) value * @return Negotiated ReceiveMTU and TransmitMTU. * 16 high bits is ReceiveMTU, 16 low bits is TransmitMTU. * * @throws IOException if any I/O error occurs */ KNIEXPORT KNI_RETURNTYPE_INT Java_com_sun_jsr082_bluetooth_btl2cap_L2CAPConnectionImpl_connect0(void) { unsigned char *address = NULL; int psm = (int)KNI_GetParameterAsInt(2); javacall_handle handle = JAVACALL_BT_INVALID_HANDLE; int status, i, imtu, omtu, mtus; void* context = NULL; MidpReentryData* info; javacall_bt_address addr; jfieldID connHandleID = NULL; KNI_StartHandles(3); KNI_DeclareHandle(thisHandle); KNI_DeclareHandle(arrayHandle); KNI_DeclareHandle(classHandle); KNI_GetThisPointer(thisHandle); KNI_GetClassPointer(classHandle); GET_FIELDID(classHandle, "handle", "I", connHandleID) KNI_GetParameterAsObject(1, arrayHandle); handle = (javacall_handle)KNI_GetIntField(thisHandle, connHandleID); REPORT_INFO1(LC_PROTOCOL, "btl2cap::connect handle=%d", handle); /* copy address from Java input array */ SNI_BEGIN_RAW_POINTERS; address = JavaByteArray(arrayHandle); for (i = 0; i < JAVACALL_BT_ADDRESS_SIZE; i++) { addr[i] = address[i]; } SNI_END_RAW_POINTERS; info = (MidpReentryData*)SNI_GetReentryData(NULL); if (info == NULL) { /* First invocation */ // Need revisit: add resource counting /* * Verify that the resource is available well within limit as per * the policy in ResourceLimiter */ /* if (midpCheckResourceLimit(RSC_TYPE_BT_CLI, 1) == 0) { const char* pMsg = "Resource limit exceeded for BT client sockets"; REPORT_INFO(LC_PROTOCOL, pMsg); KNI_ThrowNew(midpIOException, EXCEPTION_MSG(pMsg)); } else { */ status = javacall_bt_l2cap_connect(handle, address, psm, &imtu, &omtu); if (status == JAVACALL_OK) { // Need revisit: add resource counting /* if (midpIncResourceCount(RSC_TYPE_BT_CLI, 1) == 0) { REPORT_INFO(LC_PROTOCOL, "Resource limit update error"); } */ } else if (status == JAVACALL_FAIL) { char* pError; javacall_bt_l2cap_get_error(handle, &pError); midp_snprintf(gKNIBuffer, KNI_BUFFER_SIZE, "IO error in btl2cap::connect (%s)\n", pError); REPORT_INFO(LC_PROTOCOL, gKNIBuffer); KNI_ThrowNew(midpIOException, EXCEPTION_MSG(gKNIBuffer)); } else if (status == JAVACALL_WOULD_BLOCK) { // Need revisit: add bluetooth activity indicator // INC_BT_INDICATOR; // Need revisit: add resource counting /* if (midpIncResourceCount(RSC_TYPE_BT_CLI, 1) == 0) { REPORT_INFO(LC_PROTOCOL, "Resource limit update error"); } */ REPORT_INFO1(LC_PROTOCOL, "btl2cap::connect is waiting for complete notify" ", handle = %d\n", handle); midp_thread_wait(NETWORK_WRITE_SIGNAL, (int)handle, context); } else { char* pMsg = "Unknown error during btl2cap::connect"; REPORT_INFO(LC_PROTOCOL, pMsg); KNI_ThrowNew(midpIOException, EXCEPTION_MSG(pMsg)); } // } } else { /* Reinvocation after unblocking the thread */ context = info->pResult; if ((javacall_handle)info->descriptor != handle) { REPORT_CRIT2(LC_PROTOCOL, "btl2cap::connect handles mismatched %d != %d\n", handle, (javacall_handle)info->descriptor); } status = javacall_bt_l2cap_connect(handle, address, psm, &imtu, &omtu); if (status == JAVACALL_OK) { // Need revisit: add bluetooth activity indicator // DEC_BT_INDICATOR; } else if (status == JAVACALL_WOULD_BLOCK) { midp_thread_wait(NETWORK_WRITE_SIGNAL, (int)handle, context); } else { char* pError; KNI_SetIntField(thisHandle, connHandleID, (jint)JAVACALL_BT_INVALID_HANDLE); // Need revisit: add bluetooth activity indicator // DEC_BT_INDICATOR; // Need revisit: add resource counting /* if (midpDecResourceCount(RSC_TYPE_BT_CLI, 1) == 0) { REPORT_INFO(LC_PROTOCOL, "Resource limit update error"); } */ javacall_bt_l2cap_get_error(handle, &pError); midp_snprintf(gKNIBuffer, KNI_BUFFER_SIZE, "Error in btl2cap::connect (%s)", pError); REPORT_INFO(LC_PROTOCOL, gKNIBuffer); KNI_ThrowNew(midpConnectionNotFoundException, EXCEPTION_MSG(gKNIBuffer)); } } mtus = (imtu << 16) & 0xFFFF0000; mtus |= omtu & 0xFFFF; KNI_EndHandles(); KNI_ReturnInt(mtus); }
/* * Reads data from a packet received via Bluetooth stack. * * Note: the method gets native connection handle directly from * <code>handle<code> field of <code>L2CAPConnectionImpl</code> object. * * @param buf the buffer to read to * @param offset he start offset in array <code>buf</code> * at which the data to be written * @param size the maximum number of bytes to read, * the rest of the packet is discarded. * @return total number of bytes read into the buffer or * <code>0</code> if a zero length packet is received * @throws IOException if an I/O error occurs */ KNIEXPORT KNI_RETURNTYPE_INT Java_com_sun_jsr082_bluetooth_btl2cap_L2CAPConnectionImpl_receive0(void) { int length, offset; javacall_handle handle; int bytesRead = -1; int status = JAVACALL_FAIL; void* context = NULL; MidpReentryData* info; jfieldID connHandleID = NULL; offset = (int)KNI_GetParameterAsInt(2); length = (int)KNI_GetParameterAsInt(3); KNI_StartHandles(3); KNI_DeclareHandle(arrayHandle); KNI_DeclareHandle(thisHandle); KNI_DeclareHandle(classHandle); KNI_GetThisPointer(thisHandle); KNI_GetClassPointer(classHandle); GET_FIELDID(classHandle, "handle", "I", connHandleID) handle = (javacall_handle)KNI_GetIntField(thisHandle, connHandleID); KNI_GetParameterAsObject(1, arrayHandle); REPORT_INFO3(LC_PROTOCOL, "btl2cap::receive off=%d len=%d handle=%d\n", offset, length, handle); info = (MidpReentryData*)SNI_GetReentryData(NULL); // Need revisit: add bluetooth activity indicator // START_BT_INDICATOR; if (info == NULL) { /* First invocation */ if (JAVACALL_BT_INVALID_HANDLE == handle) { KNI_ThrowNew(midpIOException, EXCEPTION_MSG( "Invalid handle during btl2cap::receive")); } else { // Need revisit: add bluetooth activity indicator // INC_BT_INDICATOR; SNI_BEGIN_RAW_POINTERS; status = javacall_bt_l2cap_receive(handle, (unsigned char*)&(JavaByteArray(arrayHandle)[offset]), length, &bytesRead); SNI_END_RAW_POINTERS; } } else { /* Reinvocation after unblocking the thread */ if (JAVACALL_BT_INVALID_HANDLE == handle) { /* closed by another thread */ KNI_ThrowNew(midpInterruptedIOException, EXCEPTION_MSG( "Interrupted IO error during btl2cap::receive")); // Need revisit: add bluetooth activity indicator // DEC_BT_INDICATOR; } else { if ((javacall_handle)info->descriptor != handle) { REPORT_CRIT2(LC_PROTOCOL, "btl2cap::receive handles mismatched %d != %d\n", handle, (javacall_handle)info->descriptor); } context = info->pResult; SNI_BEGIN_RAW_POINTERS; status = javacall_bt_l2cap_receive(handle, (unsigned char*)&(JavaByteArray(arrayHandle)[offset]), length, &bytesRead); SNI_END_RAW_POINTERS; } } REPORT_INFO1(LC_PROTOCOL, "btl2cap::receive bytes=%d\n", bytesRead); if (JAVACALL_BT_INVALID_HANDLE != handle) { if (status == JAVACALL_OK) { // Need revisit: add bluetooth activity indicator // DEC_BT_INDICATOR; } else { char* pError; javacall_bt_l2cap_get_error(handle, &pError); REPORT_INFO1(LC_PROTOCOL, "btl2cap::receive (%s)\n", pError); if (status == JAVACALL_WOULD_BLOCK) { midp_thread_wait(NETWORK_READ_SIGNAL, (int)handle, context); } else if (status == JAVACALL_INTERRUPTED) { char* pError; javacall_bt_l2cap_get_error(handle, &pError); midp_snprintf(gKNIBuffer, KNI_BUFFER_SIZE, "Interrupted IO error during btl2cap::receive (%s)", pError); KNI_ThrowNew(midpInterruptedIOException, EXCEPTION_MSG(gKNIBuffer)); // Need revisit: add bluetooth activity indicator // DEC_BT_INDICATOR; } else { char* pError; javacall_bt_l2cap_get_error(handle, &pError); midp_snprintf(gKNIBuffer, KNI_BUFFER_SIZE, "Unknown error during btl2cap::receive (%s)", pError); KNI_ThrowNew(midpIOException, EXCEPTION_MSG(gKNIBuffer)); // Need revisit: add bluetooth activity indicator // DEC_BT_INDICATOR; } } } // Need revisit: add bluetooth activity indicator // STOP_BT_INDICATOR; KNI_EndHandles(); KNI_ReturnInt((jint)bytesRead); }