cbs/CbsServer/ServerSrc/CCbsTopicList.cpp
changeset 0 ff3b6d0fd310
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbs/CbsServer/ServerSrc/CCbsTopicList.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,697 @@
+/*
+* 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 CCbsTopicList class 
+*                member functions. 
+* 
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include "CbsCommon.h"
+#include "CbsServerConstants.h"
+#include "CCbsSession.h"
+#include "CCbsTopicList.h"
+
+#include "CCbsDbImpTopicList.h"
+#include "CCbsRecEtel.h"
+#include "CCbsServer.h"
+#include "CbsLogger.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::CCbsTopicList
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCbsTopicList::CCbsTopicList( 
+    CCbsSession& aSession, 
+    CCbsDbImpTopicList& aTopicList, 
+    CCbsRecEtel& aReceiver )
+    : CCbsObject( aSession ), 
+    iTopicList( aTopicList ), 
+    iReceiver( aReceiver ), 
+    iIsMessage( EFalse )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::ConstructL()
+    {
+    iTopicList.AddObserverL( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCbsTopicList* CCbsTopicList::NewL( 
+    CCbsSession& aSession, 
+    CCbsDbImpTopicList& aTopicList, 
+    CCbsRecEtel& aReceiver )
+    {
+    CCbsTopicList* self = 
+            new ( ELeave ) CCbsTopicList( aSession, aTopicList, aReceiver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+   
+// Destructor
+CCbsTopicList::~CCbsTopicList()
+    {
+    CBSLOGSTRING("CBSSERVER: >>> CCbsTopicList::~CCbsTopicList()");
+    iTopicList.RemoveObserver( this );
+    CBSLOGSTRING("CBSSERVER: <<< CCbsTopicList::~CCbsTopicList()");
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::HandleRequestsL
+// Handle the requests for the object. 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//  
+TBool CCbsTopicList::HandleRequestsL( 
+    const RMessage2& aMessage )
+    {
+    CBSLOGSTRING("CBSSERVER: >>> CCbsTopicList::HandleRequestsL()");
+    
+    TBool requestHandled( ETrue );
+    
+    // Handle all requests for the subsession
+    switch ( aMessage.Function() )
+        {
+        case ECbsCloseTopicListSubsession:
+            CloseTopicList();
+            aMessage.Complete( KErrNone );
+            break;
+        case ECbsGetTopicCount:
+            GetTopicCountL();
+            break;
+    
+        case ECbsGetTopic:
+            GetTopicL();
+            break;
+        
+        case ECbsFindTopicByNumber:
+            FindTopicByNumberL();
+            break;
+
+        case ECbsGetNextAndPrevTopicNumber:
+            GetNextAndPrevTopicNumberL();
+            break;
+
+        case ECbsDeleteTopic:
+            DeleteTopicL();
+            break;
+
+        case ECbsChangeTopicNameAndNumber:
+            ChangeTopicNameAndNumberL();
+            break;
+
+        case ECbsChangeTopicSubscriptionStatus:
+            ChangeTopicSubscriptionStatusL();
+            break;
+
+        case ECbsChangeTopicHotmarkStatus:
+            ChangeTopicHotmarkStatusL();
+            break;
+
+        case ECbsAddTopic:
+            AddTopicL();
+            break;
+
+        case ECbsNotifyOnEvent:
+            NotifyOnEvent();
+            break;
+
+        case ECbsNotifyOnEventCancel:
+            NotifyOnEventCancel();
+            break;
+
+        case ECbsGetNewTopicsCount:
+            GetNewTopicsCountL();
+            break;
+
+        case ECbsGetLatestTopicNumber:
+            GetLatestTopicNumberL();
+            break;
+
+        case ECbsGetUnreadMessageCount:
+            GetUnreadMessageCountL();
+            break;
+
+        case ECbsGetHotmarkedMessageHandle:
+            GetHotmarkedMessageHandleL();
+            break;
+
+        case ECbsDeleteAll:        
+            DeleteAllL();
+            break;
+
+        case ECbsGetUnreadHotmarkedMessageCount:
+            GetUnreadHotmarkedMessageCountL();
+            break;
+        
+        default:
+            requestHandled = EFalse;
+            break;
+        }    
+
+    // Return truth value indicating whether it was possible 
+    // to handle the request or not.    
+    
+    CBSLOGSTRING2("CBSSERVER: <<< CCbsTopicList::HandleRequestsL(), returning requestHandled: %d", requestHandled );
+    
+    return requestHandled;
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::TopicListInitializedIndL
+// Called when the topic list is initialized.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::TopicListInitializedIndL()
+    {
+    // Notification.
+    NotifyClientL( ECbsTopicListInitialized, 0 );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::TopicAddedIndL
+// Called whenever a topic is created. 
+// If necessary, the client will be notified.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::TopicAddedIndL( 
+    const TCbsDbTopicNumber& aNumber )
+    {
+    // Notification.
+    NotifyClientL( ECbsTopicAdded, aNumber );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::TopicDeletedIndL
+// Called whenever a topic is deleted.  
+// If necessary, the client will be notified.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::TopicDeletedIndL( 
+    const TCbsDbTopicNumber& aNumber )
+    {
+    // Notification.
+    NotifyClientL( ECbsTopicDeleted, aNumber );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::TopicModifiedIndL
+// Called whenever a topic is modified.  
+// If necessary, the client will be notified.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::TopicModifiedIndL( 
+    const TCbsDbTopicNumber& aNumber )
+    {
+    // Notification.
+    NotifyClientL( ECbsTopicModified, aNumber );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::TopicNewMessageReceivedIndL
+// Called whenever a new message has been received.   
+// If necessary, the client will be notified.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//  
+void CCbsTopicList::TopicNewMessageReceivedIndL( 
+    const TCbsDbMessageHandle& aHandle )
+    {
+    TCbsTopicNumber topic( iTopicList.ExtractTopicNumber( aHandle ) );
+    NotifyClientL( ECbsTopicReceivedNewMessage, topic );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::CloseTopicList
+// Closes and destroys the subsession. 
+// Note that after the call has completed, the object is no longer
+// valid. It is also left for the callee's task to complete 
+// the request.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::CloseTopicList()
+    {
+    // Removes the object.
+    Session().Server().DeleteObjectByHandle( Message().Int3() );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::GetTopicCountL
+// Returns the total number of topics to the client.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::GetTopicCountL()
+    {
+    // Write the topic count to the client side.
+    TInt count( 0 );
+    iTopicList.GetTopicCount( count );
+    TPckgBuf< TInt > pckg( count );
+
+    Message().WriteL( 0, pckg );
+
+    // Complete the request
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::GetTopicL
+// Returns the requested topic to the client.
+// Retrieves topic information with an index to topic list.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::GetTopicL()
+    {
+    // First, read the index from the client side
+    TInt topicIndex( 0 );
+    topicIndex = Message().Int0();
+
+    // Then read the topic from the topic list
+    TPckgBuf< TCbsTopic > pckgTopic;
+    TRAPD( errorCode, iTopicList.GetTopicL( topicIndex, pckgTopic() ) );
+
+    if ( errorCode == KErrNone )
+        {
+        // Finally, write the topic information to the client side
+        Message().WriteL( 1, pckgTopic );
+        }
+
+    // Complete the request.
+    Message().Complete( errorCode );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::FindTopicByNumberL
+// Finds a topic by number and returns it to the client.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::FindTopicByNumberL()
+    {
+    // First, read the number from the client side
+    TInt topicNumber( 0 );
+    topicNumber = Message().Int0();    
+    
+    // Find topic by handle
+    TPckgBuf< TCbsTopic > pckgTopic;
+    iTopicList.FindTopicByNumberL( static_cast<TUint16> ( topicNumber ), 
+        pckgTopic() );
+
+    // Finally, write the topic information to the client side
+    Message().WriteL( 1, pckgTopic );
+
+    // Complete the request.
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::DeleteTopicL
+// Deletes a topic by its number and returns it to the client.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::DeleteTopicL()
+    {
+    // First, read the handle from the client side    
+    TInt topicNumber( 0 );
+    topicNumber = Message().Int0();
+
+    // Delete the topic
+    iTopicList.DeleteTopicL( static_cast<TUint16> ( topicNumber ) );
+
+    iReceiver.DeleteSimTopicL( static_cast<TUint16> ( topicNumber ), EFalse );
+
+    iReceiver.ApplyStateChangesL();
+
+    // Complete the request
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::ChangeTopicNameAndNumberL
+// Changes a topic name and number.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::ChangeTopicNameAndNumberL()
+    {
+    TCbsDbTopicName name;
+    TInt oldNumber( 0 );
+    TInt newNumber( 0 );
+
+    oldNumber = Message().Int0();
+    newNumber = Message().Int1();
+    Message().ReadL( 2, name );
+
+    // First find the topic.
+    TCbsDbTopic topic;
+    iTopicList.FindTopicByNumberL( static_cast<TUint16> ( oldNumber ), topic );
+
+    // Then do the operations.
+    iTopicList.UpdateTopicNameAndNumberL( static_cast<TUint16> ( oldNumber ), 
+        static_cast<TUint16> ( newNumber ), name );
+
+    // Now we may need to change the subscriptions
+    if ( oldNumber != newNumber )
+        {
+        iReceiver.DeleteSimTopicL( static_cast<TUint16> ( oldNumber ), EFalse );
+        }
+
+    // Complete the request.
+    Message().Complete( KErrNone );
+    }
+        
+// -----------------------------------------------------------------------------
+// CCbsTopicList::ChangeTopicSubscriptionStatusL
+// Changes topic subscription status.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::ChangeTopicSubscriptionStatusL()
+    {
+    TInt topicNumber( 0 );
+    TPckgBuf< TBool > pckgStatus;
+    
+    topicNumber = Message().Int0();
+    Message().ReadL( 1, pckgStatus );
+
+    // First find the topic.
+    TCbsDbTopic topic;
+    iTopicList.FindTopicByNumberL( static_cast<TUint16> ( topicNumber ), topic );
+
+    // Then update.
+    iTopicList.UpdateTopicSubscriptionStatusL( static_cast<TUint16> ( topicNumber ), pckgStatus() );
+    iReceiver.ApplyStateChangesL();
+
+    // Complete the request.
+    Message().Complete( KErrNone );
+    }
+     
+// -----------------------------------------------------------------------------
+// CCbsTopicList::ChangeTopicHotmarkStatusL
+// Changes topic hotmark status.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::ChangeTopicHotmarkStatusL()
+    {
+    TPckgBuf< TBool > pckgStatus;
+    TInt topicNumber( 0 );
+    topicNumber = Message().Int0();
+    Message().ReadL( 1, pckgStatus );
+
+    // Then update
+    iTopicList.UpdateTopicHotmarkStatusL( static_cast<TUint16> ( topicNumber ), pckgStatus() );
+
+    // Complete the request.
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::AddTopicL
+// Adds a topic to the list.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::AddTopicL()
+    {
+    // First, get the topic information from the client side
+    TPckgBuf< TCbsTopic > pckgTopic;
+    Message().ReadL( 0, pckgTopic );
+
+    // It is not allowed to set protected.
+    if ( pckgTopic().iProtected )
+        {
+        User::Leave( KErrArgument );
+        }
+
+    // Add the topic, not detected automatically
+    iTopicList.AddTopicL( pckgTopic(), EFalse );
+
+    // Load the default topic stream
+    iTopicList.LoadDefaultTopicStreamL();
+    
+    // Write updated data to the client side (only handle is updated)
+    Message().WriteL( 0, pckgTopic );
+    
+    // Complete the request
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::NotifyOnEvent
+// Sets up a pending notification request.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::NotifyOnEvent()
+    {
+    if ( iIsMessage )
+        {
+        NotifyOnEventCancel();
+        }
+
+    iMessage = Message();
+    iIsMessage = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::NotifyOnEventCancel
+// Cancels a pending notification request.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::NotifyOnEventCancel()
+    {
+    // Cancel the pending notify request.
+    if ( iIsMessage )
+        {
+        iMessage.Complete( KErrCancel );
+        iIsMessage = EFalse;
+        }
+
+    // Complete the request.
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::GetNewTopicsCountL
+// Returns the number of "new" topics to the client.
+// By new it is referred to topics that are created because of 
+// topic detection since last power on.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::GetNewTopicsCountL()
+    {
+    TPckgBuf< TInt > pckg( Session().TotalTopicsDetected() );
+    Message().WriteL( 0, pckg );
+
+    // Complete the request
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::GetLatestTopicNumberL
+// Retrieves the number of the topic that was added
+// last to the topic list.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::GetLatestTopicNumberL()
+    {
+    TCbsTopicNumber number( 0 );
+    TInt result( iTopicList.GetLatestTopicNumber( number ) );
+    if ( result == KErrNone )
+        {
+        TPckgBuf<TCbsTopicNumber> pckg( number );
+        Message().WriteL( 0, pckg );
+        Message().Complete( KErrNone );
+        }
+    else
+        {
+        User::Leave( result );
+        }
+    }
+   
+// -----------------------------------------------------------------------------
+// CCbsTopicList::GetUnreadMessageCountL
+// Returns the total amount of unread messages.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+void CCbsTopicList::GetUnreadMessageCountL()
+    {
+    // Get unread message count from the database.
+    TPckgBuf<TInt> pckg( 0 );
+    iTopicList.GetUnreadMessageCount( pckg() );
+
+    Message().WriteL( 0, pckg );
+
+    // Complete the request.
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::GetHotmarkedMessageHandleL
+// Returns a handle to the latest (that is not yet taken) 
+// hotmarked message handle.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+void CCbsTopicList::GetHotmarkedMessageHandleL()
+    {
+    // Get the hotmarked message handle.
+    TCbsMessageHandle handle( 0 );
+    iTopicList.GetHotmarkedMessageHandleL( handle );
+
+    // And then write it to the client.
+    TPckgBuf< TCbsMessageHandle > pckg( handle );
+    Message().WriteL( 0, pckg );
+
+    // Complete the request.
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::GetUnreadHotmarkedMessageCountL
+// Returns the number of hotmarked, unread messages.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::GetUnreadHotmarkedMessageCountL()
+    {
+    TInt number( iTopicList.UnreadHotmarkedMessageCount() );
+    TPckgBuf<TInt> pckgNumber( number );
+    Message().WriteL( 0, pckgNumber );
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::DeleteAllL
+// Deletes all topics.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::DeleteAllL()
+    {
+    // Delete all topic from the SIM card
+    iReceiver.DeleteAllSimTopicsL();
+    
+    // Delete all topic from the server store
+    iTopicList.InitializeListL( EFalse );
+    iReceiver.ApplyStateChangesL();
+
+    Message().Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::NotifyClientL
+// If there is a pending notify request, notifies 
+// the client.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::NotifyClientL( 
+    TCbsTopicListEvent aEvent, 
+    TCbsTopicNumber aNumber )
+    {
+    // If there is a pending request, then process it.
+    if ( iIsMessage )
+        {
+        // First check if the client is interested of the topics.
+        TInt requested( iMessage.Int0() );
+        if ( ( requested & aEvent ) )
+            {
+            // The client is interested of the event, so notify the client.
+            // Make up a pointer descriptors.
+            TPtr8 eventPtr( reinterpret_cast<TText8*>(&aEvent),
+                    sizeof( TCbsTopicListEvent ),
+                    sizeof( TCbsTopicListEvent) );
+
+            TPtr8 numberPtr( reinterpret_cast<TText8*>(&aNumber),
+                    sizeof( TCbsTopicNumber ),
+                    sizeof( TCbsTopicNumber) );
+            // Write through the pointer descriptors.
+            iMessage.WriteL( 1, eventPtr );
+            iMessage.WriteL( 2, numberPtr );
+
+            iMessage.Complete( KErrNone );
+            iIsMessage = EFalse;
+            }        
+        }        
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsTopicList::GetNextAndPrevTopicNumberL
+// Retrieves and returns the numbers of topics that
+// precede and succeed the given topic in topic list.
+// Also returns two flags indicating whether the
+// given topic is the first and/or the last topic in list.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsTopicList::GetNextAndPrevTopicNumberL()
+    {
+    // Retrieve the requested topic number
+    TPckgBuf<TCbsTopicNumber> pckgCurrentTopic( 0 );
+    Message().ReadL( 0, pckgCurrentTopic );
+
+    // Determine requested information
+    TCbsTopicNumber nextTopic( 0 );
+    TCbsTopicNumber prevTopic( 0 );
+    TInt position( 0 );
+    iTopicList.GetNextAndPrevTopicNumberL(
+        pckgCurrentTopic(), nextTopic, prevTopic, position );
+
+    // Write results back
+    TPckgBuf<TCbsNextPrevTopicAndPosition> pckgResults;
+    pckgResults().iNextTopic = nextTopic;
+    pckgResults().iPrevTopic = prevTopic;
+    pckgResults().iPosition = position;
+    Message().WriteL( 1, pckgResults );
+
+    // Complete request
+    Message().Complete( KErrNone );
+    }
+
+
+// ================= OTHER EXPORTED FUNCTIONS ==============
+
+//  End of File