cbs/CbsServer/ClientSrc/RCbs.cpp
changeset 0 ff3b6d0fd310
--- /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