diff -r 6ca72c0fe49a -r a941bc465d9f wvuing/IMPSConnectionUI/OperationStepSrc/cnuitermsofusedialoghandler.cpp --- /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 +#include +#include // 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; + }