--- /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
+