--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cbs/CbsServer/ClientSrc/RCbs.cpp Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,757 @@
+/*
+* 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 RCbs class
+ member functions.
+*
+*/
+
+
+// INCLUDES
+#include "RCbs.h"
+#include "CbsCommon.h"
+#include "CbsServerConstants.h"
+#include <data_caging_path_literals.hrh>
+
+// CONSTANTS
+// Server name
+_LIT( KCbsServerExe, "CbsServer.exe");
+
+// How many microseconds to wait for server
+const TInt KWaitForServerRetries = 10;
+const TInt KWaitForServerTime = 500000;
+
+// ==================== LOCAL FUNCTIONS ====================
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// RCbs::RCbs
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RCbs::RCbs() //lint -e1926
+ //lint -e1928
+ : iConnected( EFalse )
+ {
+ } //lint +e1926
+ //lint +e1928
+
+// Destructor
+EXPORT_C RCbs::~RCbs()
+ {
+ // Close subsession and session.
+ Close();
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::Connect
+// Creates connection to the server.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::Connect()
+ {
+ TInt result( KErrNone );
+
+ if ( !iConnected )
+ {
+ // Start the server if it isn't already started
+ StartServer();
+
+ // Create a session to the server.
+ result = CreateSession( KCbsServerName,
+ Version(),
+ KCbsServerDefaultSlots );
+
+ if ( result == KErrNone )
+ {
+ // Create a settings subsession
+ result = iSettings.Open( *this );
+ }
+ if ( result == KErrNone )
+ {
+ // Create a topic list subsession
+ result = iTopicList.Open( *this );
+ }
+ if ( result == KErrNone )
+ {
+ // Create a topic messages subsession
+ result = iTopicMessages.Open( *this );
+ }
+ if ( result == KErrNone )
+ {
+ // Create a topic collection subsession
+ result = iTopicCollection.Open( *this );
+ if ( result == KErrNone )
+ {
+ iConnected = ETrue;
+ }
+ else
+ {
+ iConnected = EFalse;
+ }
+ }
+ }
+ // Return the result code
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::Close
+// Closes the session to the server.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::Close()
+ {
+ if ( iConnected )
+ {
+ // First close all subsessions.
+ iTopicCollection.Close();
+ iTopicMessages.Close();
+ iTopicList.Close();
+ iSettings.Close();
+
+ // Then close the server session.
+
+ // Try to tell the server we've closed the session.
+ // Just ignore if that fails.
+ const TIpcArgs args( TIpcArgs::ENothing );
+ SendReceive( ECbsCloseSession, args );
+
+ RHandleBase::Close();
+ iConnected = EFalse;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::Version
+// Returns the version of CbsClient.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TVersion RCbs::Version() const
+ {
+ // Create version and return it.
+ return TVersion( KCbsServerVersionMajor,
+ KCbsServerVersionMinor,
+ KCbsServerVersionBuild );
+ }
+
+// Settings-related methods
+
+// -----------------------------------------------------------------------------
+// RCbs::GetReceptionStatus
+// Requests the reception status from the server.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::GetReceptionStatus(
+ TBool& aStatus )
+ {
+ iSettings.GetReceptionStatus( aStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::SetReceptionStatus
+// Changes the reception status to aStatus.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::SetReceptionStatus(
+ TBool aStatus )
+ {
+ // Change the reception status
+ return iSettings.SetReceptionStatus( aStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetTopicDetectionStatus
+// Requests the current topic detection status.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::GetTopicDetectionStatus(
+ TBool& aStatus )
+ {
+ iSettings.GetTopicDetectionStatus( aStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::SetTopicDetectionStatus
+// Changes the topic detection status to aStatus.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::SetTopicDetectionStatus(
+ TBool aStatus )
+ {
+ return iSettings.SetTopicDetectionStatus( aStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetLanguages
+// Requests for the current language settings from the server.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::GetLanguages(
+ TCbsSettingsLanguages& aLanguages )
+ {
+ iSettings.GetLanguages( aLanguages );
+ }
+// -----------------------------------------------------------------------------
+// RCbs::SetLanguages
+// Sets a new set of languages to the server.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::SetLanguages(
+ const TCbsSettingsLanguages& aLanguages )
+ {
+ return iSettings.SetLanguages( aLanguages );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::NotifySettingsChanged
+// Requests the server to notify the client whenever any settings will be
+// changed.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::NotifySettingsChanged(
+ TRequestStatus& aStatus,
+ TCbsSettingsEvent& aEvent )
+ {
+ iSettings.NotifySettingsChanged( aStatus, aEvent );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::NotifySettingsChangedCancel
+// Cancels the request to notify the client.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::NotifySettingsChangedCancel()
+ {
+ iSettings.NotifySettingsChangedCancel();
+ }
+
+// Topic Collection -related methods
+
+// -----------------------------------------------------------------------------
+// RCbs::StartCollectionBrowsing
+// Resets the iterator.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::StartCollectionBrowsing()
+ {
+ iTopicCollection.Start();
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::HasNextCollectionTopic
+// Returns ETrue, if there is a topic not accessed with NextTopic()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool RCbs::HasNextCollectionTopic()
+ {
+ return iTopicCollection.HasNextTopic();
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::NextCollectionTopic
+// Returns the next topic identity if one exists.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::NextCollectionTopic(
+ TCbsTopicInfo& aInfo )
+ {
+ return iTopicCollection.NextTopic( aInfo );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetTopicCount
+// Returns the total amount of topics the topic list contains.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::GetTopicCount(
+ TInt& aCount )
+ {
+ iTopicList.GetTopicCount( aCount );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetTopic
+// Returns information about a topic from the topic list.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::GetTopic(
+ const TInt aIndex,
+ TCbsTopic& aTopic )
+ {
+ return iTopicList.GetTopic( aIndex, aTopic );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::FindTopicByNumber
+// Finds the topic by the given number.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::FindTopicByNumber(
+ TCbsTopicNumber aNumber,
+ TCbsTopic& aTopic )
+ {
+ return iTopicList.FindTopicByNumber( aNumber, aTopic );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::DeleteTopic
+// Deletes an existing topic.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::DeleteTopic(
+ TCbsTopicNumber aNumber )
+ {
+ return iTopicList.DeleteTopic( aNumber );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::DeleteAllTopics
+// Delete all topics.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::DeleteAllTopics()
+ {
+ return iTopicList.DeleteAllTopics();
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::AddTopic
+// Adds a new topic.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::AddTopic(
+ TCbsTopic& aTopic )
+ {
+ return iTopicList.AddTopic( aTopic );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::ChangeTopicNameAndNumber
+// Changes the name and number of the existing topic.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::ChangeTopicNameAndNumber(
+ TCbsTopicNumber aOldNumber,
+ TCbsTopicNumber aNewNumber,
+ const TCbsTopicName& aName )
+ {
+ return iTopicList.ChangeTopicNameAndNumber(
+ aOldNumber, aNewNumber, aName );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::ChangeTopicSubscriptionStatus
+// Changes topic subscription status.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::ChangeTopicSubscriptionStatus(
+ TCbsTopicNumber aNumber,
+ TBool aNewStatus )
+ {
+ return iTopicList.ChangeTopicSubscriptionStatus( aNumber, aNewStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::ChangeTopicHotmarkStatus
+// Changes topic hotmark status.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::ChangeTopicHotmarkStatus(
+ TCbsTopicNumber aNumber,
+ TBool aNewStatus )
+ {
+ return iTopicList.ChangeTopicHotmarkStatus( aNumber, aNewStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::NotifyOnTopicListEvent
+// Requests the server to notify the client whenever an event occurs
+// that changes the information of the topics.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::NotifyOnTopicListEvent(
+ TRequestStatus& aStatus,
+ const TInt aRequested,
+ TCbsTopicListEvent& aEvent,
+ TCbsTopicNumber& aNumber )
+ {
+ iTopicList.NotifyOnEvent( aStatus, aRequested, aEvent, aNumber );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::NotifyOnTopicListEventCancel
+// Cancels the pending notify request.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::NotifyOnTopicListEventCancel()
+ {
+ iTopicList.NotifyOnEventCancel();
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetNewTopicsCount
+// Returns the number of topics added since last GetNewTopicsCount()
+// by the topic detection feature.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::GetNewTopicsCount(
+ TInt& aCount )
+ {
+ return iTopicList.GetNewTopicsCount( aCount );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetLatestTopicNumber
+// Returns the number of the topic which was last added
+// to topic list.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::GetLatestTopicNumber(
+ TCbsTopicNumber& aNumber )
+ {
+ return iTopicList.GetLatestTopicNumber( aNumber );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetUnreadMessageCount
+// Returns the total amount of unread messages.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::GetUnreadMessageCount(
+ TInt& aCount )
+ {
+ iTopicList.GetUnreadMessageCount( aCount );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetHotmarkedMessageHandle
+// Returns the handle to the latest hotmarked message that has been
+// received after the system has started up.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::GetHotmarkedMessageHandle(
+ TCbsMessageHandle& aMessage )
+ {
+ iTopicList.GetHotmarkedMessageHandle( aMessage );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetHotmarkedMessageHandle
+// Returns the number of unread messages in hotmarked topics.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::NumberOfUnreadHotmarkedMessages()
+ {
+ return iTopicList.NumberOfUnreadHotmarkedMessages();
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetNextAndPrevTopicNumber
+// Returns the numbers of topics that precede and succeed the given
+// topic in server-side topic list.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::GetNextAndPrevTopicNumber(
+ const TCbsTopicNumber& aCurrentTopicNumber,
+ TCbsTopicNumber& aPrevTopicNumber,
+ TCbsTopicNumber& aNextTopicNumber,
+ TInt& aPosition )
+ {
+ return iTopicList.GetNextAndPrevTopicNumber(
+ aCurrentTopicNumber,
+ aPrevTopicNumber,
+ aNextTopicNumber,
+ aPosition);
+ }
+
+
+// Topic Messages-related methods
+
+// -----------------------------------------------------------------------------
+// RCbs::GetMessageCount
+// Returns the total amount of messages the topic contains.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::GetMessageCount(
+ TCbsTopicNumber aNumber,
+ TInt& aCount )
+ {
+ return iTopicMessages.GetMessageCount( aNumber, aCount );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetMessage
+// Returns message information.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::GetMessage(
+ TCbsTopicNumber aNumber,
+ TInt aIndex,
+ TCbsMessage& aMessage )
+ {
+ return iTopicMessages.GetMessage( aNumber, aIndex, aMessage );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::FindMessageByHandle
+// Finds a message by given handle.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::FindMessageByHandle(
+ const TCbsMessageHandle& aHandle,
+ TCbsMessage& aMessage )
+ {
+ return iTopicMessages.FindMessageByHandle( aHandle, aMessage );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetMessageIndexByHandle
+// Returns the index of a message with given handle in topic.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::GetMessageIndexByHandle(
+ const TCbsMessageHandle& aHandle,
+ TInt& aIndex )
+ {
+ return iTopicMessages.GetMessageIndexByHandle( aHandle, aIndex );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::DeleteMessage
+// Deletes an existing message.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::DeleteMessage(
+ const TCbsMessageHandle& aHandle )
+ {
+ return iTopicMessages.DeleteMessage( aHandle );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::SaveMessage
+// Saves a message (the saved message won't be deleted to make
+// room for new messages).
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::SaveMessage(
+ const TCbsMessageHandle& aHandle )
+ {
+ return iTopicMessages.SaveMessage( aHandle );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::LockMessage
+// Locks the message.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::LockMessage(
+ const TCbsMessageHandle& aHandle )
+ {
+ return iTopicMessages.LockMessage( aHandle );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::ReadMessage
+// Sets the message as read.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::ReadMessage(
+ const TCbsMessageHandle& aHandle )
+ {
+ return iTopicMessages.ReadMessage( aHandle );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetMessageContents
+// Returns the message contents.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::GetMessageContents(
+ const TCbsMessageHandle& aHandle,
+ TDes& aBuffer )
+ {
+ return iTopicMessages.GetMessageContents( aHandle, aBuffer );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::GetNextAndPrevMessageHandle
+// Returns the handles of messages that precede and succeed the
+// given message in server-side list of topic messages.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RCbs::GetNextAndPrevMessageHandle(
+ const TCbsMessageHandle& aCurrentMsgHandle,
+ TCbsMessageHandle& aPrevMsgHandle,
+ TCbsMessageHandle& aNextMsgHandle,
+ TInt& aPosition )
+ {
+ return iTopicMessages.GetNextAndPrevMessageHandle(
+ aCurrentMsgHandle,
+ aPrevMsgHandle,
+ aNextMsgHandle,
+ aPosition );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::Connected
+// Returns ETrue if CbsServer session has been established.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool RCbs::Connected() const
+ {
+ return iConnected;
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::Shutdown
+// Forces the server to shut down.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCbs::Shutdown() const
+ {
+ const TIpcArgs args( TIpcArgs::ENothing );
+ SendReceive( ECbsShutdown, args );
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::StartServer
+// Starts the server.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt RCbs::StartServer()
+ {
+ TInt errorCode( KErrNone );
+ RMutex serverStartMutex;
+
+ if ( !IsServerStarted() )
+ {
+ TInt mutexExists( serverStartMutex.CreateGlobal( _L("CBSSERVERMTX") ) );
+ if ( mutexExists )
+ {
+ TInt openErr( serverStartMutex.OpenGlobal( _L("CBSSERVERMTX") ) );
+ if ( openErr )
+ {
+ return openErr;
+ }
+ }
+ // Mutex exists, wait until server is finished with it's tasks
+ if ( mutexExists == KErrAlreadyExists )
+ {
+ serverStartMutex.Wait();
+ }
+
+ // Create and start a new process.
+ TBuf<1> arguments;
+ RProcess p;
+
+ #ifdef __WINS__
+ errorCode = p.Create( KCbsServerExe, arguments );
+ #else
+ // Use the correct path depending on whether using data caging or not
+ // Use path \sys\bin
+ TBuf<64> fullPath;
+ fullPath = KDC_PROGRAMS_DIR;
+ fullPath.Append( KCbsServerExe );
+ errorCode = p.Create( fullPath, arguments );
+ #endif
+
+ if ( errorCode == KErrNone )
+ {
+ p.Resume();
+ p.Close();
+
+ TInt i( 0 );
+ for ( i = 0; i < KWaitForServerRetries; i++ )
+ {
+ if ( IsServerStarted() )
+ {
+ break;
+ }
+
+ User::After( KWaitForServerTime );
+ }
+ }
+ // Finished with startup sequence, release the mutex
+ if ( mutexExists == KErrAlreadyExists )
+ {
+ serverStartMutex.Signal();
+ }
+ serverStartMutex.Close();
+ }
+ return errorCode;
+ }
+
+// -----------------------------------------------------------------------------
+// RCbs::IsServerStarted
+// Checks if the server is already started.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool RCbs::IsServerStarted()
+ {
+ TFindServer findServer( KCbsServerName );
+ TFullName name;
+ return ( findServer.Next( name ) == KErrNone );
+ }
+
+// ================= OTHER EXPORTED FUNCTIONS ==============
+
+// End of File