javaextensions/wma/sms_cbs/src/smsconnection.cpp
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/wma/sms_cbs/src/smsconnection.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,191 @@
+/*
+* 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:
+ *
+*/
+
+
+#include "logger.h"
+#include "smsconnection.h"
+#include "smsserverconnectionfactory.h"
+#include "cbsserverconnectionfactory.h"
+
+using namespace java::push;
+namespace java
+{
+namespace wma
+{
+
+SmsConnection::SmsConnection(std::wstring aUri,bool aServerConnection)
+        :mError(0),
+        mUri(aUri),
+        mMessagesOnQueue(0),
+        mServerConnection(aServerConnection),
+        mReceiveOperation(aServerConnection),
+        mServerConn(0),
+        mMsgConn(0),
+        mMessageMonitor(0),
+        mServerConnectionFactory(0)
+{
+    JELOG2(EWMA);
+}
+
+void SmsConnection::initialize()
+{
+    JELOG2(EWMA);
+    mMsgConn = SmsPlatformService::getNewInstance(mUri);
+    if (mServerConnection)
+    {
+        //Get the factory instance based on the protocol
+        if (mUri.find(L"cbs://:") != std::wstring::npos)
+        {
+            mServerConnectionFactory =
+                &CbsServerConnectionFactory::getFactory();
+        }
+        else
+        {
+            mServerConnectionFactory =
+                &SmsServerConnectionFactory::getFactory();
+        }
+        mMessageMonitor = java::util::Monitor::createMonitor();
+        //Create the server connection
+        mServerConn = reinterpret_cast<ServerConnectionBase*>
+                      (mServerConnectionFactory->create(mUri));
+        mServerConn->open(this, true);
+    }
+}
+
+int SmsConnection ::numberOfDataSegments(const int aType,const int aLength,
+        const int aPort,const char* aHostAddress,const char* aData)
+{
+    JELOG2(EWMA);
+    return mMsgConn->getSmsDataSegments(aType, aLength, aPort,
+                                        aHostAddress, aData);
+}
+
+int SmsConnection :: send()
+{
+    JELOG2(EWMA);
+    return mMsgConn->send();
+}
+
+SmsConnection :: ~SmsConnection()
+{
+    JELOG2(EWMA);
+    close();
+    delete mMessageMonitor;
+    delete mMsgConn;
+}
+
+void SmsConnection :: close()
+{
+    JELOG2(EWMA);
+    if (mServerConnection)
+    {
+        mReceiveOperation = false;
+        if (0 != mMessageMonitor)
+        {
+            mMessageMonitor->notify();
+        }
+        if ((0 != mServerConnectionFactory) && (0 != mServerConn))
+        {
+            mServerConnectionFactory->releaseConnection(mUri);
+            mServerConnectionFactory = 0;
+            mServerConn = 0;
+        }
+    }
+}
+
+void SmsConnection :: msgArrived(const std::wstring&)
+{
+    JELOG2(EWMA);
+    mMessageMonitor->notify();
+}
+
+void SmsConnection :: error(const std::wstring& /*aUri*/,int aErrCode,
+                            const std::string& /*aErrText*/)
+{
+    JELOG2(EWMA);
+    ELOG1(EWMA,"WMA : Error Receiving Message : %d",aErrCode);
+    mError = aErrCode;
+    mMessageMonitor->notify();
+}
+
+void SmsConnection :: open(JNIEnv& aJni, jobject aPeer)
+{
+    JELOG2(EWMA);
+    int status = 0;
+    jclass sessionClass = aJni.FindClass(
+                              "com/nokia/mj/impl/sms/SMSConnectionImpl");
+    jmethodID MessageReceiveCallbackMethod = aJni.GetMethodID(sessionClass,
+            "messageReceiveCallback", "(II)I");
+    // Keeps notifying the java side about incoming messages till
+    // the connection is closed
+    while (mReceiveOperation && (0 == status))
+    {
+        //waits for the notification from server connection
+        mMessageMonitor->wait();
+        // check whether its a message notification or connection close
+        // notification
+        if (0 == mError && mReceiveOperation)
+        {
+            //Get no of messages available in store
+            int messagesOnStore = mServerConn->getMessagesOnStore();
+            //Calculate no of new messages to be notified to java
+            int newMessages = messagesOnStore - mMessagesOnQueue;
+            mMessagesOnQueue = messagesOnStore;
+            LOG1(EWMA, EInfo , "SMS : %d New messages to be notified", newMessages);
+            if (newMessages > 0)
+            {
+                status = aJni.CallIntMethod(aPeer,MessageReceiveCallbackMethod,
+                                            newMessages,0);
+            }
+        }
+        else if (0 != mError)
+        {
+            ELOG1(EWMA, "WMA : Error while receiving %d", mError);
+            //If there is an error report it to java
+            status = aJni.CallIntMethod(aPeer,MessageReceiveCallbackMethod,0,mError);
+            mError = 0;
+        }
+    }
+}
+
+int SmsConnection :: getMessageType()
+{
+    JELOG2(EWMA);
+    return mMsgConn->receivedMessageType(*mServerConn);
+}
+
+jlong SmsConnection :: getTimestamp()
+{
+    JELOG2(EWMA);
+    return mMsgConn->getTimeStamp();
+}
+
+jstring SmsConnection :: getRemoteHostAddress(JNIEnv& aJni)
+{
+    JELOG2(EWMA);
+    return mMsgConn->getHostAddress(aJni);
+}
+
+jobject SmsConnection :: getData(JNIEnv& aJni,const int aMsgType)
+{
+    JELOG2(EWMA);
+    return mMsgConn->getMessageData(aJni,aMsgType);
+}
+
+} //namespace wma
+} //namespace java
+