messagingapp/msgappfw/client/src/ccsnotificationhandler.cpp
changeset 23 238255e8b033
child 37 518b245aa84c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgappfw/client/src/ccsnotificationhandler.cpp	Fri Apr 16 14:56:15 2010 +0300
@@ -0,0 +1,302 @@
+/*
+* Copyright (c) 2007 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 class handles asynchronous notifications (e.g. new messages) 
+*               from server to client.
+*
+*/
+
+// SYSTEM INCLUDES
+#include <ccsnotificationhandler.h>
+#include <ccsrequesthandler.h>
+#include <rcssession.h>
+#include <ccsclientconversation.h>
+
+// USER INCLUDES
+#include "ccsdebug.h"
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CCsNotificationHandler* CCsNotificationHandler::
+NewL(CCSRequestHandler* aRequestHandler)
+    {
+    PRINT ( _L("Enter CCsNotificationHandler::NewL") );
+
+    CCsNotificationHandler* self = new ( ELeave ) CCsNotificationHandler();
+    CleanupStack::PushL( self );
+    self->ConstructL(aRequestHandler);
+    CleanupStack::Pop();
+    
+    PRINT ( _L("End CCsNotificationHandler::NewL") );
+
+    return( self ) ;
+    }
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::CCsNotificationHandler()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+CCsNotificationHandler::CCsNotificationHandler()
+: CActive( EPriorityStandard )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::~CCsNotificationHandler()
+// Destructor.
+// -----------------------------------------------------------------------------
+CCsNotificationHandler::~CCsNotificationHandler()
+    {
+    // Unsubscribe
+    TRAP_IGNORE(RemoveChangeEventL());
+    
+    Cancel();
+    
+    iSession.Close();
+    
+    if ( iNotificationBuffer )
+        {
+        delete iNotificationBuffer;
+        iNotificationBuffer = NULL;
+        }
+    
+    if ( iNextReqIDBuffer )
+        {
+        delete iNextReqIDBuffer;
+        iNextReqIDBuffer = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+void CCsNotificationHandler::ConstructL(CCSRequestHandler* aRequestHandler)
+    {
+    iRequestHandler = aRequestHandler;
+    iLastReqID = -1; 
+    iNextReqIDBuffer = NULL;
+    iNotificationBuffer = NULL;
+    
+    User::LeaveIfError( iSession.Connect() );
+  
+    // Subscribe
+    RequestChangeEventL();
+    }
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::RunL()
+// Invoked to handle responses from the server.
+// -----------------------------------------------------------------------------
+void CCsNotificationHandler::RunL()
+    {
+    TInt currentReqID = 0;
+    if ( iNextReqIDBuffer )
+       {
+       TLex8 lex(iNextReqIDBuffer->Des());
+       lex.Val(currentReqID);
+       
+       delete iNextReqIDBuffer;
+       iNextReqIDBuffer = NULL;
+       }
+       
+    switch ( iStatus.Int() ) 
+        {
+        case EAddConversationListEvent:
+            iRequestHandler->HandleAddConversationList(iNotificationBuffer);
+            break;
+
+        case EDeleteConversationListEvent:
+            iRequestHandler->HandleDeleteConversationList(iNotificationBuffer);
+            break;
+
+        case EModifyConversationListEvent:
+            iRequestHandler->HandleModifyConversationList(iNotificationBuffer);
+            break;
+
+        case EAddConversationEvent:
+            iRequestHandler->HandleAddConversation(iNotificationBuffer);
+            break;
+
+        case EDeleteConversationEvent:
+            iRequestHandler->HandleDeleteConversation(iNotificationBuffer);
+            break;
+
+        case EModifyConversationEvent:
+            iRequestHandler->HandleModifyConversation(iNotificationBuffer);
+            break;
+
+        case ECachingStartedEvent:
+            iRequestHandler->HandleCachingStarted(iNotificationBuffer);
+            break;
+
+        case ECachingCompletedEvent:
+            iRequestHandler->HandleCachingCompleted(iNotificationBuffer);
+            break;
+
+        case ECachingErrorEvent:
+            iRequestHandler->HandleCachingError(iNotificationBuffer);
+            break;
+            
+        case ERefreshConversationListEvent:
+            iRequestHandler->HandleRefreshConversationList(iNotificationBuffer);
+            break;
+                
+        case ERefreshConversationEvent:
+            iRequestHandler->HandleRefreshConversation(iNotificationBuffer);
+            break;
+        }
+    
+    iLastReqID = currentReqID;
+    RequestChangeEventL(); // re-subscribe
+    }
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::DoCancel()
+// Cancels any outstanding operation.
+// -----------------------------------------------------------------------------
+void CCsNotificationHandler::DoCancel()
+    {
+    // Do nothing
+    }
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::RequestChangeEventL
+// Request server for any change events
+// -----------------------------------------------------------------------------
+void CCsNotificationHandler::RequestChangeEventL()
+    {
+    // Create a buffer to store the search results.
+    if ( iNotificationBuffer )
+        {
+        delete iNotificationBuffer;
+        iNotificationBuffer = NULL;
+        }
+    iNotificationBuffer = HBufC8::NewL(KBufferMaxLen);
+    
+    if ( iNextReqIDBuffer )
+        {
+        delete iNextReqIDBuffer;
+        iNextReqIDBuffer = NULL;
+        }
+    iNextReqIDBuffer = HBufC8::NewL(4);
+    
+    iSession.RequestChangeEventL(iLastReqID, 
+            iNextReqIDBuffer->Des(), 
+            iNotificationBuffer->Des(), 
+            iStatus );   
+  
+    SetActive();
+    }
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::RemoveChangeEventL
+// Remove for any change events
+// -----------------------------------------------------------------------------
+void CCsNotificationHandler::RemoveChangeEventL()
+    {
+    iSession.RemoveChangeEventL();
+    }
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::RequestConversationListChangeEventL
+// -----------------------------------------------------------------------------
+void CCsNotificationHandler::RequestConversationListChangeEventL()
+    {
+    iSession.SetConversationListChangeObserverL();  
+    }
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::RemoveConversationListChangeEventL
+// -----------------------------------------------------------------------------
+void CCsNotificationHandler::RemoveConversationListChangeEventL()
+    {
+    iSession.ResetConversationListChangeObserverL();  
+    }
+
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::RequestConversationChangeEventL
+// -----------------------------------------------------------------------------
+void CCsNotificationHandler::RequestConversationChangeEventL
+(CCsClientConversation* aClientConversation)
+    {
+   // Set ConversationChangeObserver for aClientConversation in server
+   // Tmp buffer
+   CBufFlat* dataBuf = CBufFlat::NewL(KBufferMaxLen);
+   CleanupStack::PushL(dataBuf);
+
+   // Stream over the temp buffer
+   RBufWriteStream dataStream(*dataBuf);
+   dataStream.PushL();
+
+   // Write the Client Conversation in the stream
+   aClientConversation->ExternalizeL(dataStream);
+   dataStream.CommitL();
+   
+   //------------------Input Buffer--------------------------
+
+   // Create a HBufC8 for IPC
+   iRequestBuffer = HBufC8::NewL(dataBuf->Size());
+   TPtr8 dataPtr(iRequestBuffer->Des());
+   dataBuf->Read(0, dataPtr, dataBuf->Size());
+
+   CleanupStack::PopAndDestroy(2, dataBuf);
+   
+   // Send the request
+   iSession.SetConversationChangeObserverL(iRequestBuffer->Des());
+   
+   // Cleanup
+   delete iRequestBuffer;
+   iRequestBuffer = NULL;
+   }
+    
+// -----------------------------------------------------------------------------
+// CCsNotificationHandler::RemoveConversationChangeEventL
+// -----------------------------------------------------------------------------
+void CCsNotificationHandler::RemoveConversationChangeEventL
+(CCsClientConversation* aClientConversation)
+    {
+    // Set ConversationChangeObserver for aClientConversation in server
+    // Tmp buffer
+    CBufFlat* dataBuf = CBufFlat::NewL(KBufferMaxLen);
+    CleanupStack::PushL(dataBuf);
+    
+    // Stream over the temp buffer
+    RBufWriteStream dataStream(*dataBuf);
+    dataStream.PushL();
+    
+    // Write the Client Conversation in the stream
+    aClientConversation->ExternalizeL(dataStream);
+    dataStream.CommitL();
+    
+    //------------------Input Buffer--------------------------
+    
+    // Create a HBufC8 for IPC
+    iRequestBuffer = HBufC8::NewL(dataBuf->Size());
+    TPtr8 dataPtr(iRequestBuffer->Des());
+    dataBuf->Read(0, dataPtr, dataBuf->Size());
+    
+    CleanupStack::PopAndDestroy(2, dataBuf);
+    
+    // Send the request
+    iSession.ResetConversationChangeObserverL(iRequestBuffer->Des());
+    
+    // Cleanup
+    delete iRequestBuffer;
+    iRequestBuffer = NULL;
+    }
+  
+// EOF