javacommons/comms/src/commsendpointnative.cpp
branchRCL_3
changeset 19 04becd199f91
child 87 1627c337e51e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/comms/src/commsendpointnative.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,288 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Comms java to native method call implementations
+*
+*/
+
+#include <sstream>
+#include <errno.h>
+
+#include "logger.h"
+#include "javajniutils.h"
+#include "javacommonutils.h"
+
+#include "com_nokia_mj_impl_comms_CommsEndpoint.h"
+#include "com_nokia_mj_impl_comms_CommsEndpointBase.h"
+#include "com_nokia_mj_impl_comms_CommsServerEndpoint.h"
+#include "commsclientendpoint.h"
+#include "commsserverendpoint.h"
+#include "commsmessage.h"
+#include "commscontext.h"
+
+using namespace java::comms;
+using namespace java::util;
+
+// CommsEndpointBase methods
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsEndpointBase__1registerlistener(
+    JNIEnv* aEnv,
+    jobject,
+    jint aHandle,
+    jint aModuleId,
+    jobject aListener)
+{
+    JELOG2(EJavaComms);
+    CommsEndpoint* endpoint = reinterpret_cast<CommsEndpoint*>(aHandle);
+    return endpoint->registerJavaListener(aModuleId, aListener, aEnv);
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsEndpointBase__1unregisterlistener(
+    JNIEnv* aEnv,
+    jobject,
+    jint aHandle,
+    jint aModuleId)
+{
+    JELOG2(EJavaComms);
+    CommsEndpoint* endpoint = reinterpret_cast<CommsEndpoint*>(aHandle);
+    return endpoint->unregisterJavaListener(aModuleId, 0, aEnv);
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsEndpointBase__1send(
+    JNIEnv* aEnv,
+    jobject,
+    jint aHandle,
+    jbyteArray aArray)
+{
+    JELOG2(EJavaComms);
+    int len = aEnv->GetArrayLength(aArray);
+
+    char* buf = new char[len];
+    aEnv->GetByteArrayRegion(aArray, 0, len, (jbyte*)buf);
+    ipcMessage_t* msg = reinterpret_cast<ipcMessage_t*>(buf);
+    msg->ipcHeader.length = len;
+    CommsMessage message(msg);
+    delete[] buf;
+
+    CommsEndpoint* endpoint = reinterpret_cast<CommsEndpoint*>(aHandle);
+    return endpoint->send(message);
+}
+
+
+JNIEXPORT jbyteArray JNICALL Java_com_nokia_mj_impl_comms_CommsEndpointBase__1sendreceive(
+    JNIEnv* aEnv,
+    jobject,
+    jint aHandle,
+    jbyteArray aArray,
+    jint aTimeout)
+{
+    JELOG2(EJavaComms);
+    int len = aEnv->GetArrayLength(aArray);
+
+    char* buf = new char[len];
+    aEnv->GetByteArrayRegion(aArray, 0, len, (jbyte*)buf);
+    ipcMessage_t* msg = reinterpret_cast<ipcMessage_t*>(buf);
+    msg->ipcHeader.length = len;
+    CommsMessage message(msg);
+    delete[] buf;
+
+    CommsEndpoint* endpoint = reinterpret_cast<CommsEndpoint*>(aHandle);
+    if (endpoint)
+    {
+        CommsMessage receivedMessage;
+
+        int rc = endpoint->sendReceive(message, receivedMessage, aTimeout);
+        if (!rc)
+        {
+            char* arr = receivedMessage.toByteArray();
+            int len = (reinterpret_cast<ipcMessage_t*>(arr))->ipcHeader.length;
+            jbyteArray bytes = aEnv->NewByteArray(len);
+            aEnv->SetByteArrayRegion(bytes, 0, len, (jbyte*)arr);
+            return bytes;
+        }
+        else
+        {
+            ELOG1(EJavaComms, "Java_com_nokia_mj_impl_comms_CommsEndpointBase__1sendreceive() failed (%d)", rc);
+            std::stringstream msg;
+            msg << "CommsEndpoint.sendReceive() failed, error code=" << rc;
+
+            if (rc == ETIMEDOUT || rc == EINTR)
+            {
+                JniUtils::throwNewException(aEnv,"java/lang/InterruptedException", msg.str());
+            }
+            else
+            {
+                JniUtils::throwNewException(aEnv,"java/io/IOException", msg.str());
+            }
+        }
+    }
+
+    return 0;
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsEndpointBase__1registerdefaultlistener(
+    JNIEnv* aEnv,
+    jobject,
+    jint aHandle,
+    jobject aListener)
+{
+    JELOG2(EJavaComms);
+    CommsEndpoint* endpoint = reinterpret_cast<CommsEndpoint*>(aHandle);
+    return endpoint->registerDefaultJavaListener(aListener, aEnv);
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsEndpointBase__1unregisterdefaultlistener(
+    JNIEnv* aEnv,
+    jobject,
+    jint aHandle)
+{
+    JELOG2(EJavaComms);
+    CommsEndpoint* endpoint = reinterpret_cast<CommsEndpoint*>(aHandle);
+    return endpoint->unregisterDefaultJavaListener(0, aEnv);
+}
+
+JNIEXPORT void JNICALL Java_com_nokia_mj_impl_comms_CommsEndpointBase__1release(
+    JNIEnv*,
+    jobject,
+    jint aHandle)
+{
+    JELOG2(EJavaComms);
+    CommsEndpoint* endpoint = reinterpret_cast<CommsEndpoint*>(aHandle);
+    delete endpoint;
+}
+
+JNIEXPORT void JNICALL Java_com_nokia_mj_impl_comms_CommsEndpointBase__1detach(
+    JNIEnv*,
+    jobject,
+    jint aHandle)
+{
+    JELOG2(EJavaComms);
+    CommsEndpoint* endpoint = reinterpret_cast<CommsEndpoint*>(aHandle);
+    endpoint->detachFromVm();
+}
+
+// CommsEndpoint methods
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsEndpoint__1create(
+    JNIEnv* aEnv,
+    jobject)
+{
+    JELOG2(EJavaComms);
+    CommsClientEndpoint* client = new CommsClientEndpoint();
+    client->attachToVm(aEnv);
+    return (jint)client;
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsEndpoint__1find(
+    JNIEnv* aEnv,
+    jclass,
+    jstring aName)
+{
+    JELOG2(EJavaComms);
+    std::wstring name = JniUtils::jstringToWstring(aEnv, aName);
+    CommsClientEndpoint* endpoint = CommsContext::getContext().find(name);
+
+    jint rc = 0;
+    if (endpoint)
+    {
+        endpoint->attachToVm(aEnv);
+        rc = (jint)endpoint;
+    }
+    else
+    {
+        WLOG1WSTR(EJavaComms, "Find client endpoint failed, no such endpoint=%s", name);
+    }
+    return rc;
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsEndpoint__1connect(
+    JNIEnv* aEnv,
+    jobject,
+    jint aHandle,
+    jint aAddress)
+{
+    JELOG2(EJavaComms);
+    CommsClientEndpoint* client = reinterpret_cast<CommsClientEndpoint*>(aHandle);
+    client->attachToVm(aEnv);
+    jint rc =client->connect(aAddress);
+    return rc;
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsEndpoint__1disconnect(
+    JNIEnv*,
+    jobject,
+    jint aHandle)
+{
+    JELOG2(EJavaComms);
+    CommsClientEndpoint* client = reinterpret_cast<CommsClientEndpoint*>(aHandle);
+    jint rc = client->disconnect();
+    return rc;
+}
+
+// CommsServerEndpoint methods
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsServerEndpoint__1create(
+    JNIEnv* aEnv,
+    jobject)
+{
+    JELOG2(EJavaComms);
+    CommsServerEndpoint* server = new CommsServerEndpoint();
+    server->attachToVm(aEnv);
+    return (jint)server;
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsServerEndpoint__1find(
+    JNIEnv* aEnv,
+    jclass,
+    jstring aName)
+{
+    JELOG2(EJavaComms);
+    std::wstring name = JniUtils::jstringToWstring(aEnv, aName);
+    CommsServerEndpoint* server = CommsContext::getContext().findServer(name);
+    jint rc = 0;
+    if (server)
+    {
+        server->attachToVm(aEnv);
+        rc = (jint)server;
+    }
+    else
+    {
+        WLOG1WSTR(EJavaComms, "Find server endpoint failed, no such endpoint=%s", name);
+    }
+    return rc;
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsServerEndpoint__1start(
+    JNIEnv* aEnv,
+    jobject,
+    jint aHandle,
+    jint aAddress)
+{
+    JELOG2(EJavaComms);
+    CommsServerEndpoint* server = reinterpret_cast<CommsServerEndpoint*>(aHandle);
+    server->attachToVm(aEnv);
+    jint rc = server->start(aAddress);
+    return rc;
+}
+
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_comms_CommsServerEndpoint__1stop(
+    JNIEnv*,
+    jobject,
+    jint aHandle)
+{
+    JELOG2(EJavaComms);
+    CommsServerEndpoint* server = reinterpret_cast<CommsServerEndpoint*>(aHandle);
+    jint rc = server->stop();
+    return rc;
+}
+