email/alwaysonlineemailplugin/src/AlwaysOnlineImap4FolderObserver.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/alwaysonlineemailplugin/src/AlwaysOnlineImap4FolderObserver.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,262 @@
+/*
+* Copyright (c) 2004 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: 
+*     Observer of the given folder. If new messages are created to the folder,
+*     calls HandleFolderEntryL.
+*
+*/
+
+
+#include "AlwaysOnlineEmailPluginLogging.h"
+#include "AlwaysOnlineImap4FolderObserver.h"
+#include "AlwaysOnlineEmailLoggingTools.h"
+
+const TInt KAlwaysOnlineImap4FolderObserverTimeout = 2000000; // 2 seconds
+
+// ----------------------------------------------------------------------------
+// CAlwaysOnlineImap4FolderObserver()
+// ----------------------------------------------------------------------------
+CAlwaysOnlineImap4FolderObserver::CAlwaysOnlineImap4FolderObserver(
+    CMsvSession& aMsvSession,
+    MAlwaysOnlineImap4FolderObserver& aObserver )
+    :
+    CActive( EPriorityStandard ),
+    iMsvSession( aMsvSession ),
+    iObserver( aObserver )
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::CAlwaysOnlineImap4FolderObserver" );
+    CActiveScheduler::Add( this );
+    }
+
+
+// ----------------------------------------------------------------------------
+// NewL()
+// ----------------------------------------------------------------------------
+CAlwaysOnlineImap4FolderObserver* CAlwaysOnlineImap4FolderObserver::NewL(
+    CMsvSession& aMsvSession,
+    MAlwaysOnlineImap4FolderObserver& aObserver )
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::NewL" );
+    return CAlwaysOnlineImap4FolderObserver::NewL( aMsvSession, NULL, aObserver );
+    }
+
+// ----------------------------------------------------------------------------
+// NewL()
+// ----------------------------------------------------------------------------
+CAlwaysOnlineImap4FolderObserver* CAlwaysOnlineImap4FolderObserver::NewL(
+    CMsvSession& aMsvSession,
+    CMsvEntrySelection* aFoldersToWatch,
+    MAlwaysOnlineImap4FolderObserver& aObserver )
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::NewL" );
+    CAlwaysOnlineImap4FolderObserver* self =
+        new (ELeave) CAlwaysOnlineImap4FolderObserver(
+        aMsvSession, aObserver );
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aFoldersToWatch );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+
+// ----------------------------------------------------------------------------
+// ConstructL()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlineImap4FolderObserver::ConstructL(
+    CMsvEntrySelection* aFoldersToWatch )
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::ConstructL" );
+    User::LeaveIfError( iTimer.CreateLocal() );
+    iRunning = EFalse;
+    iSendNotification = EFalse;
+    iMsvSession.AddObserverL( *this );
+
+    if ( aFoldersToWatch )
+        {
+        iFolders = aFoldersToWatch->CopyL();
+        }
+    else
+        {
+        iFolders = new (ELeave) CMsvEntrySelection;
+        }
+    iChangedFolders = new (ELeave) CMsvEntrySelection;
+
+
+    }
+
+// ----------------------------------------------------------------------------
+// ~CAlwaysOnlineImap4Agent()
+// ----------------------------------------------------------------------------
+CAlwaysOnlineImap4FolderObserver::~CAlwaysOnlineImap4FolderObserver()
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::~CAlwaysOnlineImap4FolderObserver" );
+    iMsvSession.RemoveObserver( *this );
+    delete iFolders;
+    delete iChangedFolders;
+    Cancel();
+    iTimer.Close();
+    }
+
+// ----------------------------------------------------------------------------
+// Start()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlineImap4FolderObserver::Start()
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::Start" );
+    KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineImap4FolderObserver::Start");
+    iRunning = ETrue;
+    iSendNotification = EFalse;
+    }
+
+void CAlwaysOnlineImap4FolderObserver::Stop()
+    {
+    KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineImap4FolderObserver::Stop");
+    Cancel();
+    iRunning = EFalse;
+    iSendNotification = EFalse;
+    }
+
+
+// ----------------------------------------------------------------------------
+// DoCancel()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlineImap4FolderObserver::DoCancel()
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::DoCancel" );
+    iTimer.Cancel();
+    }
+
+// ----------------------------------------------------------------------------
+// RunL()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlineImap4FolderObserver::RunL()
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::RunL" );
+    KAOEMAIL_LOGGER_FN1("CAlwaysOnlineImap4FolderObserver::RunL");
+    iRunning = EFalse;
+    if ( iSendNotification )
+        {
+        iObserver.HandleFolderEntryL( *iChangedFolders );
+        iChangedFolders->Reset();
+        }
+    KAOEMAIL_LOGGER_FN2("CAlwaysOnlineImap4FolderObserver::RunL");
+    }
+
+// ----------------------------------------------------------------------------
+// HandleSessionEventL()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlineImap4FolderObserver::HandleSessionEventL(
+    TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* /*aArg3*/)
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::HandleSessionEventL" );
+    KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlineImap4FolderObserver::HandleSessionEventL aEvent %d", aEvent);
+    if ( !iRunning )
+        {
+        // just ignore everything, we are not running
+        KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineImap4FolderObserver::HandleSessionEventL: ignore everything");
+        return;
+        }
+    const TTimeIntervalMicroSeconds32 timeInterval = KAlwaysOnlineImap4FolderObserverTimeout;
+
+    switch ( aEvent )
+        {
+        case EMsvEntriesCreated:
+        case EMsvEntriesChanged: // Handle this somehow
+        case EMsvEntriesDeleted:
+            {
+            TMsvId parentId = (*(TMsvId*) (aArg2));
+            if ( iFolders->Find( parentId ) != KErrNotFound )
+                {
+                KAOEMAIL_LOGGER_WRITE_FORMAT("parent 0x%x found", parentId);
+                iSendNotification = ETrue;
+                if ( iChangedFolders->Find( parentId ) == KErrNotFound )
+                    {
+                    iChangedFolders->AppendL( parentId );
+                    }
+                KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineImap4FolderObserver::HandleSessionEventL: restart timer case 2");
+                Cancel();
+                // cancel called right before, no need to check if still active
+                iTimer.After( iStatus, timeInterval ); // CSI: 10 # see comment above
+                SetActive();
+                }
+            else
+                {
+                const CMsvEntrySelection* selection = static_cast<CMsvEntrySelection*>(aArg1);
+                if ( iMailboxId > 0 &&
+                    selection->Find( iMailboxId ) > KErrNotFound )
+                    {
+                    iSendNotification = ETrue;
+                    iChangedFolders->AppendL( iMailboxId );
+                    KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineImap4FolderObserver::HandleSessionEventL: restart timer case 3");
+                    Cancel();
+                    // cancel called right before, no need to check if still active
+                    iTimer.After( iStatus, timeInterval ); // CSI: 10 # see comment above
+                    SetActive();
+                    }
+                }
+            }
+            break;
+        default:
+        break;
+        }
+
+    }
+
+// ----------------------------------------------------------------------------
+// AppendFolderL()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlineImap4FolderObserver::AppendFolderL( TMsvId aFolderId )
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::AppendFolderL" );
+    if ( iFolders->Find( aFolderId ) == KErrNotFound )
+        {
+        iFolders->AppendL( aFolderId );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// RemoveFolder()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlineImap4FolderObserver::RemoveFolder( TMsvId aFolderId )
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::RemoveFolder" );
+    TInt index = iFolders->Find( aFolderId );
+    if ( index != KErrNotFound )
+        {
+        iFolders->Delete( index );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// ResetFoldersL()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlineImap4FolderObserver::ResetFoldersL( CMsvEntrySelection* aFoldersToWatch )
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::ResetFoldersL" );
+    delete iFolders;
+    iFolders = NULL;
+    iFolders = aFoldersToWatch->CopyL();
+    }
+
+// ----------------------------------------------------------------------------
+// SetMailbox()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlineImap4FolderObserver::SetMailbox( const TMsvId aMailboxId )
+    {
+    AOLOG_IN( "CAlwaysOnlineImap4FolderObserver::SetMailbox" );
+    iMailboxId = aMailboxId;
+    }
+//EOF