--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/smartmessaging/wmlbc/src/WmlSubItemBase.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,269 @@
+/*
+* Copyright (c) 2002-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: Base class for WML subitems.
+*
+*/
+
+
+
+
+// INCLUDE FILES
+
+#include "WmlSubItemBase.h" // CWmlSubItemBase
+#include "WmlBioControl.pan" // Panic()
+
+#include <msgnamevalue.h> // CMsgNameValue
+#include <MsgBioUtils.h>
+
+// ==================== LOCAL FUNCTIONS ====================
+
+/// Helper method when an array is pushed to CleanupStack
+static void CleanupResetAndDestroy(TAny* aSelf)
+ {
+ __ASSERT_DEBUG(aSelf, User::Panic( _L("wmlbc.dll"), ENullPtr ));
+ CArrayPtrSeg<CMsgNameValue>* self =
+ static_cast<CArrayPtrSeg<CMsgNameValue>* >(aSelf);
+ self->ResetAndDestroy();
+ delete self;
+ }
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CWmlSubItemBase::~CWmlSubItemBase
+// ---------------------------------------------------------
+//
+CWmlSubItemBase::~CWmlSubItemBase()
+ {
+ delete iOriginalName;
+ delete iName;
+ }
+
+// ---------------------------------------------------------
+// CWmlSubItemBase::SaveItemL
+// Contains logic for storing either bookmark or accespoint.
+// ---------------------------------------------------------
+//
+
+TBool CWmlSubItemBase::SaveItemL( const TBool aShowNote,
+ const TBool aShowPreferredQuery,
+ const TInt aPreferredInformation,
+ const TBool aCreateBookmarkIfNotSetAsDefault)
+ {
+
+ // Set all the member variables to the initial state.
+ Initialize();
+
+ // Name checking part
+
+ // If the item don't have name get the default name
+ // and increment it as long as it's unique.
+ if (!HasNameL())
+ {
+ SetDefaultNameL();
+ while (!IsNameValidL( EFalse )) // Don't update the list from database
+ {
+ IncrementNameL();
+ }
+ QueryNewNameL();
+ }
+
+ // Keep asking as long as the name is not unique.
+ while ( !IsNameValidL() )
+ {
+ if ( !RenameQueryL() )
+ {
+ // Operation stops if user didn't want to rename.
+ return EFalse;
+ }
+ IncrementNameL();
+ while (!IsNameValidL( EFalse )) // Dont' update the list from database
+ {
+ IncrementNameL();
+ }
+ QueryNewNameL();
+ }
+
+ // Actual storing part
+
+ PreStoreL( aShowPreferredQuery );
+
+ // Set the new name as item's name.
+ SetNameL( *iName );
+ StoreL();
+ // Set the original name back as the item's name.
+ SetNameL( *iOriginalName );
+
+ PostStoreL( aShowNote, aPreferredInformation, aCreateBookmarkIfNotSetAsDefault );
+
+ return ETrue;
+ }
+
+// ---------------------------------------------------------
+// CWmlSubItemBase::Initialize
+// Set all the member variables to the initial state.
+// ---------------------------------------------------------
+//
+void CWmlSubItemBase::Initialize()
+ {
+ // Set the variables to the default values, because if
+ // leave occurs at some point of the SaveItem-operation,
+ // variables MUST NOT keep their current state.
+
+ delete iName;
+ iName = NULL;
+
+ delete iOriginalName;
+ iOriginalName = NULL;
+
+ // Let the actual implementation initialize itself.
+ DoInitialize();
+ }
+
+// ---------------------------------------------------------
+// CWmlSubItemBase::~CWmlSubItemBase
+// ---------------------------------------------------------
+//
+TBool CWmlSubItemBase::HasNameL()
+ {
+ // Assert that iName and iOriginalName are NULL before this operation.
+ __ASSERT_DEBUG(iName == NULL,
+ Panic(ENameNotNull));
+ __ASSERT_DEBUG(iOriginalName == NULL,
+ Panic(EOriginalNameNotNull));
+
+ // Get the name from the bmItem.
+ HBufC* name = NameLC();
+ CleanupStack::Pop( name );
+
+ // Put the retrieved name to the iName member variable.
+ // This is changed during the storing sequence.
+ iName = name;
+
+ // Allocate the original name to the member variable.
+ // This is not changed during the storing sequence and
+ // is restored to the item's name in PostStoreL
+ iOriginalName = name->AllocL();
+
+ // Check that there's actually something.
+ if (iName->Length() == 0)
+ {
+ return EFalse;
+ }
+
+ return ETrue;
+ }
+
+// ---------------------------------------------------------
+// CWmlSubItemBase::~CWmlSubItemBase
+// ---------------------------------------------------------
+//
+void CWmlSubItemBase::SetDefaultNameL()
+ {
+ delete iName;
+ iName = NULL;
+ iName = DefaultNameLC();
+ CleanupStack::Pop( iName );
+ }
+
+// ---------------------------------------------------------
+// CWmlSubItemBase::~CWmlSubItemBase
+// ---------------------------------------------------------
+//
+TBool CWmlSubItemBase::IsNameValidL( TBool aUpdateList )
+ {
+ return IsNameValidL( *iName, aUpdateList );
+ }
+
+// ---------------------------------------------------------
+// CWmlSubItemBase::IncrementNameL()
+// Calls the static implementation method by giving
+// iName as a parameter.
+// ---------------------------------------------------------
+//
+void CWmlSubItemBase::IncrementNameL()
+ {
+ TInt maxLength = NameMaxLength();
+ HBufC* newName = DoIncrementNameL(*iName, maxLength);
+
+ delete iName;
+ iName = NULL;
+
+ iName = newName;
+ }
+
+// ---------------------------------------------------------
+// CWmlSubItemBase::DoIncrementNameL()
+// ---------------------------------------------------------
+//
+HBufC* CWmlSubItemBase::DoIncrementNameL( const TDesC& aName, TInt aMaxLength )
+ {
+ // Create buffer descriptor that is used to append a running number
+ // to given name. The lenght of the buffer is set to maximum because
+ // IncrementNameL doesn't realloc the buffer.
+ HBufC* buf = HBufC::NewLC( aMaxLength );
+ TPtr ptr = buf->Des();
+ ptr = aName;
+ MsgBioUtils::IncrementNameL( ptr, aMaxLength );
+ CleanupStack::Pop( buf );
+ return buf;
+ }
+
+// ---------------------------------------------------------
+// CWmlSubItemBase::QueryNewNameL()
+// Calls the static implementation method by giving
+// iName as a parameter.
+// ---------------------------------------------------------
+//
+void CWmlSubItemBase::QueryNewNameL()
+ {
+ HBufC* newName = DoQueryNewNameLC(*iName);
+ CleanupStack::Pop( newName );
+
+ delete iName;
+ iName = NULL;
+
+ iName = newName;
+ }
+
+TBool CWmlSubItemBase::RenameQueryL()
+ {
+ return DoRenameQueryL(*iName);
+ }
+
+CArrayPtrFlat<CMsgNameValue>* CWmlSubItemBase::LabelsAndValuesLC()
+ {
+ TInt count = FieldCount();
+
+ CArrayPtrFlat<CMsgNameValue>* data =
+ new (ELeave) CArrayPtrFlat<CMsgNameValue>( count );
+ CleanupStack::PushL( TCleanupItem(CleanupResetAndDestroy, data ) );
+
+ for (TInt i = 0; i < count; i++)
+ {
+ CMsgNameValue* fieldData = GetFieldDataAtLC( i );
+ if ( fieldData->Value().Length() > 0 )
+ {
+ data->AppendL( fieldData );
+ CleanupStack::Pop( fieldData );
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( fieldData );
+ }
+ }
+ return data;
+ }
+
+// End of File