diff -r 000000000000 -r ff3b6d0fd310 cbs/CbsServer/ClientSrc/RCbs.cpp --- /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 + +// 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