wvuing/IMPSConnectionUI/OperationStepSrc/cnuitermsofusedialoghandler.cpp
branchRCL_3
changeset 13 a941bc465d9f
parent 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/IMPSConnectionUI/OperationStepSrc/cnuitermsofusedialoghandler.cpp	Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,212 @@
+/*
+* Copyright (c) 2006 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: Static helper class for handling terms of use dialog
+*
+*/
+
+
+#include "cnuitermsofusedialoghandler.h"
+
+#include <cimpssapsettingsstore.h>
+#include <cimpssapsettings.h>
+#include <centralrepository.h>  // for KMaxUnicodeStringLength
+
+#include "mcnuiuifacade.h"
+
+// Difference between KMaxUnicodeStringLength and CIMPSSAPSettings
+// opaque data length, see cimpssapsettings.h SetOpaqueDesC16 method description.
+const TInt KSapSettingsDataBufferLength = 5;
+// Collation level 1 to ignore case
+const TInt KCollationLevel = 1;
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Finds aId from aIdList. aIdList contains dot separated ids.
+// Returns KErrNone if aId is found, KErrNotFound otherwise.
+// ---------------------------------------------------------------------------
+//
+TInt FindId( const TDesC& aId, const TDesC& aIdList )
+    {
+    // Get pointer descriptor to work with
+    TPtrC ptr( aIdList );
+    // Locate first dot
+    TInt dotPos = ptr.FindC( KIMDot );
+
+    while ( dotPos != KErrNotFound )
+        {
+        // Get current id from list for comparison
+        TPtrC curId( ptr.Left( dotPos ) );
+
+        if ( curId.CompareC( aId, KCollationLevel, NULL ) == 0 )
+            {
+            // Match found, return
+            return KErrNone;
+            }
+        else
+            {
+            // Move pointer to next id in list
+            TInt len = ptr.Length() - dotPos - 1;   // -1 to get rid of dot
+            if ( len < 0 )
+                {
+                // This should never happen but let's check
+                // just to be sure to avoid panics
+                return KErrNotFound;
+                }
+            ptr.Set( ptr.Right( len ) );
+            // Locate next dot
+            dotPos = ptr.FindC( KIMDot );
+            }
+        }
+
+    // Match not found
+    return KErrNotFound;
+    }
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CnUiTermsOfUseDialogHandler::HandleTermsOfUseDialogL
+// ---------------------------------------------------------------------------
+//
+TInt CnUiTermsOfUseDialogHandler::HandleTermsOfUseDialogL(
+    CIMPSSAPSettings& aSap,
+    MCnUiUiFacade& aUi,
+    CIMPSSAPSettingsStore& aSapStore )
+    {
+    TInt sapError = KErrNone;
+    TPtrC16 acceptedIds;
+
+    // Get SAP settings from SAP store to work with
+    CIMPSSAPSettings* tmpSap = CIMPSSAPSettings::NewLC();
+    TBool tmpSapOwned = ETrue;
+    TRAPD( err, aSapStore.GetSAPL( aSap.Uid(), tmpSap ) );
+    if ( err != KErrNone )
+        {
+        // In case of error use aSap directly
+        CleanupStack::PopAndDestroy( tmpSap );
+        tmpSap = NULL;
+        tmpSap = &aSap;
+        tmpSapOwned = EFalse;
+        }
+
+    // Get pointer descriptor to ids that have accepted ToU from SAP
+    sapError = tmpSap->GetOpaqueDesC16( KIMToUAccepted, acceptedIds );
+
+    // Ignore KErrNotFound errors (means that
+    // this is the first login attempt to this SAP)
+    if ( sapError != KErrNotFound )
+        {
+        User::LeaveIfError( sapError );
+        }
+
+    // Get current user id from aSap
+    const TDesC& currentId( aSap.SAPUserId() );
+
+    // Check if ToU has already been accepted for current id
+    TInt retVal = FindId( currentId, acceptedIds );
+
+    if ( retVal == KErrNotFound )
+        {
+        // Show Terms of Use, return KErrCancel if user does not accept them,
+        // otherwise continue
+        if ( !aUi.DisplayTermsOfUseAndQueryL() )
+            {
+            // User canceled ToU query, login cancelled
+            // note is already shown inside DisplayTermsOfUseAndQueryL
+            // method, just return KErrCancel
+            if ( tmpSapOwned )
+                {
+                // Cleanup needed
+                CleanupStack::PopAndDestroy( tmpSap );
+                }
+            return KErrCancel;
+            }
+        else
+            {
+            // ToU accepted, set it shown
+            // for this user id
+            HBufC* newAcceptedIds = HBufC::NewLC(
+                                        acceptedIds.Length() +
+                                        KIMDot().Length() +
+                                        currentId.Length() );
+            TPtr ids( newAcceptedIds->Des() );
+
+            // Append previous user ids if any
+            if ( acceptedIds.Length() > 0 )
+                {
+                ids.Append( acceptedIds );
+                }
+            // Append current id
+            ids.Append( currentId );
+            // Append dot as separator
+            ids.Append( KIMDot );
+
+            // Check key+value length
+            TInt keyLen = KIMToUAccepted().Length();
+            TInt newLen = ids.Length() + keyLen;
+            TInt maxLen = NCentralRepositoryConstants::KMaxUnicodeStringLength -
+                          KSapSettingsDataBufferLength;
+
+            // if key+value length too big, delete
+            // previous ids from start of list
+            // until length is small enough
+            while ( newLen > maxLen )
+                {
+                // Find first dot
+                TInt dotPos = ids.FindC( KIMDot );
+                if ( dotPos == KErrNotFound )
+                    {
+                    // No dot => data corrupted, all we can do
+                    // is to delete previous key+value
+                    // pair and set new one with only current id
+                    tmpSap->DeleteOpaque( KIMToUAccepted );
+                    ids.Zero();
+                    ids.Append( currentId );
+                    newLen = ids.Length() + keyLen;
+                    }
+                else
+                    {
+                    // Delete first id+dot from list
+                    ids.Delete( 0, dotPos + 1 );
+                    newLen = ids.Length() + keyLen;
+                    }
+                }
+
+            // Set new ids to SAP
+            sapError = tmpSap->SetOpaqueDesC16(
+                           KIMToUAccepted, *newAcceptedIds );
+            // Leave if errors
+            User::LeaveIfError( sapError );
+
+            // Cleanup
+            CleanupStack::PopAndDestroy( newAcceptedIds );
+
+            // Update SAP to store if it was succesfully
+            // loaded from store
+            if ( tmpSapOwned )
+                {
+                aSapStore.UpdateOldSAPL( tmpSap, aSap.Uid() );
+                }
+            }
+        }
+
+    if ( tmpSapOwned )
+        {
+        // Cleanup needed
+        CleanupStack::PopAndDestroy( tmpSap );
+        }
+
+    return KErrNone;
+    }