diff -r f5050f1da672 -r 04becd199f91 javaextensions/wma/sms_cbs/src/smsconnection.cpp --- /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 + (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 +