diff -r 000000000000 -r ff3b6d0fd310 cbs/CbsServer/ServerSrc/CCbsTopicMessages.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbs/CbsServer/ServerSrc/CCbsTopicMessages.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,422 @@ +/* +* Copyright (c) 2003 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: This module contains the implementation of CCbsTopicMessages class +* member functions. +* +* +*/ + + +// INCLUDE FILES + +#include +#include "CbsCommon.h" +#include "CbsServerPanic.h" +#include "CCbsTopicMessages.h" +#include "CCbsSession.h" +#include "CbsServerConstants.h" +#include "CCbsDbImpTopicMessages.h" +#include "CCbsServer.h" +#include "CbsLogger.h" + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::CCbsTopicMessages +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CCbsTopicMessages::CCbsTopicMessages( + CCbsSession& aSession, + CCbsDbImpTopicMessages& aMessages, + CCbsRecEtel& aReceiver ) + : CCbsObject( aSession ), + iMessages( aMessages ), + iLocked( 0 ), + iReceiver( aReceiver ) + { + } + + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCbsTopicMessages* CCbsTopicMessages::NewL( + CCbsSession& aSession, + CCbsDbImpTopicMessages& aMessages, + CCbsRecEtel& aReceiver ) + { + // Normal two phase construction + CCbsTopicMessages* self = + new ( ELeave ) CCbsTopicMessages( aSession, aMessages, aReceiver ); + return self; + } + + +// Destructor +CCbsTopicMessages::~CCbsTopicMessages() + { + CBSLOGSTRING("CBSSERVER: >>> CCbsTopicMessages::~CCbsTopicMessages()"); + CBSLOGSTRING("CBSSERVER: <<< CCbsTopicMessages::~CCbsTopicMessages()"); + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::HandleRequestsL +// Handle the requests for the object. +// Passes requests to proper functions +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCbsTopicMessages::HandleRequestsL( + const RMessage2& aMessage ) + { + CBSLOGSTRING("CBSSERVER: >>> CCbsTopicMessages::HandleRequestsL()"); + TBool requestHandled ( ETrue ); + // Handle the requests that are for the subsession. + switch ( aMessage.Function() ) + { + case ECbsCloseTopicMessagesSubsession: + CloseTopicMessages(); + aMessage.Complete( KErrNone ); + break; + + case ECbsGetMessageCount: + GetMessageCountL(); + break; + + case ECbsGetMessage: + GetMessageL(); + break; + + case ECbsFindMessageByHandle: + FindMessageByHandleL(); + break; + + case ECbsGetMessageIndexByHandle: + GetMessageIndexByHandleL(); + break; + + case ECbsGetNextAndPrevMsgHandle: + GetNextAndPrevMsgHandleL(); + break; + + case ECbsDeleteMessage: + DeleteMessageL( iReceiver ); + break; + + case ECbsSaveMessage: + SaveMessageL( iReceiver ); + break; + + case ECbsLockMessage: + LockMessageL(); + break; + + case ECbsReadMessage: + ReadMessageL( iReceiver ); + break; + + case ECbsGetMessageContents: + GetMessageContentsL(); + break; + + default: + requestHandled = EFalse; + break; + } + CBSLOGSTRING2("CBSSERVER: <<< CCbsTopicMessages::HandleRequestsL(), returning requestHandled: %d", requestHandled ); + return requestHandled; + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::CloseTopicMessages +// Closes the subsession. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::CloseTopicMessages() + { + // Removes the object. + Session().Server().DeleteObjectByHandle( Message().Int3() ); + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::GetMessageCountL +// Returns the total amount of messages to the client. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::GetMessageCountL() + { + // First, get the handle from the client + TInt topicNumber( 0 ); + topicNumber = Message().Int0(); + + // Then, get the message count from the database. + TInt count( 0 ); + iMessages.GetMessageCountL( static_cast ( topicNumber ), count ); + + // Write the message count to the client side. + TPckgBuf< TInt > pckgCount( count ); + Message().WriteL( 1, pckgCount ); + + // Complete the request. + Message().Complete( KErrNone ); + + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::GetMessageL +// Returns the requested message to the client. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::GetMessageL() + { + // Read the parameters from the client side + TInt topicNumber( 0 ); + TInt index( 0 ); + topicNumber = Message().Int0(); + index = Message().Int1(); + + // Then get the message from database. + TPckgBuf< TCbsDbMessage > pckgMessage; + iMessages.GetMessageL( static_cast ( topicNumber ), index, pckgMessage() ); + + // And finally write the message information to the client side + Message().WriteL( 2, pckgMessage ); + + // And complete the request. + Message().Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::FindMessageByHandleL +// Finds a message by its handle. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::FindMessageByHandleL() + { + // Read the parameters from the client side. + TPckgBuf< TCbsMessageHandle > pckgHandle( 0 ); + Message().ReadL( 0, pckgHandle ); + + // Find the message. + TPckgBuf< TCbsMessage > pckgMessage; + iMessages.FindMessageByHandleL( pckgHandle(), pckgMessage() ); + + // Write the result to the client side. + Message().WriteL( 1, pckgMessage ); + + // Complete the request. + Message().Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::GetMessageIndexByHandleL +// Returns message index in topic by message handle. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::GetMessageIndexByHandleL() + { + TPckgBuf< TCbsMessageHandle > pckgHandle( 0 ); + Message().ReadL( 0, pckgHandle ); + + TInt index( iMessages.FindMessagePositionByHandleL( pckgHandle() ) ); + + TPckgBuf< TInt > pckgIndex( index ); + Message().WriteL( 1, pckgIndex ); + + Message().Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::DeleteMessageL +// Deletes a message. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::DeleteMessageL( const CCbsRecEtel& aReceiver ) + { + // Read the handle from the client side. + TPckgBuf< TCbsMessageHandle > pckgHandle( 0 ); + Message().ReadL( 0, pckgHandle ); + + // And then try to delete the message. + iMessages.DeleteMessageL( pckgHandle(), aReceiver ); + + // Finally, complete the request. + Message().Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::SaveMessageL +// Saves a message. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::SaveMessageL( const CCbsRecEtel& aReceiver ) + { + // Read the parameter from the client side. + TPckgBuf< TCbsMessageHandle > pckgHandle( 0 ); + Message().ReadL( 0, pckgHandle ); + + // Save the message. + iMessages.SaveMessageL( pckgHandle(), aReceiver ); + + // Complete the request. + Message().Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::LockMessageL +// Locks a message. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::LockMessageL() + { + // Read the parameter from the client side. + TPckgBuf< TCbsMessageHandle > pckgHandle( 0 ); + Message().ReadL( 0, pckgHandle ); + + TCbsDbMessageHandle handle( pckgHandle() ); + + if ( handle != iLocked ) + { + iMessages.LockMessageL( iLocked, handle ); + iLocked = handle; + } + + // Complete the request. + Message().Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::ReadMessageL +// Reads a message. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::ReadMessageL( const CCbsRecEtel& aReceiver ) + { + // Read parameter from the client side. + TPckgBuf< TCbsMessageHandle > pckgHandle( 0 ); + Message().ReadL( 0, pckgHandle ); + + // Perform the operation. + iMessages.ReadMessageL( pckgHandle(), aReceiver ); + + // Complete the request. + Message().Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::GetMessageContentsL +// Returns the content of the message to the client. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::GetMessageContentsL() + { + // Read the parameters from the client side. + TPckgBuf< TCbsMessageHandle > pckgHandle( 0 ); + Message().ReadL( 0, pckgHandle ); + + TInt bufSize( 0 ); + bufSize = Message().Int1(); + + TCbsDbMessage message; + iMessages.FindMessageByHandleL( pckgHandle(), message ); + + if ( message.iLength != 0 ) + { + // Message is not empty. + // First allocate memory and then get the contents. + // Finally write data to client side. + TInt size ( ( message.iLength < bufSize ) ? + message.iLength : bufSize ); + + // guaranteed to allocate n bytes, n >= size + HBufC* buffer = HBufC::NewLC( size ); // on CS + + TPtr16 pointer( buffer->Des() ); + pointer.Zero(); + + // Note: parameter 'size' required, since MaxLength + // may be > bufSize + iMessages.GetMessageContentsL( pckgHandle(), pointer, size ); + +#ifndef _DEBUG + Message().WriteL( 2, pointer ); +#else + TRAPD( result, Message().WriteL( 2, pointer ) ); + if ( result != KErrNone ) + { + RDebug::Print(_L("Server buffer length: %d, max: %d"), + pointer.Length(), pointer.MaxLength()); + __DEBUGGER(); + User::Leave( result ); + } + +#endif + CleanupStack::PopAndDestroy(); // buffer + } + + // Complete the request. + Message().Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CCbsTopicMessages::GetNextAndPrevMsgHandleL +// Retrieves and returns the handles of messages that +// precede and succeed the given message in topic. +// Also returns two flags indicating whether the +// given message is the first and/or the last message in topic. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCbsTopicMessages::GetNextAndPrevMsgHandleL() + { + // Retrieve the requested topic number + TPckgBuf< TCbsMessageHandle > pckgCurrentMsg( 0 ); + Message().ReadL( 0, pckgCurrentMsg ); + + // Determine requested information + TCbsMessageHandle nextMsg(0); + TCbsMessageHandle prevMsg(0); + TInt position(0); + iMessages.GetNextAndPrevMsgHandleL( + pckgCurrentMsg(), nextMsg, prevMsg, position); + + // Write results back + TPckgBuf< TCbsNextPrevMsgAndPosition > pckgResults; + pckgResults().iPrevMsg = prevMsg; + pckgResults().iNextMsg = nextMsg; + pckgResults().iPosition = position; + + Message().WriteL( 1, pckgResults ); + + // Complete request + Message().Complete( KErrNone ); + + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= +// End of File