--- /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 <e32svr.h>
+#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<TUint16> ( 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<TUint16> ( 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