diff -r 6aeb7a756187 -r 3c88a81ff781 utilities/serviceipcserver/platform/s60/serviceipcserversymbiansession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/utilities/serviceipcserver/platform/s60/serviceipcserversymbiansession.cpp Fri Oct 15 17:30:59 2010 -0400 @@ -0,0 +1,250 @@ +/** + This file is part of CWRT package ** + + Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU (Lesser) General Public License as + published by the Free Software Foundation, version 2.1 of the License. + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + (Lesser) General Public License for more details. You should have + received a copy of the GNU (Lesser) General Public License along + with this program. If not, see . +*/ + + +#include +#include "serviceipcobserver.h" +#include "serviceipcrequest.h" +#include "serviceipcserversymbiansession.h" + +namespace WRT +{ + +// Constants for the IPC operation id +const TInt KIPCNewOperation = 0; +const TInt KIPCGetData = 1; + +/*! + \class CServiceSymbianSession + Symbian Session class + */ + +/*! + Constructor + @param aObserver observer to the server + */ +CServiceSymbianSession::CServiceSymbianSession(MServiceIPCObserver* aObserver) : + ServiceIPCSession(aObserver) +{ +} + +/*! + 2nd phased constructor + */ +void CServiceSymbianSession::ConstructL() +{ +} + +void CServiceSymbianSession::CreateL() +{ + Server().addSession(); +} + +/*! + Two-Phased Constructor + @param aObserver observer to the server + */ +CServiceSymbianSession* CServiceSymbianSession::NewL(MServiceIPCObserver* aObserver) +{ + CServiceSymbianSession* self = + new (ELeave) CServiceSymbianSession(aObserver); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; +} + +/*! + Destructor + */ +CServiceSymbianSession::~CServiceSymbianSession() +{ + delete m_curRequest; + m_curRequest = NULL; + if (m_clientInfo) { + delete m_clientInfo; + m_clientInfo = NULL; + } +} + +/*! + Write some data in response to a request + @param aData some data to write as response + @return bool if write was successful + */ +bool CServiceSymbianSession::write(const QByteArray& aData) +{ + // Implicitly shared + m_data = aData; + return false; +} + +/*! + Complete a Request + @return bool if request completed + */ +bool CServiceSymbianSession::completeRequest() +{ + + m_message.Complete(m_data.count()); + delete m_curRequest; + m_curRequest = NULL; + return true; +} + +/*! + Close a session and gracefully shutdown + */ +void CServiceSymbianSession::close() +{ + // Symbian doesn't really do anything +} + +/*! + From CSession2 + Service request + @param aMessage message object + */ +void CServiceSymbianSession::ServiceL(const RMessage2& aMessage) +{ + // Default ServiceErrorL() will complete the message if this method leaves + TInt operation(aMessage.Function()); + switch (operation) { + case KIPCNewOperation: { + handleRequestL(aMessage); + break; + } + case KIPCGetData: { + handleGetBufferL(aMessage); + break; + } + default: { + aMessage.Complete(KErrNotFound); + break; + } + } +} + +/*! + From CSession2 + Handle any disconnection from the client + @param aMessage message Object + */ +void CServiceSymbianSession::Disconnect(const RMessage2 &/*aMessage*/) +{ + if (m_appendToBList) { + Server().removeBroadcastList(m_clientInfo->sessionId()); + } + m_observer->handleClientDisconnect(m_clientInfo); + Server().releaseSessionId(m_clientInfo->sessionId()); //release sessionId + if (m_curRequest) { + completeRequest(); + } + Server().closeSession(); +} + +/*! + Handle an IPC request + @param aMessage message Object + */ +void CServiceSymbianSession::handleRequestL(const RMessage2& aMessage) +{ + // Store the message + m_message = aMessage; + + // Convert from Symbian to QT + HBufC* request = ReadDesLC(aMessage, 0); + HBufC8* data = ReadDes8LC(aMessage, 1); + + // Shallow copy only, we want a deep copy + QString d = QString::fromUtf16(request->Ptr(), request->Length()); + QString operation; + operation += d; + + QByteArray convertData( reinterpret_cast(data->Ptr()), data->Length() ); + + // New request + Q_ASSERT(!m_curRequest); + m_curRequest = new ServiceIPCRequest(this, 0, operation); + m_data.clear(); + + // Get client info + ClientInfo *client = new ClientInfo(); + TSecureId sid(aMessage.Identity()); + client->setProcessId(sid.iId); + client->setVendorId(aMessage.VendorId().iId); + RThread clientThread; + aMessage.ClientL(clientThread); + RProcess clientProc; + clientThread.Process(clientProc); + client->setName(QString::fromUtf16(clientProc.Name().Ptr(), + clientProc.Name().Length())); + client->setSessionId(m_clientInfo->sessionId()); + // Add data and callback to the observer + // + m_curRequest->addRequestdata(convertData); + m_curRequest->setClientInfo(client); // ownership passed + //m_observer->handleRequest(m_curRequest); + handleReq(); + + CleanupStack::PopAndDestroy(2, request); +} + +/*! + Handle getting the result buffer + */ +void CServiceSymbianSession::handleGetBufferL(const RMessage2& aMessage) +{ + TPtrC8 data(reinterpret_cast (m_data.constData()), m_data.count()); + aMessage.Write(0, data); + aMessage.Complete(KErrNone); +} + +/*! + Read a 16 bit descriptor from the message + @param aMessage message to read from, + @param aMsgSlot slot to read from + */ +HBufC* CServiceSymbianSession::ReadDesLC(const RMessage2& aMessage, + TInt aMsgSlot) +{ + TInt length = aMessage.GetDesLengthL(aMsgSlot); + HBufC* des = HBufC::NewLC(length); + TPtr ptr = des->Des(); + aMessage.ReadL(aMsgSlot, ptr); + return des; +} + +/*! + Read a 8 bit descriptor from the message + @param aMessage message to read from, + @param aMsgSlot slot to read from + */ +HBufC8* CServiceSymbianSession::ReadDes8LC(const RMessage2& aMessage, + TInt aMsgSlot) +{ + TInt length = aMessage.GetDesLengthL(aMsgSlot); + HBufC8* des = HBufC8::NewLC(length); + TPtr8 ptr = des->Des(); + aMessage.ReadL(aMsgSlot, ptr); + return des; +} +} + +// END OF FILE + + +