messagingappbase/smartmessaging/wmlbc/src/WmlSubItemBase.cpp
changeset 0 72b543305e3a
--- /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