diff -r 000000000000 -r c8caa15ef882 XDMSettingsUI/src/XDMPluginSLContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/src/XDMPluginSLContainer.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,981 @@ +/* +* Copyright (c) 2005-2007 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: XDM GS plugin Settins list container +* +*/ + + + + +// INCLUDE FILES +#include "XDMExternalInterface.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "XDMPluginSLContainer.h" +#include "XDMPluginSettinglist.h" +#include "SettingsData.h" + +#include + +// LOCAL CONSTANTS AND MACROS +_LIT(KFormatPostfix, "%S(%02d)"); +_LIT(KFormatNoPostfix, "%S"); +_LIT(KFormatLargePostfix, "%S(%d)"); +const TInt KMaxPostfixLength = 5; + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::CXDMPluginSLContainer() +// --------------------------------------------------------------------------- +// +CXDMPluginSLContainer::CXDMPluginSLContainer(CAknView* aView) : iView(aView) + { + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::ConstructL(const TRect& aRect) +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::ConstructL( const TRect& aRect) + { + #ifdef _DEBUG + RDebug::Print( _L( "[CXDMPluginSLContainer] ConstructL()" ) ); + #endif + + CEikStatusPane* sp = static_cast + ( CEikonEnv::Static()->EikAppUi() )->StatusPane(); + CAknTitlePane* title = static_cast + ( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + // Set the proper title of this list + TResourceReader rReader; + iCoeEnv->CreateResourceReaderLC( rReader, R_GS_XDM_MAIN_VIEW_TITLE ); + title->SetFromResourceL( rReader ); + CleanupStack::PopAndDestroy(); //rReader + + CreateWindowL(); // Makes the control a window-owning control + + // construct the data object the settings list will use + iData = CSettingsData::NewL(); + // construct control and set parent + iSettingList = CXDMPluginSettinglist::NewL(*iData); + iSettingList->SetContainerWindowL(*this); + + // CreateResourceReaderLC will allocate a buffer to be used by + // the TResourceReader. This buffer is pushed onto the cleanup + // stack - not the TResourceReader itself + CEikonEnv::Static()->CreateResourceReaderLC(rReader, R_SETTINGS); + iSettingList->ConstructFromResourceL(rReader); + + // Clean up the buffer allocated above, NOT the reader itself. + // Cannot use expected item overload of PopAndDestroy() as buffer + // is inaccessible. + CleanupStack::PopAndDestroy(); + iSettingList->ActivateL(); + + SetRect( aRect ); + ActivateL(); + + #ifdef _DEBUG + RDebug::Print( _L( "[CXDMPluginSLContainer] Construct done" ) ); + #endif + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::~CXDMPluginSLContainer() +// --------------------------------------------------------------------------- +// +CXDMPluginSLContainer::~CXDMPluginSLContainer() + { + if (iData) + delete iData; + if(iSettingList) // if setting list has been created + { + delete iSettingList; + iSettingList = NULL; + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::SizeChanged() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::SizeChanged() + { + iSettingList->SetRect(Rect()); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::CountComponentControls() const +// --------------------------------------------------------------------------- +// +TInt CXDMPluginSLContainer::CountComponentControls() const + { + return 1; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::ComponentControl( TInt aIndex ) const +// --------------------------------------------------------------------------- +// +CCoeControl* CXDMPluginSLContainer::ComponentControl( TInt aIndex ) const + { + switch ( aIndex ) + { + case 0: + return iSettingList; + default: + return NULL; + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::EditCurrentItemL() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::EditCurrentItemL() + { + iSettingList->EditCurrentItemL(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::OfferKeyEventL() +// --------------------------------------------------------------------------- +// +TKeyResponse CXDMPluginSLContainer::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + if (iSettingList) + return iSettingList->OfferKeyEventL(aKeyEvent, aType); + else + return EKeyWasNotConsumed; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::Draw(const TRect& aRect) const +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::Draw(const TRect& aRect) const + { + CWindowGc& gc = SystemGc(); + gc.Clear(aRect); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::HandleListBoxEventL() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aListBoxEvent) + { + // if the Select Key has been pressed + if ((aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed) || + (aListBoxEvent == MEikListBoxObserver::EEventItemClicked)) + { + iSettingList->EditCurrentItemL(); + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::PrepareXDMSetForEditingL(TDesC& aXDMSetName) +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::PrepareXDMSetForEditingL(TDesC& aXDMSetName) + { + TLex16 myLex; + iData->Reset(); + + iData->iSettingName = aXDMSetName; + AknTextUtils::ConvertDigitsTo(iData->iSettingName, EDigitTypeWestern ); + iData->iSettingId = GetSettingIdL(iData->iSettingName); + + CXdmSettingsCollection* xDMSet = NULL; + + // read the source setting + xDMSet = TXdmSettingsApi::SettingsCollectionL(iData->iSettingId); + CleanupStack::PushL(xDMSet); + + iData->iSettingNameDisp = aXDMSetName; + iData->iServerAddress = xDMSet->Property(EXdmPropUri); + + // AccessPoint handling + iData->iAccessPointDes = xDMSet->Property(EXdmPropToNapId); + myLex.Assign(iData->iAccessPointDes); + myLex.Val(iData->iAccessPoint); + + iSettingList->GetAccessPointNameL(iData->iAccessPoint, iData->iAccessPointName); + if ( (iData->iAccessPointName) == KNullDesC) // if name is not found + { + iData->iAccessPoint = -1; + } + + iData->iUserID = xDMSet->Property(EXdmPropAuthName); + iData->iPassword = xDMSet->Property(EXdmPropAuthSecret); + + CleanupStack::PopAndDestroy(1); //xDMSet + iSettingList->LoadSettingsL(); + SetTitlePaneTextL(iData->iSettingName); + iSettingList->ResetItemIndex(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::PrepareXDMSetNewDefaultL() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::PrepareXDMSetNewDefaultL() + { + iData->Reset(); + + HBufC* defName = StringLoader::LoadL( R_STR_XDM_NEW_SET ); + CleanupStack::PushL( defName ); + + TBool changed; + + HBufC* newName = DoMakeValidNameL(defName, changed); + + if ( newName ) + // name converted to unique + { + (iData->iSettingName).Copy(newName->Des()); + delete newName; + } + else + { + (iData->iSettingName).Copy(defName->Des()); + } + CleanupStack::PopAndDestroy( defName ); + + iData->iSettingNameDisp = iData->iSettingName; + AknTextUtils::LanguageSpecificNumberConversion(iData->iSettingNameDisp); + + iSettingList->LoadSettingsL(); + iSettingList->ResetItemIndex(); + iSettingList->DrawNow(); + SetTitlePaneTextL(iData->iSettingName); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::PrepareNewXDMSetFromExistingL(TDesC& aXDMSetName) +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::PrepareNewXDMSetFromExistingL(TDesC& aXDMSetName) + { + TLex16 myLex; + + // iData is already resetted in this case and iSettingId has id of + // existing list from which data to be copied + // we need to find the new name, from given name + HBufC* originalName = aXDMSetName.AllocL(); + CleanupStack::PushL( originalName ); + + // aXDMSetName is in disp format, need to convert to western format + TPtr corrFormat(originalName->Des()); + AknTextUtils::ConvertDigitsTo(corrFormat, EDigitTypeWestern ); + + TBool changed; + + HBufC* newName = DoMakeValidNameL(originalName, changed); + + if ( newName ) + // name converted to unique + { + (iData->iSettingName).Copy(newName->Des()); + delete newName; + } + else + { + (iData->iSettingName).Copy(originalName->Des()); + } + + CleanupStack::PopAndDestroy( originalName ); + + + CXdmSettingsCollection* xDMSet = NULL; + + // Displayable name + iData->iSettingNameDisp = iData->iSettingName; + AknTextUtils::LanguageSpecificNumberConversion(iData->iSettingNameDisp); + + // read the source setting + xDMSet = TXdmSettingsApi::SettingsCollectionL(iData->iSettingId); + CleanupStack::PushL(xDMSet); + + iData->iServerAddress = xDMSet->Property(EXdmPropUri); + + // AccessPoint handling + iData->iAccessPointDes = xDMSet->Property(EXdmPropToNapId); + myLex.Assign(iData->iAccessPointDes); + myLex.Val(iData->iAccessPoint); + + iSettingList->GetAccessPointNameL(iData->iAccessPoint, iData->iAccessPointName); + if ( (iData->iAccessPointName) == KNullDesC) // if name is not found + { + iData->iAccessPoint = -1; + } + + iData->iUserID = xDMSet->Property(EXdmPropAuthName); + iData->iPassword = xDMSet->Property(EXdmPropAuthSecret); + + // also overwrite the setting id now since we dont need it anymore + iData->iSettingId = -1; + CleanupStack::PopAndDestroy(1); //xDMSet + iSettingList->LoadSettingsL(); + SetTitlePaneTextL(iData->iSettingNameDisp); + iSettingList->ResetItemIndex(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::DisplayNewXDMSetOptions() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::DisplayNewXDMSetOptionsL() + { + // First phase construction of menu list + CAknSinglePopupMenuStyleListBox* newXDMsetMenuList = + new (ELeave) CAknSinglePopupMenuStyleListBox; + CleanupStack::PushL(newXDMsetMenuList); + + // Create a popuplist to show the menu list in + CAknPopupList* popupList = CAknPopupList::NewL( + newXDMsetMenuList, + R_AVKON_SOFTKEYS_OK_CANCEL); + + CleanupStack::PushL(popupList); + + // Second phase construction of menulist + newXDMsetMenuList->ConstructL(popupList,EAknListBoxMenuList); + // Set up scroll bars + newXDMsetMenuList->CreateScrollBarFrameL(ETrue); + newXDMsetMenuList->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); + + // Set up menu items + CTextListBoxModel* model = newXDMsetMenuList->Model(); // not taking ownership + model->SetOwnershipType (ELbmOwnsItemArray); // list'll delete with listbox + RArray settingIDs; + CleanupClosePushL(settingIDs); + CDesCArray* newXDMsetMenuListArray = NULL; + + TRAPD(err, newXDMsetMenuListArray = LoadCollectionNamesL(settingIDs, ETrue)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(3); //newXDMsetMenuList, popupList, settingIDs + return EFalse; + } + CleanupStack::PushL(newXDMsetMenuListArray); + + newXDMsetMenuListArray->Sort(ECmpCollated); + model->SetItemTextArray(newXDMsetMenuListArray); + CleanupStack::Pop(1); // newXDMsetMenuListArray owned by model + CleanupStack::PopAndDestroy(1); //settingIDs + + // Set title + HBufC* title; + title = StringLoader::LoadLC(R_STR_XDM_USE_EXISTING); + popupList->SetTitleL(*title); + CleanupStack::PopAndDestroy(1); //title + + // Show the menu in the popup list + TInt popupOk = popupList->ExecuteLD(); + + CleanupStack::Pop(popupList); + + // if the user selected some set + if (popupOk) + { + iData->Reset(); + TPtrC setName = newXDMsetMenuListArray->MdcaPoint + (newXDMsetMenuList->CurrentItemIndex()); + + iData->iSettingId = GetSettingIdL(setName); + (iData->iSettingNameDisp).Copy(setName); + (iData->iSettingName).Copy(setName); + AknTextUtils::ConvertDigitsTo(iData->iSettingName, EDigitTypeWestern ); + CleanupStack::PopAndDestroy(newXDMsetMenuList); + return ETrue; + } + // otherwise return false + CleanupStack::PopAndDestroy(1); //newXDMsetMenuList + return EFalse; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::SetTitlePaneTextL( const TDesC& aTitleText ) const +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::SetTitlePaneTextL( const TDesC& aTitleText ) const + { + CAknTitlePane* title = static_cast< CAknTitlePane* > + ( CEikonEnv::Static()->AppUiFactory()->StatusPane()->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ) ); + if ( !title ) + { + User::Leave( KErrNotSupported ); + } + title->SetTextL( aTitleText ); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::AreCompulsoryItemsFilled() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::AreCompulsoryItemsFilled() + { + if ( (iData->iAccessPoint > -1) && ((iData->iServerAddress)!=KNullDesC) && + ((iData->iUserID)!=KNullDesC) ) + { + return ETrue; + } + return EFalse; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::DisplayDeleteOrDontSaveDialog() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::DisplayDeleteOrDontSaveDialogL() + { + TBuf myDisplayMessage; + CAknQueryDialog* query = CAknQueryDialog::NewL + (CAknQueryDialog::EConfirmationTone); + StringLoader::Load ( myDisplayMessage, R_STR_XDM_CONF_COMPULSORY ); + return (query->ExecuteLD( R_CONFIRMATION_QUERY, myDisplayMessage )); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::DeleteXDMSetIfExistL() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::DeleteXDMSetIfExistL() + { + TRAPD(err, TXdmSettingsApi::RemoveCollectionL(iData->iSettingId)); + if ( (err!=KErrNone) && (err!=KErrNotFound) ) + { + User::LeaveIfError(err); + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::IsExitProcessingOKL() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::IsExitProcessingOKL() + { + if (AreCompulsoryItemsFilled()) + { + return SaveOrCreateAndSaveXDMSetL(ETrue); + } + else + { + if (DisplayDeleteOrDontSaveDialogL()) + { + DeleteXDMSetIfExistL(); + } + else + { + return EFalse; + } + } + return ETrue; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::SaveSettingsIfPossibleL() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::SaveSettingsIfPossibleL() + { + if (AreCompulsoryItemsFilled()) + SaveOrCreateAndSaveXDMSetL(EFalse); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::SaveOrCreateAndSaveXDMSetL() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::SaveOrCreateAndSaveXDMSetL(TBool aShowDialog) + { + TBool ret = ETrue; + CXdmSettingsCollection* myXDMSet(NULL); + TInt err(KErrNotFound); // Initialize such that id not found in settings API + + // take the saveable name + iData->iSettingName = iData->iSettingNameDisp; + AknTextUtils::ConvertDigitsTo(iData->iSettingName, EDigitTypeWestern ); + + // check whether this is a new set or an existing set was edited + if ((iData->iSettingId) > NULL) // is there is valid id + { + TRAP(err, myXDMSet = TXdmSettingsApi::SettingsCollectionL + (iData->iSettingId)); + } + if(myXDMSet) + { + delete myXDMSet; // we dont need it + } + + // check if the setting name is already exist + // ask user to change name + if (IsXDMSetNameExistL(iData->iSettingName, iData->iSettingId)) + { + if (!aShowDialog) // if we cant display dialog than return. + return EFalse; + HBufC* myDisplayMessage = NULL; + CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue ); + note->SetTimeout( CAknNoteDialog::ELongTimeout ); + myDisplayMessage = StringLoader::LoadLC(R_STR_XDM_NAME_ALREADY_EXIST, iData->iSettingNameDisp); + note->ExecuteLD( *myDisplayMessage ); + CleanupStack::PopAndDestroy(1); //myDisplayMessage + iSettingList->EditItemL(ESettingNameIndex,EFalse); + return EFalse; + } + + if(err == KErrNone) // if set exists update it + { + TXdmSettingsApi::UpdatePropertyL(iData->iSettingId, + iData->iSettingName, EXdmPropName); + TXdmSettingsApi::UpdatePropertyL(iData->iSettingId, + iData->iAccessPointDes, EXdmPropToNapId); + TXdmSettingsApi::UpdatePropertyL(iData->iSettingId, + iData->iServerAddress, EXdmPropUri); + TXdmSettingsApi::UpdatePropertyL(iData->iSettingId, + iData->iUserID, EXdmPropAuthName); + TXdmSettingsApi::UpdatePropertyL(iData->iSettingId, + iData->iPassword, EXdmPropAuthSecret); + ret = ETrue; + } + + else if (err == KErrNotFound) // if set doenst exists create and save it + { + myXDMSet = new (ELeave) CXdmSettingsCollection(); + CleanupStack::PushL(myXDMSet); + myXDMSet->AppendL(iData->iSettingName, EXdmPropName); + myXDMSet->AppendL(iData->iServerAddress, EXdmPropUri); + myXDMSet->AppendL(iData->iAccessPointDes, EXdmPropToNapId); + myXDMSet->AppendL(iData->iUserID, EXdmPropAuthName); + myXDMSet->AppendL(iData->iPassword, EXdmPropAuthSecret); + TRAPD(err,TXdmSettingsApi::CreateCollectionL(*myXDMSet)); + err = err; //just to satisfy compiler + CleanupStack::PopAndDestroy(1); // myXDMSet + ret = ETrue; + } + + else + { + User::LeaveIfError(err); + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::GetSettingIdL(TDesC& aXDMSetName) +// --------------------------------------------------------------------------- +// +TInt CXDMPluginSLContainer::GetSettingIdL(TDesC& aXDMSetName) + { + TInt myId(-1); + RArray settingIds; + CleanupClosePushL(settingIds); + CDesCArray* xdmSetList =NULL; + + TBuf setName = aXDMSetName; + AknTextUtils::ConvertDigitsTo(setName, EDigitTypeWestern ); + + TRAPD(err, xdmSetList = LoadCollectionNamesL(settingIds, EFalse)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(1); //settingIds + return myId; + } + CleanupStack::PushL(xdmSetList); + + TInt xdmSetListCount = xdmSetList->Count(); + for (TInt i = 0; i< xdmSetListCount; i++) + { + if (!((xdmSetList->MdcaPoint(i)).Compare(setName))) // if equal + { + myId = settingIds[i]; + break; + } + } + CleanupStack::PopAndDestroy(2); //xdmSetList,settingIds + return myId; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::IsXDMSetNameExistL(TDesC& aXDMSetName, TInt32& aSettingId) +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::IsXDMSetNameExistL(TDesC& aXDMSetName, TInt32& aSettingId) + { + TBool ret(EFalse); + RArray settingIds; + CleanupClosePushL(settingIds); + CDesCArray* xdmSetList = NULL; + + TBuf setName = aXDMSetName; + AknTextUtils::ConvertDigitsTo(setName, EDigitTypeWestern ); + + TRAPD(err, xdmSetList = LoadCollectionNamesL(settingIds, EFalse)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(1); //settingIds + return EFalse; + } + CleanupStack::PushL(xdmSetList); + + TInt xdmSetListCount = xdmSetList->Count(); + for (TInt i = 0; i< xdmSetListCount; i++) + { + if (!((xdmSetList->MdcaPoint(i)).Compare(setName))) // if equal + { + if (settingIds[i] != aSettingId) // if the set is not itself + { + ret = ETrue; + } + } + } + CleanupStack::PopAndDestroy(2); //xdmSetList,settingIds + return ret; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::LoadCollectionNamesL +// --------------------------------------------------------------------------- +// +CDesCArray* CXDMPluginSLContainer::LoadCollectionNamesL(RArray& aSettingIDs + , TBool aDisp) + { + CDesCArray* myArray = TXdmSettingsApi::CollectionNamesLC(aSettingIDs); + TBuf name; + if(aDisp) // convert all names to disp names + { + TInt count = myArray->Count(); + CDesCArray* dispArray = new CDesCArrayFlat(count+1); + CleanupStack::PushL(dispArray); + for(TInt i=0;iMdcaPoint(i)); + AknTextUtils::LanguageSpecificNumberConversion(name); + TPtrC16 ptr = name; + dispArray->AppendL(ptr); + } + CleanupStack::Pop(2); + return dispArray; + } + CleanupStack::Pop(1); // myArray + return myArray; + } + +// --------------------------------------------------------- +// CXDMPluginSLContainer::GetHelpContext +// This function is called when Help application is launched +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CXDMPluginSLContainer::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = KGSXDMPluginUid; + aContext.iContext = KXDM_HLP_EDIT_SET; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::HandleResourceChange() +// --------------------------------------------------------------------------- +void CXDMPluginSLContainer::HandleResourceChange( TInt aType ) + { + CCoeControl::HandleResourceChange( aType ); + if ( aType == KAknsMessageSkinChange || + aType == KEikDynamicLayoutVariantSwitch ) + { + CXDMPlugin* iTempView = static_cast (iView); + iTempView->HandleResourceChangeManual(aType); + } + } + + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::HandleResourceChangeManual() +// --------------------------------------------------------------------------- +void CXDMPluginSLContainer::HandleResourceChangeManual(TInt aType) + { + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, + mainPaneRect); + SetRect( mainPaneRect ); + DrawDeferred(); + + iSettingList->HandleResourceChange(aType); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::FocusChanged +// Set focus on the selected listbox. For animated skins feature. +// --------------------------------------------------------------------------- +void CXDMPluginSLContainer::FocusChanged(TDrawNow aDrawNow) + { + if(iSettingList) + { + iSettingList->SetFocus( IsFocused(), aDrawNow ); + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::GetCurrentSetName() +// See header for details. +// --------------------------------------------------------------------------- +// +TDes& CXDMPluginSLContainer::GetCurrentSetName() + { + return iData->iSettingName; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::DoMakeValidNameL() +// See header for details. +// --------------------------------------------------------------------------- +// +HBufC* CXDMPluginSLContainer::DoMakeValidNameL(HBufC* aName, TBool& aChanged) + { + aChanged = EFalse; + HBufC* temp = HBufC::NewLC( KMaxSettingSetNameLength ); + HBufC* temp2 = HBufC::NewLC( KMaxSettingSetNameLength ); + + HBufC* corrname = EnsureMaxLengthLC( aName, aChanged); + *temp = *corrname; + TInt postfix( 0 ); + TInt pf( 0 ); + TInt i( 0 ); + + + // Load the names + RArray settingIDs; + CleanupClosePushL(settingIDs); + CDesCArray* xdmSetList = NULL; + + TRAPD(err, xdmSetList = LoadCollectionNamesL(settingIDs, EFalse)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(4); //settingIds + return corrname; + } + CleanupStack::PushL(xdmSetList); + + // do the actual checking of name + TInt found(0); + TInt pos(0); + + TPtrC prefix = GetPrefix( *corrname ); + + postfix = GetPostfix( *temp, prefix ); + postfix = -1; + do + { + found = xdmSetList->Find( *temp, pos ); + if ( found == KErrNone ) + { + aChanged = ETrue; + postfix++; + // check the length of postfix, check text length accordingly + pf = postfix; + for (i=1; i<10; i++) + { + pf /= 10; + if ( !pf ) + break; + } + TPtr sgdptr( temp->Des() ); + TPtr sgdptr2( temp2->Des() ); + if ( postfix ) + { + if ( postfix < 10 ) + { + sgdptr2 = prefix.Left( KMaxSettingSetNameLength - i - 3 ); + } + else + { + sgdptr2 = prefix.Left( KMaxSettingSetNameLength - i - 2 ); + } + } + else + { + sgdptr2 = prefix.Left( KMaxSettingSetNameLength ); + } + if ( postfix ) + { + if ( postfix > 9 ) + { + sgdptr.Format( KFormatLargePostfix, &sgdptr2, + postfix ); + } + else + { + sgdptr.Format( KFormatPostfix, &sgdptr2, + postfix ); + } + } + else + { + sgdptr.Format( KFormatNoPostfix, &sgdptr2 ); + } + } + } while (found == KErrNone); + + CleanupStack::PopAndDestroy(xdmSetList); + CleanupStack::PopAndDestroy(1); //settingIds + CleanupStack::PopAndDestroy( corrname ); + CleanupStack::PopAndDestroy( temp2 ); + + if ( aChanged ) + { + CleanupStack::Pop( temp ); + } + else + { + CleanupStack::PopAndDestroy( temp ); + temp = NULL; + } + + return temp; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::EnsureMaxLengthLC() +// See header for details. +// --------------------------------------------------------------------------- +HBufC* CXDMPluginSLContainer::EnsureMaxLengthLC( const TDesC* aName, TBool& aChanged) + { + TInt length = aName->Length(); + + aChanged = EFalse; + + if ( !length ) + { + // Name is required. + User::Leave(KErrArgument); + } + + HBufC* corrname; + if ( KMaxSettingSetNameLength < length ) + { // name too long, truncate. + corrname = aName->Left( KMaxSettingSetNameLength ).AllocLC(); + aChanged = ETrue; + } + else + { + corrname = aName->AllocLC(); + corrname->Des().Trim(); + if ( corrname->Length() == 0 ) + { + User::Leave(KErrArgument); + } + // comes here only if name is valid + if ( corrname->Length() != aName->Length() ) + { + aChanged = ETrue; + } + } + + return corrname; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::GetPrefix() +// See header for details. +// --------------------------------------------------------------------------- +TPtrC CXDMPluginSLContainer::GetPrefix( const TDesC& aName ) + { + TPtrC prefix = aName; + TInt lastBrace = aName.LocateReverse('('); + if ( lastBrace != KErrNotFound ) + { + // aName looks like "". + // See if is an integer number. + TPtrC num = aName.Right( aName.Length() - lastBrace - 1 ); + TInt val; + TLex lex( num ); + if ( lex.Val( val ) == KErrNone ) + { + // Yes, the trailer is an integer. + prefix.Set( aName.Left( lastBrace ) ); + } + } + return prefix; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::GetPostfix() +// See header for details. +// --------------------------------------------------------------------------- +TInt CXDMPluginSLContainer::GetPostfix( const TDesC& aName, const TDesC& aPrefix ) + { + TInt postfix( KErrNotFound ); + TInt nameLength = aName.Length(); + TInt prefixLength = aPrefix.Length(); + if ( nameLength >= prefixLength && aName.FindF( aPrefix ) == 0 ) + { + // aName is longer or equal length, and + // aPrefix can be found in the beginning of aName. + if ( nameLength == prefixLength ) + { + // They have the same length; they equal. + postfix = 0; + } + else + { + if ( aName[ prefixLength ] == '(' ) + { + // (Now we know that aName is longer than aPrefix.) + // aName looks like "aPrefix". + // See if is an integer number. + TPtrC num = aName.Right( nameLength - prefixLength - 1 ); + TBuf< KMaxPostfixLength > pf; + if (num.Length() <= pf.Length()) + pf = num; + TInt val; + TLex lex( pf ); + if ( lex.Val( val ) == KErrNone ) + { + // Yes, the trailer is an integer. + if ( val > 0 ) + { + postfix = val; + } + else + { + // signal that it is invalid... + postfix = -1; + } + } + } + } + } + return postfix; + } +// end of file