/*
* Copyright (c) 2005 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: Rsfw GS plugin Settins list container
*
*/
// INCLUDE FILES
#include <akntitle.h>
#include <barsread.h>
#include <StringLoader.h>
#include <AknQueryDialog.h>
#include <aknnotewrappers.h>
#include <rsfwgspluginrsc.rsg>
#include <uri16.h>
#include "rsfwgslocalviewids.h"
#include "rsfwgsplugin.h"
#include "rsfwgsremotedrivesettingscontainer.h"
#include "rsfwgspluginsettinglist.h"
#include "rsfwgssettingsdata.h"
#include "rsfwmountman.h"
#include "rsfwmountentry.h"
#include "rsfwmountutils.h"
#include "rsfwcommon.h"
#include "mdebug.h"
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::CRsfwGsPluginDriveSettingsContainer()
// ---------------------------------------------------------------------------
//
CRsfwGsPluginDriveSettingsContainer::CRsfwGsPluginDriveSettingsContainer(CAknView* aView) : iView(aView)
{
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::ConstructL(const TRect& aRect)
// ---------------------------------------------------------------------------
//
void CRsfwGsPluginDriveSettingsContainer::ConstructL( const TRect& aRect,
CRsfwMountMan* aMountMan)
{
#ifdef _DEBUG
RDebug::Print( _L( "[CRsfwGsPluginDriveSettingsContainer] ConstructL()" ) );
#endif
iMountMan = aMountMan;
CEikStatusPane* sp = static_cast<CAknAppUi*>
( iEikonEnv->EikAppUi() )->StatusPane();
CAknTitlePane* title = static_cast<CAknTitlePane*>
( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
// Set the proper title of this list
TResourceReader rReader;
iCoeEnv->CreateResourceReaderLC( rReader, R_GS_RSFW_REMOTE_DRIVE_SETTINGS_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 = CRsfwGsSettingsData::NewL();
// construct control and set parent
iSettingList = CRsfwGsPluginSettingsList::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
iEikonEnv->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();
iCoeEnv->AddForegroundObserverL( *this );
SetRect( aRect );
ActivateL();
#ifdef _DEBUG
RDebug::Print( _L( "[CRsfwGsPluginDriveSettingsContainer] Construct done" ) );
#endif
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::~CRsfwGsPluginDriveSettingsContainer()
// ---------------------------------------------------------------------------
//
CRsfwGsPluginDriveSettingsContainer::~CRsfwGsPluginDriveSettingsContainer()
{
iCoeEnv->RemoveForegroundObserver( *this );
if (iData)
delete iData;
if(iSettingList) // if setting list has been created
{
delete iSettingList;
iSettingList = NULL;
}
// Ecom session is used to make sure that user gives address
// that corresponds to some installed access plugin
// (currently via mountils::isaddressvalid)
// this closes the session (if not in use anymore)
REComSession::FinalClose();
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::SizeChanged()
// ---------------------------------------------------------------------------
//
void CRsfwGsPluginDriveSettingsContainer::SizeChanged()
{
iSettingList->SetRect(Rect());
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::CountComponentControls() const
// ---------------------------------------------------------------------------
//
TInt CRsfwGsPluginDriveSettingsContainer::CountComponentControls() const
{
return 1;
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::ComponentControl( TInt aIndex ) const
// ---------------------------------------------------------------------------
//
CCoeControl* CRsfwGsPluginDriveSettingsContainer::ComponentControl( TInt aIndex ) const
{
switch ( aIndex )
{
case 0:
return iSettingList;
default:
return NULL;
}
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::EditCurrentItemL()
// ---------------------------------------------------------------------------
//
void CRsfwGsPluginDriveSettingsContainer::EditCurrentItemL()
{
iSettingList->EditCurrentItemL();
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::OfferKeyEventL()
// ---------------------------------------------------------------------------
//
TKeyResponse CRsfwGsPluginDriveSettingsContainer::OfferKeyEventL(
const TKeyEvent& aKeyEvent,
TEventCode aType )
{
if (iSettingList)
return iSettingList->OfferKeyEventL(aKeyEvent, aType);
else
return EKeyWasNotConsumed;
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::Draw(const TRect& aRect) const
// ---------------------------------------------------------------------------
//
void CRsfwGsPluginDriveSettingsContainer::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
gc.Clear(aRect);
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::HandleListBoxEventL()
// ---------------------------------------------------------------------------
//
void CRsfwGsPluginDriveSettingsContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aListBoxEvent)
{
// if the Select Key has been pressed
if ((aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed) ||
(aListBoxEvent == MEikListBoxObserver::EEventItemSingleClicked))
{
iSettingList->EditCurrentItemL();
}
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::PrepareRemoteDriveForEditingL(TDesC& aRemoteDriveName)
// ---------------------------------------------------------------------------
//
void CRsfwGsPluginDriveSettingsContainer::PrepareRemoteDriveForEditingL(const TDesC& aRemoteDriveName)
{
DEBUGSTRING(("CRsfwGsPluginDriveSettingsContainer::PrepareRemoteDriveForEditingL enter"));
const CRsfwMountEntry* mountEntry = NULL;
// read the source setting
DEBUGSTRING(("read the source setting"));
mountEntry = iMountMan->MountEntryL(aRemoteDriveName);
User::LeaveIfNull((TAny *)mountEntry);
// compulsory fields
DEBUGSTRING(("compulsory fields"));
iData->Reset();
iData->iSettingName = *(mountEntry->Item(EMountEntryItemName));
iData->iURL =*(mountEntry->Item(EMountEntryItemUri));
const HBufC* drive = (mountEntry->Item(EMountEntryItemDrive));
if (drive && drive->Length())
{
iData->iDriveLetter =(*drive)[0];
}
// optional fields
DEBUGSTRING(("optional fields"));
if (mountEntry->Item(EMountEntryItemUserName))
{
DEBUGSTRING(("setting user id"));
iData->iUserID = *(mountEntry->Item(EMountEntryItemUserName));
}
if (mountEntry->Item(EMountEntryItemPassword))
{
DEBUGSTRING(("setting passwd"));
iData->iPassword = *(mountEntry->Item(EMountEntryItemPassword));
}
if (mountEntry->Item(EMountEntryItemIap))
{
DEBUGSTRING16(("setting access pointDes to %S", (mountEntry->Item(EMountEntryItemIap))));
iData->iAccessPointDes = *(mountEntry->Item(EMountEntryItemIap));
// if the access point name returned from CenRep was '?', set it to "None" in UI
if (iData->iAccessPointDes == KIapAskUser)
{
iData->iAccessPointName = KNullDesC;
}
else
{
// try to resolve access point id into name
TLex lex(iData->iAccessPointDes);
TInt ap, err;
err = lex.Val(ap);
if (!err)
{
iSettingList->GetAccessPointNameL(ap, iData->iAccessPointName);
DEBUGSTRING(("setting access point"));
iData->iAccessPoint = ap;
}
else
{
DEBUGSTRING(("setting access point name"));
iData->iAccessPointName = KNullDesC;
}
}
}
DEBUGSTRING(("iData constructed"));
iSettingList->LoadSettingsL();
SetTitlePaneTextL(iData->iSettingName);
iSettingList->ResetItemIndex();
DEBUGSTRING(("CRsfwGsPluginDriveSettingsContainer::PrepareRemoteDriveForEditingL exit"));
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::PrepareRemoteDriveNewDefaultL(TDesC& aRemoteDriveName);
// ---------------------------------------------------------------------------
//
void CRsfwGsPluginDriveSettingsContainer::PrepareRemoteDriveNewDefaultL(TDesC& aRemoteDriveName)
{
iData->Reset();
iData->iSettingName = aRemoteDriveName;
iSettingList->LoadSettingsL();
iSettingList->ResetItemIndex();
iSettingList->DrawDeferred();
SetTitlePaneTextL(iData->iSettingName);
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::SetTitlePaneTextL( const TDesC& aTitleText ) const
// ---------------------------------------------------------------------------
//
void CRsfwGsPluginDriveSettingsContainer::SetTitlePaneTextL( const TDesC& aTitleText ) const
{
CAknTitlePane* title = static_cast< CAknTitlePane* >
( iEikonEnv->AppUiFactory()->StatusPane()->ControlL(
TUid::Uid( EEikStatusPaneUidTitle ) ) );
if ( !title )
{
User::Leave( KErrNotSupported );
}
title->SetTextL( aTitleText );
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::AreCompulsoryItemsFilled()
// ---------------------------------------------------------------------------
//
TBool CRsfwGsPluginDriveSettingsContainer::AreCompulsoryItemsFilled()
{
TUriParser uriParser;
uriParser.Parse(iData->iURL);
HBufC* host = HBufC::NewL(KMaxURLLength);
TPtr hostPtr = host->Des();
hostPtr = uriParser.Extract(EUriHost);
if ( ((iData->iSettingName)!=KNullDesC) && (hostPtr!=KNullDesC))
{
delete host;
return ETrue;
}
delete host;
return EFalse;
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::DisplayDeleteOrDontSaveDialog()
// ---------------------------------------------------------------------------
//
TBool CRsfwGsPluginDriveSettingsContainer::DisplayDeleteOrDontSaveDialogL()
{
HBufC* myDisplayMessage = NULL;
myDisplayMessage = StringLoader::LoadLC(R_STR_REMOTE_DRIVE_CONF_COMPULSORY);
CAknQueryDialog* query = CAknQueryDialog::NewL
(CAknQueryDialog::EConfirmationTone);
TBool answer = query->ExecuteLD( R_CONFIRMATION_QUERY, *myDisplayMessage );
CleanupStack::PopAndDestroy(myDisplayMessage);
return answer;
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::DeleteremoteDriveIfExistL()
// ---------------------------------------------------------------------------
//
void CRsfwGsPluginDriveSettingsContainer::DeleteRemoteDriveIfExistL()
{
iMountMan->DeleteMountEntryL(iData->iDriveLetter);
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::IsExitProcessingOKL()
// ---------------------------------------------------------------------------
//
TBool CRsfwGsPluginDriveSettingsContainer::IsExitProcessingOKL()
{
if (AreCompulsoryItemsFilled())
{
if (!(RsfwMountUtils::IsFriendlyNameValid(iData->iSettingName)))
{
HBufC* myDisplayMessage = NULL;
myDisplayMessage = StringLoader::LoadLC(R_STR_RSFW_ERROR_ILLEGAL_CHARACTERS);
CAknErrorNote* errorNote = new CAknErrorNote(EFalse);
errorNote->ExecuteLD(*myDisplayMessage);
CleanupStack::PopAndDestroy(myDisplayMessage);
iSettingList->ListBox()->SetCurrentItemIndex(ESettingItemDriveName-1);
return EFalse;
}
// Uri must contain some scheme, like http:// or upnp://
if (!IsDriveAddressValidL(iData->iURL))
{
HBufC* myDisplayMessage = NULL;
myDisplayMessage = StringLoader::LoadLC(R_STR_RSFW_ERROR_ILLEGAL_ADDRESS);
CAknNoteDialog* noteDlg = new ( ELeave ) CAknNoteDialog( );
noteDlg->SetTextL( *myDisplayMessage );
noteDlg->ExecuteLD( R_RSFW_INFORMATION_NOTE );
CleanupStack::PopAndDestroy(myDisplayMessage);
iSettingList->ListBox()->SetCurrentItemIndex(ESettingItemURL-1);
return EFalse;
}
// settings seem to be ok
return SaveOrCreateAndSaveRemoteDriveL(ETrue);
}
else
{
if (DisplayDeleteOrDontSaveDialogL())
{
DeleteRemoteDriveIfExistL();
}
else
{
// set focus on the address field as that is the first (and only)
// unfilled compulsary setting field
iSettingList->ListBox()->SetCurrentItemIndex(ESettingItemURL-1);
return EFalse;
}
}
return ETrue;
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::SaveSettingsL
// Attempts to save settings
// ---------------------------------------------------------------------------
void CRsfwGsPluginDriveSettingsContainer::SaveSettingsL()
{
if (AreCompulsoryItemsFilled())
{
if (!(RsfwMountUtils::IsFriendlyNameValid(iData->iSettingName)))
{
return;
}
// Uri must contain some scheme, like http:// or upnp://
if (!IsDriveAddressValidL(iData->iURL))
{
return;
}
// settings seem to be ok
SaveOrCreateAndSaveRemoteDriveL(EFalse);
}
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::SaveOrCreateAndSaveremoteDriveL()
// ---------------------------------------------------------------------------
//
TBool CRsfwGsPluginDriveSettingsContainer::SaveOrCreateAndSaveRemoteDriveL(TBool aShowDialog)
{
// try to get mountentry with this drive letter
const CRsfwMountEntry* existingMountEntry = iMountMan->MountEntryL(iData->iDriveLetter);
// to keep names unique check if the setting with this name is already exist
// ask user to change name
TBool isConflict;
if (existingMountEntry)
{
isConflict = IsRemoteDriveNameConflictL(iData->iSettingName, *(existingMountEntry->Item(EMountEntryItemDrive)));
}
else
{
TBuf<5> bogusDrive;
bogusDrive.Append(_L("C:\\"));
isConflict = IsRemoteDriveNameConflictL(iData->iSettingName, bogusDrive);
}
if (isConflict)
{
if (aShowDialog)
{
HBufC* myFormatMessage = NULL;
if ( iData->iSettingName.Length() )
{
myFormatMessage = StringLoader::LoadLC( R_STR_REMOTE_DRIVE_NAME_ALREADY_EXIST, iData->iSettingName);
}
else
{
myFormatMessage = StringLoader::LoadLC( R_STR_REMOTE_DRIVE_NAME_ALREADY_EXIST );
}
CAknErrorNote* note = new CAknErrorNote(EFalse);
note->SetTimeout( CAknNoteDialog::ELongTimeout );
note->ExecuteLD( *myFormatMessage );
CleanupStack::PopAndDestroy(myFormatMessage);
// set focus to drive
iSettingList->ListBox()->SetCurrentItemIndex(ESettingItemDriveName-1);
}
return EFalse;
}
else if (!existingMountEntry || DataChanged(existingMountEntry))
{
CRsfwMountEntry* newMountEntry = CRsfwMountEntry::NewLC();
if (existingMountEntry)
{
// the same drive letter must be set as it is the key
newMountEntry->SetItemL(EMountEntryItemDrive, *(existingMountEntry->Item(EMountEntryItemDrive)));
}
newMountEntry->SetItemL(EMountEntryItemName, iData->iSettingName);
newMountEntry->SetItemL(EMountEntryItemUri, iData->iURL);
if ((iData->iUserID)!=KNullDesC)
{
newMountEntry->SetItemL(EMountEntryItemUserName, iData->iUserID);
}
if ((iData->iPassword)!=KNullDesC)
{
newMountEntry->SetItemL(EMountEntryItemPassword, iData->iPassword);
}
if ((iData->iAccessPointDes)!=KNullDesC)
{
newMountEntry->SetItemL(EMountEntryItemIap, iData->iAccessPointDes);
}
else
{
newMountEntry->SetItemL(EMountEntryItemIap, KIapAskUser);
}
newMountEntry->SetItemL(EMountEntryItemInactivityTimeout, iData->iInActivityTimeout);
// depending on whether this is new mount created or existing mount edited
// choose proper method from MountMan API
// pop here from the stack since ownership is passed to the mountman
CleanupStack::Pop(newMountEntry);
if (!existingMountEntry)
{
iMountMan->AddMountEntryL(newMountEntry);
}
else
{
iMountMan->EditMountEntryL(newMountEntry);
}
}
return ETrue;
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::DataChanged
// ---------------------------------------------------------------------------
//
TBool CRsfwGsPluginDriveSettingsContainer::DataChanged(const CRsfwMountEntry* aCurrentData)
{
if (!aCurrentData)
{
return ETrue;
}
// compulsary settings
if (iData->iSettingName != *(aCurrentData->Item(EMountEntryItemName)))
{
return ETrue;
}
if (iData->iURL != *(aCurrentData->Item(EMountEntryItemUri)))
{
return ETrue;
}
// optional settings
if (!aCurrentData->Item(EMountEntryItemUserName))
{
if (iData->iUserID != KNullDesC)
{
return ETrue;
}
}
else
{
if (iData->iUserID != *(aCurrentData->Item(EMountEntryItemUserName)))
{
return ETrue;
}
}
if (!aCurrentData->Item(EMountEntryItemPassword))
{
if (iData->iPassword != KNullDesC)
{
return ETrue;
}
}
else
{
if (iData->iPassword != *(aCurrentData->Item(EMountEntryItemPassword)))
{
return ETrue;
}
}
if (!aCurrentData->Item(EMountEntryItemIap))
{
if (iData->iAccessPointDes != KNullDesC)
{
return ETrue;
}
}
else
{
if (iData->iAccessPointDes != *(aCurrentData->Item(EMountEntryItemIap)))
{
return ETrue;
}
}
return EFalse;
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::IsRemoteDriveNameExistL(TDesC& aremoteDriveName)
//
// ---------------------------------------------------------------------------
//
TBool CRsfwGsPluginDriveSettingsContainer::IsRemoteDriveNameConflictL(
TDesC& aRemoteDriveName,
const TDesC& aDriveLetter)
{
TBool ret(EFalse);
CDesCArray* remoteDriveList = NULL;
TRAPD(err, remoteDriveList = LoadRemoteDriveNamesL());
if(err!=KErrNone)
{
return EFalse;
}
CleanupStack::PushL(remoteDriveList);
TInt remoteDriveListCount = remoteDriveList->Count();
for (TInt i = 0; i< remoteDriveListCount; i++)
{
if (!((remoteDriveList->MdcaPoint(i)).CompareF(aRemoteDriveName))) // if equal
{
// check whether the drive letter is the same or not
const CRsfwMountEntry* existingDrive =
iMountMan->MountEntryL(aRemoteDriveName);
if ((existingDrive->Item(EMountEntryItemDrive))->Compare(aDriveLetter) == 0 )
{
ret = EFalse;
}
else
{
ret = ETrue;
}
break;
}
}
CleanupStack::PopAndDestroy(remoteDriveList);
return ret;
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::IsDriveAddressValidL
// ---------------------------------------------------------------------------
//
TBool CRsfwGsPluginDriveSettingsContainer::IsDriveAddressValidL(const TDesC& aDriveAddress)
{
HBufC8* urlBuffer = HBufC8::NewL(KMaxURLLength);
TPtr8 bufPtr = urlBuffer->Des();
bufPtr.Append(aDriveAddress);
TBool isAddressValid = RsfwMountUtils::IsDriveAddressValid(*urlBuffer);
delete urlBuffer;
return isAddressValid;
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::LoadRemoteDriveNamesL
// ---------------------------------------------------------------------------
//
CDesCArray* CRsfwGsPluginDriveSettingsContainer::LoadRemoteDriveNamesL()
{
CDesCArray* myArray = new (ELeave) CDesC16ArraySeg(4);
iMountMan->GetMountNamesL(myArray);
return myArray;
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::HandleResourceChange()
// ---------------------------------------------------------------------------
void CRsfwGsPluginDriveSettingsContainer::HandleResourceChange( TInt aType )
{
if ( aType == KAknsMessageSkinChange ||
aType == KEikDynamicLayoutVariantSwitch )
{
if (aType != KAknsMessageSkinChange)
{
TRect mainPaneRect;
AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
mainPaneRect);
SetRect( mainPaneRect );
}
DrawDeferred();
CRsfwGsPlugin* tempView = static_cast<CRsfwGsPlugin*> (iView);
tempView->HandleResourceChangeManual(aType);
}
CCoeControl::HandleResourceChange( aType );
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::HandleResourceChangeManual()
// ---------------------------------------------------------------------------
void CRsfwGsPluginDriveSettingsContainer::HandleResourceChangeManual(TInt aType)
{
if (aType != KAknsMessageSkinChange)
{
TRect mainPaneRect;
AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
mainPaneRect);
SetRect( mainPaneRect );
}
DrawDeferred();
iSettingList->HandleResourceChange(aType);
}
// ---------------------------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::FocusChanged
// Set focus on the selected listbox. For animated skins feature.
// ---------------------------------------------------------------------------
void CRsfwGsPluginDriveSettingsContainer::FocusChanged(TDrawNow /*aDrawNow*/)
{
if(iSettingList)
{
iSettingList->SetFocus( IsFocused() );
}
}
// ---------------------------------------------------------
// CRsfwGsPluginDriveSettingsContainer::GetHelpContext
// This function is called when Help application is launched
// ---------------------------------------------------------
//
void CRsfwGsPluginDriveSettingsContainer::GetHelpContext( TCoeHelpContext& aContext ) const
{
aContext.iMajor = KGSRsfwPluginUID;
// aContext.iContext = KRSFW_HLP_EDIT_SET;
}
TDes& CRsfwGsPluginDriveSettingsContainer::GetCurrentRemoteDriveName()
{
return iData->iSettingName;
}
// from MCoeForegroundObserver
void CRsfwGsPluginDriveSettingsContainer::HandleGainingForeground()
{
}
void CRsfwGsPluginDriveSettingsContainer::HandleLosingForeground()
{
}
// End of File