diff -r 000000000000 -r b26acd06ea60 sdkcreationmw/sdkruntimes/msgsimulation/MsgSession/Src/MsgSessionDll.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sdkcreationmw/sdkruntimes/msgsimulation/MsgSession/Src/MsgSessionDll.cpp Mon Mar 08 12:09:11 2010 +0530 @@ -0,0 +1,292 @@ +/* +* Copyright (c) 2004 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 Files + +#include // GLDEF_C +#include +#include "MsgSession.h" +#include "sysini.h" + +#define KInitialMessageBufferSize 1024 + +TVersion MessageRelayVersion = TVersion(1, 0, 0); + + +/**************************************************************************** +* CMessageNotifier +***************************************************************************** +* +* +* +****************************************************************************/ +class CMessageNotifier : public CActive +{ + CMessageSession *iOwner; + + void ConstructL(CMessageSession *aOwner); + + CMessageNotifier(); + + +public: + static CMessageNotifier *NewL(CMessageSession *aOwner); + static CMessageNotifier *NewLC(CMessageSession *aOwner); + + void RunL(); + void DoCancel(); + + void StartReceiveL(); + + TRequestStatus *GetStatusPtr() { return &iStatus;} +}; + +CMessageNotifier::CMessageNotifier() : +CActive(EPriorityNormal) + { + + } + +void CMessageNotifier::ConstructL(CMessageSession *aOwner) + { + iOwner = aOwner; + CActiveScheduler::Add(this); + } + +CMessageNotifier *CMessageNotifier::NewL(CMessageSession *aOwner) + { + CMessageNotifier *self = CMessageNotifier::NewLC(aOwner); + CleanupStack::Pop(); + return self; + } + +CMessageNotifier *CMessageNotifier::NewLC(CMessageSession *aOwner) + { + CMessageNotifier *self = new (ELeave) CMessageNotifier(); + CleanupStack::PushL(self); + self->ConstructL(aOwner); + return self; + } + + + +void CMessageNotifier::RunL() +{ + /* RunL(...) is called only when a message is received. */ + + ASSERT(iOwner != NULL); + ASSERT(iOwner->iListener != NULL); + + if (iStatus.Int() == KErrNone) { + if (iOwner->iMessageBuffer->Length() > 0) { + iOwner->iListener->ReceiveMessageL(iOwner->iMessageBuffer->Des()); + } + StartReceiveL(); + } +} + + +void CMessageNotifier::DoCancel() +{ + iOwner->SendReceive(KCancelReceive, TIpcArgs()); +} + +void CMessageNotifier::StartReceiveL() +{ + iStatus = KRequestPending; + SetActive(); + iOwner->iMessagePtr->Zero(); + TIpcArgs args(iOwner->iMessagePtr); + iOwner->SendReceive(KReceive, args, iStatus); +} + +/**************************************************************************** +* CMessageSession +***************************************************************************** +* +* +* +****************************************************************************/ +EXPORT_C CMessageSession::CMessageSession() : +RSessionBase() + { + + } + +EXPORT_C void CMessageSession::ConstructL() + { + iMessageBuffer = HBufC8::NewL(KMaxSmsBufferSize); + iMessagePtr = new (ELeave) TPtr8(iMessageBuffer->Des()); + + iListener = NULL; + iIncomingNotify = CMessageNotifier::NewL(this); + } + +EXPORT_C CMessageSession *CMessageSession::NewL() + { + CMessageSession *self = CMessageSession::NewLC(); + CleanupStack::Pop(); + return self; + } + +EXPORT_C CMessageSession *CMessageSession::NewLC() + { + CMessageSession *self = new (ELeave) CMessageSession; + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +EXPORT_C CMessageSession::~CMessageSession() + { + StopListeningL(); + delete iIncomingNotify; + delete iMessageBuffer; + delete iMessagePtr; + } + +/* Attaches to server. */ +EXPORT_C void CMessageSession::AttachL() + { + User::LeaveIfError(CreateSession(KRelayServiceName, MessageRelayVersion)); + } + +/* Sends a message. */ +EXPORT_C void CMessageSession::SendMessageL(const TPtr8 &aMessage, TMessageType aType) + { + TIpcArgs args( aMessage.Length(), &aMessage, aType ); + User::LeaveIfError( SendReceive( KNewMessage, args ) ); + } + +/* Listen messages of given type in a given port. One + session may listen to one port only. */ +EXPORT_C void CMessageSession::ListenMessagesL(TMessageType aType, TUint aPort) + { + ASSERT(iListener != NULL); + TIpcArgs args( iMessagePtr, aType, aPort); + User::LeaveIfError(SendReceive(KStartListening, args)); + iIncomingNotify->StartReceiveL(); + } + +/* Stops listening message. */ +EXPORT_C void CMessageSession::StopListeningL() + { + User::LeaveIfError(SendReceive(KStopListening, TIpcArgs())); + iIncomingNotify->Cancel(); + } + +/* Sets the message listener. Listener's ReceiveMessageL(...) + is called, when a new message is received. */ +EXPORT_C void CMessageSession::SetListener(CMessageListener *aListener) + { + iListener = aListener; + } + +/* Returns ETrue, is session set to listening state. */ +EXPORT_C TBool CMessageSession::IsListening() const + { + if( iIncomingNotify->IsActive() ) + return ETrue; + else + return EFalse; + } + +/* Returns ETrue, if file based SMS should be used. + Reads the settings from c:\system\data\wma.ini file. + File format: + # Starts a comment line + # Set UseSocketOutput=1 to use native sockets implementation, + # UseSocketOutput=0 to use file based SMS messaging. + UseSocketOutput=0 */ +EXPORT_C TBool CMessageSession::UseFileSMS() + { + /* The config file. */ + _LIT(KWMAIniFile, "c:\\system\\data\\wma.ini"); + + + /* The write mode; 0 == file (default), 1 == socket. */ + int mode = 0; + CSysIni *ini = NULL; + + /* Open the config file. NewLC leaves, if the file is not found, in which + case we default to writing to file. */ + TRAPD(err, ini = CSysIni::NewL(KWMAIniFile)); + CleanupStack::PushL(ini); + switch ( err ) + { + case KErrNone: + if (ini->SeekBool("UseSocketOutput")) + mode = 1; // Use socket output + break; + case KErrNotFound: + mode = 0; + break; + default: + User::Panic(_L("CMessageSession::UseFileSms() panic:"), err); + } + + //delete ini; + CleanupStack::PopAndDestroy(); + + if (mode == 1) + return EFalse; + else + return ETrue; + + } + +/**************************************************************************** +* CMessageListener +***************************************************************************** +* +* +* +****************************************************************************/ +EXPORT_C void CMessageListener::ConstructL() + { + + } + +EXPORT_C CMessageListener *CMessageListener::NewL() + { + CMessageListener *self = CMessageListener::NewLC(); + CleanupStack::Pop(); + return self; + } + +EXPORT_C CMessageListener *CMessageListener::NewLC() + { + CMessageListener *self = new (ELeave) CMessageListener; + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +EXPORT_C CMessageListener::~CMessageListener() + { + + } + +/* Called when a message is received. */ +EXPORT_C void CMessageListener::ReceiveMessageL(const TPtr8 &/*aMessage*/) + { + + } + +// End of file