contentstorage/casrv/cawidgetscanner/src/cawidgetstoragehandler.cpp
changeset 85 7feec50967db
child 87 9d806967057c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentstorage/casrv/cawidgetscanner/src/cawidgetstoragehandler.cpp	Tue Mar 23 23:17:02 2010 +0200
@@ -0,0 +1,274 @@
+/*
+ * Copyright (c) 2008 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: 
+ *
+ */
+// INCLUDE FILES
+
+#include <badesca.h>
+#include "widgetscannerutils.h"
+#include "cawidgetstoragehandler.h"
+#include "cadef.h"
+#include "cainnerentry.h"
+#include "cainnerquery.h"
+#include "castorageproxy.h"
+#include "caarraycleanup.inl"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCaWidgetStorageHandler::CCaWidgetStorageHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCaWidgetStorageHandler::CCaWidgetStorageHandler(
+        CCaStorageProxy* aStorage, RFs& aFs )
+    {
+    iStorage = aStorage;
+    iFs = aFs;
+    }
+
+// -----------------------------------------------------------------------------
+// CCaWidgetStorageHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCaWidgetStorageHandler::ConstructL()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCaWidgetStorageHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCaWidgetStorageHandler* CCaWidgetStorageHandler::NewL(
+        CCaStorageProxy* aStorage, RFs& aFs )
+    {
+    CCaWidgetStorageHandler* self = NewLC( aStorage, aFs );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCaWidgetStorageHandler::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCaWidgetStorageHandler* CCaWidgetStorageHandler::NewLC(
+        CCaStorageProxy* aStorage, RFs& aFs )
+    {
+    CCaWidgetStorageHandler* self = new ( ELeave ) CCaWidgetStorageHandler(
+            aStorage, aFs );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CCaWidgetStorageHandler::~CCaWidgetStorageHandler()
+    {
+    iWidgets.ResetAndDestroy();
+    iUpdatedIndexes.Close();
+    }
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//  
+void CCaWidgetStorageHandler::SynchronizeL( const RWidgetArray& aWidgets )
+    {
+    FetchWidgetsL();
+    AddWidgetsL( aWidgets );
+    RemoveWidgetsL();
+    }
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//  
+void CCaWidgetStorageHandler::AddL( const CCaWidgetDescription* aWidget )
+    {
+    CCaInnerEntry* entry = aWidget->GetEntryLC();
+    iStorage->AddL( entry );
+    if( ( entry->GetFlags() & ERemovable ) != 0 )
+        {
+        AddWidgetToDownloadCollectionL( entry );
+        }
+    CleanupStack::PopAndDestroy( entry );
+    }
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//  
+void CCaWidgetStorageHandler::UpdateL( const CCaWidgetDescription* aWidget,
+        TUint aEntryId )
+    {
+    CCaInnerEntry* entry = aWidget->GetEntryLC();
+    entry->SetId( aEntryId );
+    if( !aWidget->IsMissing() )
+        {
+        entry->SetFlags( entry->GetFlags() & ~EUsed );
+        }
+    entry->SetFlags( entry->GetFlags() & ~EMissing );
+    iStorage->AddL( entry );
+    if( !aWidget->IsMissing() )
+        {
+        AddWidgetToDownloadCollectionL( entry );
+        }
+    CleanupStack::PopAndDestroy( entry );
+    }
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//  
+void CCaWidgetStorageHandler::AddWidgetsL( const RWidgetArray& aWidgets )
+    {
+    iUpdatedIndexes.Reset();
+    for( TInt i = 0; i < aWidgets.Count(); i++ )
+        {
+        TInt index = iWidgets.Find( 
+                aWidgets[i], CCaWidgetDescription::Compare );
+        if( index != KErrNotFound )
+            {
+            if( !iWidgets[index]->Compare( *aWidgets[i] ) || 
+                    iWidgets[index]->IsMissing() )
+                {
+                aWidgets[i]->SetMissing( iWidgets[index]->IsMissing() );
+                UpdateL( aWidgets[i], iWidgets[index]->GetEntryId() );
+                }
+            iUpdatedIndexes.AppendL( index );
+            }
+        else
+            {
+            AddL( aWidgets[i] );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//  
+void CCaWidgetStorageHandler::RemoveWidgetsL()
+    {
+    RArray<TInt> widgetsToRemove;
+    CleanupClosePushL( widgetsToRemove );
+    for( TInt i = 0; i < iWidgets.Count(); i++ )
+        {
+        if( iUpdatedIndexes.Find( i ) == KErrNotFound )
+            {
+            if( iWidgets[i]->GetMmcId() && 
+                    ( iWidgets[i]->GetMmcId() != 
+                    WidgetScannerUtils::CurrentMmcId( iFs ) ) )
+                {
+                SetMissingFlagL( iWidgets[i] );
+                }
+            else
+                {
+                widgetsToRemove.AppendL( iWidgets[i]->GetEntryId() );
+                }
+            }
+        }
+    if( widgetsToRemove.Count() > 0 )
+        {
+        iStorage->RemoveL( widgetsToRemove );
+        }
+    CleanupStack::PopAndDestroy( &widgetsToRemove );
+    }
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+// 
+void CCaWidgetStorageHandler::AddWidgetToDownloadCollectionL(
+        const CCaInnerEntry* aEntry )
+    {
+    CCaInnerQuery* queryDownload = CCaInnerQuery::NewLC();
+    CDesC16ArrayFlat* downloadType = new ( ELeave ) CDesC16ArrayFlat(
+            KGranularityOne );
+    CleanupStack::PushL( downloadType );
+    downloadType->AppendL( KCaTypeCollectionDownload );
+    queryDownload->SetEntryTypeNames( downloadType );//query takes ownership
+    CleanupStack::Pop( downloadType );
+    queryDownload->SetRole( EGroupEntryRole );
+
+    RArray<TInt> idsGroup;
+    CleanupClosePushL( idsGroup );
+    iStorage->GetEntriesIdsL( queryDownload, idsGroup );
+
+    TCaOperationParams operParams;
+    operParams.iOperationType = TCaOperationParams::EPrepend;
+    operParams.iGroupId = idsGroup[0];
+    operParams.iBeforeEntryId = 0;
+    CleanupStack::PopAndDestroy( &idsGroup );
+
+    RArray<TInt> idsEntry;
+    CleanupClosePushL( idsEntry );
+    idsEntry.Append( aEntry->GetId() );
+    iStorage->OrganizeL( idsEntry, operParams );
+
+    CleanupStack::PopAndDestroy( &idsEntry );
+    CleanupStack::PopAndDestroy( queryDownload );
+    }
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//  
+void CCaWidgetStorageHandler::FetchWidgetsL()
+    {
+    CCaInnerQuery* query = CCaInnerQuery::NewLC();
+    CDesC16ArrayFlat* widgetType = new ( ELeave ) CDesC16ArrayFlat(
+            KGranularityOne );
+    CleanupStack::PushL( widgetType );
+    widgetType->AppendL( KCaTypeWidget );
+    query->SetEntryTypeNames( widgetType );//transfers ownership to query
+    CleanupStack::Pop( widgetType );
+
+    RPointerArray<CCaInnerEntry> entries;
+    CleanupResetAndDestroyPushL( entries );
+    iStorage->GetEntriesL( query, entries );
+    iWidgets.ResetAndDestroy();
+    for( TInt i = 0; i < entries.Count(); i++ )
+        {
+        CCaWidgetDescription* widget = CCaWidgetDescription::NewLC(
+                entries[i] );
+        iWidgets.AppendL( widget ); //iWidgets takes ownership
+        CleanupStack::Pop( widget );
+        }
+    CleanupStack::PopAndDestroy( &entries );
+    CleanupStack::PopAndDestroy( query );
+    }
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//  
+void CCaWidgetStorageHandler::SetMissingFlagL(
+        const CCaWidgetDescription* aWidget )
+    {
+    CCaInnerEntry* entry = aWidget->GetEntryLC();
+    entry->SetFlags( entry->GetFlags() | EMissing );
+    iStorage->AddL( entry );
+    CleanupStack::PopAndDestroy( entry );
+    }
+
+//  End of File