--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/networkingutils/nameresolverutility/src/nslookup.cpp Tue Jan 26 15:16:33 2010 +0200
@@ -0,0 +1,989 @@
+// Copyright (c) 2004-2009 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:
+// nslookup.cpp - nslookup client main module
+//
+
+#include <coemain.h>
+#include <eikenv.h>
+#include <eikdef.h>
+#include <eikappui.h>
+#include <eikapp.h>
+#include <techview/eikdialg.h>
+#include <eikdoc.h>
+#include <techview/eikchkbx.h>
+#include <techview/eiktbar.h>
+#include <techview/eikedwin.h>
+
+#if EPOC_SDK >= 0x06000000
+# include <techview/eikon.hrh>
+#else
+# include <eikdialg.hrh>
+# include <eikedwin.hrh>
+# include <eikcmds.hrh>
+#endif
+
+#ifdef MAKE_EXE_APPLICATION
+#include <eikstart.h>
+#endif
+
+#include <nslookup.rsg>
+#include "engine.h"
+#include "nslookup.hrh"
+#include "nslookup.h"
+
+#ifdef CALYPSO
+#include <AknTextSettingPage.h>
+#endif
+
+//
+// CConsoleControl
+//
+
+
+CConsoleControl::~CConsoleControl()
+ {
+ delete iConsole;
+ }
+
+void CConsoleControl::ConstructL(const TPoint& aTopLeft, const TSize& aSize, TInt aFlags)
+ {
+ TRect rect(aTopLeft,aTopLeft + aSize.AsPoint());
+#if EPOC_SDK >= 0x06000000
+ SetRect(rect);
+#else
+ SetRectL(rect);
+#endif
+ iConsole=new(ELeave) CEikConsoleScreen;
+ iConsole->ConstructL(_L("TEST"),aTopLeft,aSize,aFlags,EEikConsWinInPixels);
+ iConsole->SetHistorySizeL(200,0);
+ iHistory=200;
+ }
+
+void CConsoleControl::ActivateL()
+ {
+ CCoeControl::ActivateL();
+ iConsole->SetKeepCursorInSight(TRUE);
+ iConsole->DrawCursor();
+ iConsole->SetAtt(ATT_NORMAL);
+ }
+
+
+void CConsoleControl::HandleCommandL(TInt /* aCommand */)
+ {
+ }
+
+void CConsoleControl::FocusChanged(TDrawNow aDrawNow)
+ {
+ iConsole->ConsoleControl()->SetFocus(IsFocused(), aDrawNow);
+ }
+
+
+void CConsoleControl::SetScrollBarVisibilityL(CEikScrollBarFrame::TScrollBarVisibility aHBarVisibility, CEikScrollBarFrame::TScrollBarVisibility aVBarVisibility)
+ {
+ iConsole->SetScrollBarVisibilityL(aHBarVisibility,aVBarVisibility);
+ iConsole->ConsoleControl()->UpdateArea();
+ iConsole->UpdateScrollBars();
+ iConsole->ConsoleControl()->UpdateArea();
+ }
+
+
+void CConsoleControl::DrawCursor()
+ {
+ iConsole->DrawCursor();
+ }
+
+
+void CConsoleControl::Write(const TDesC &aMsg)
+ {
+ iConsole->Write(aMsg);
+ iConsole->FlushChars();
+ }
+
+
+
+CEikConsoleControl *CConsoleControl::ConsoleControl() const
+ {
+ return iConsole->ConsoleControl();
+ }
+
+TBool CConsoleControl::UpdateScrollBars()
+ {
+ return iConsole->UpdateScrollBars();
+ }
+
+void CConsoleControl::ClearScreen()
+ {
+ iConsole->ClearScreen();
+ }
+
+
+void CConsoleControl::Redraw(const TRect &aRect)
+ {
+ iConsole->Redraw(aRect);
+ }
+
+void CConsoleControl::Lf()
+ {
+ iConsole->Lf();
+ }
+
+
+TSize CConsoleControl::ScreenSize() const
+ {
+ return iConsole->ScreenSize();
+ }
+
+
+CNslookupView::CNslookupView(CNslookup *aModel)
+ {
+ iModel = aModel;
+ }
+
+void CNslookupView::ConstructL(const TRect& aRect)
+{
+ CreateWindowL();
+ Window().SetShadowDisabled(ETrue);
+ iContext=this;
+ iBrushStyle=CGraphicsContext::ESolidBrush;
+ iBrushColor=KRgbWhite;
+#if EPOC_SDK >= 0x06000000
+ SetRect(aRect);
+#else
+ SetRectL(aRect);
+#endif
+
+ // Create its only component, a CNslookupContainer
+
+ iContainer = new(ELeave) CNslookupContainer(iModel);
+ iContainer->SetContainerWindowL(*this);
+ TRect containerRect = Rect();
+ iContainer->ConstructL(containerRect);
+
+ ActivateL();
+ DrawNow();
+}
+
+CNslookupView::~CNslookupView()
+ {
+
+ delete iContainer;
+ }
+
+TInt CNslookupView::CountComponentControls() const
+ {
+ return 1; //Just the container
+ }
+
+CCoeControl* CNslookupView::ComponentControl(TInt /*aIndex*/) const
+ {
+ return iContainer;
+ }
+
+
+void CNslookupView::ResetScreen()
+{
+ iContainer->ResetScreen();
+}
+
+
+TKeyResponse CNslookupView::OfferKeyEventL(const TKeyEvent& /*aKeyEvent*/,TEventCode /*aType*/)
+{
+ return EKeyWasNotConsumed;
+}
+
+void CNslookupView::Draw(const TRect& /*aRect*/) const
+ {
+
+ CWindowGc& gc = SystemGc();
+ gc.SetPenStyle(CGraphicsContext::ENullPen);
+ gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+ gc.DrawRect(Rect());
+
+ }
+
+
+//
+// CNslookupcontainer
+//
+const TInt KLabelHeight=25;
+
+
+ // Construction
+CNslookupContainer::CNslookupContainer(CNslookup* aModel)
+ {
+ iModel = aModel;
+ }
+
+
+// Destruction
+CNslookupContainer::~CNslookupContainer()
+{
+ delete iLabel;
+ delete iLabel2;
+ delete iConsole;
+}
+
+void CNslookupContainer::ConstructL(const TRect& aRect)
+{
+ iModel->SetConsole(this);
+
+#if EPOC_SDK >= 0x06000000
+ SetRect(aRect);
+#else
+ SetRectL(aRect);
+#endif
+
+ TRect rect=Rect();
+ rect.iTl.iY += KLabelHeight; // make way for top label
+ rect.iBr.iY -= KLabelHeight; // make way for bottom label
+
+ CreateConsoleL(rect);
+
+ //Bottom label
+ iLabel=new (ELeave) CEikLabel;
+ rect=Rect();
+ rect.iTl.iY=rect.iBr.iY-KLabelHeight; // make it bottom 20 pixels
+ iLabel->SetContainerWindowL(*this);
+#if EPOC_SDK >= 0x06000000
+ iLabel->SetRect(rect);
+#else
+ iLabel->SetRectL(rect);
+#endif
+ iLabel->SetAlignment(EHLeftVCenter); // center text
+ iLabel->SetBufferReserveLengthL(500); // nice long buffer
+ iLabel->SetTextL(_L("ok")); // Label needs to have some content to prevent panics..
+ //Top label
+ iLabel2=new (ELeave) CEikLabel;
+ rect=Rect();
+ rect.iBr.iY=rect.iTl.iY+KLabelHeight; // make it top 20 pixels
+ iLabel2->SetContainerWindowL(*this);
+#if EPOC_SDK >= 0x06000000
+ iLabel2->SetRect(rect);
+#else
+ iLabel2->SetRectL(rect);
+#endif
+ iLabel2->SetAlignment(EHLeftVCenter); // center text
+ iLabel2->SetBufferReserveLengthL(500); // nice long buffer
+ WriteHostL(_L("<None>"));
+ ActivateL();
+}
+
+
+void CNslookupContainer::CreateConsoleL(const TRect& aRect)
+{
+ iConsole = new(ELeave) CConsoleControl;
+#if defined(CRYSTAL) //This is a patch to put the console in the right place.
+ //For some unknown reason appears displaced.
+ aRect.iBr.iX += 92;
+ aRect.iTl.iX += 92;
+ iConsole->ConstructL(aRect.iTl, aRect.Size(), CEikConsoleScreen::ENoInitialCursor);
+#elif defined(CALYPSO)
+ TSize size;
+ size.iHeight = aRect.iBr.iY - aRect.iTl.iY;
+ size.iWidth = aRect.iBr.iX - aRect.iTl.iX - 10; // -10 to leave some space on the right
+ // (based on trial and error)
+ TPoint position;
+ position.iY = 70; // To skip the status pane and host name field (based on trial and error)
+ position.iX = 5; // 5 to leave some space on the left (based on trial and error)
+
+ iConsole->ConstructL(position, size, CEikConsoleScreen::ENoInitialCursor);
+#else
+ iConsole->ConstructL(aRect.iTl, aRect.Size(), CEikConsoleScreen::ENoInitialCursor);
+#endif
+
+ iConsole->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff,CEikScrollBarFrame::EAuto);
+}
+
+void CNslookupContainer::ResetScreen()
+ {
+ iConsole->ClearScreen();
+ }
+
+void CNslookupContainer::WriteHostL(const TDesC& aHostname)
+{
+ TBuf<100> aux;
+
+ aux.Append(aHostname);
+
+ iLabel2->SetTextL(aux);
+ iLabel2->DrawNow();
+}
+
+
+void CNslookupContainer::WriteLine(const TDesC& abuf)
+ {
+ iConsole->Write(abuf);
+ }
+
+TKeyResponse CNslookupContainer::OfferKeyEventL(const TKeyEvent& /*aKeyEvent*/,TEventCode /*aType*/)
+ {
+ return EKeyWasNotConsumed;
+ }
+
+// Virtual, defined by CCoeControl; replaces the default implementation
+// provided by CCoeControl.
+void CNslookupContainer::Draw(const TRect& aRect) const
+{
+ CWindowGc& gc = SystemGc();
+ gc.SetClippingRect(aRect);
+ gc.DrawRect(Rect());
+
+}
+
+// Virtual, defined by CCoeControl; replaces the default implementation
+// provided by CCoeControl.
+TInt CNslookupContainer::CountComponentControls() const
+{
+ return 3;
+}
+
+// Virtual, defined by CCoeControl; replaces the default implementation
+// provided by CCoeControl.
+CCoeControl* CNslookupContainer::ComponentControl(TInt aIndex) const
+{
+ switch (aIndex)
+ {
+ case 0: return iLabel;
+ case 1: return iLabel2;
+ case 2: return iConsole;
+ //case 2: return iEdit;
+ default: break;
+ }
+
+ return NULL;
+}
+
+// Defined as pure virtual by the mixin class MCoeControlObserver
+// inherited by CCoeControl. An empty implementation provided by
+// this class (its containees do not report events).
+void CNslookupContainer::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
+{
+
+
+}
+
+
+//
+// CHostNameDialog
+//
+#ifdef CALYPSO
+CHostNameDialog::CHostNameDialog(TDes& aHostname) : CAknTextQueryDialog(aHostname)
+{
+}
+#else
+CHostNameDialog::CHostNameDialog(CNslookup *aModel):CEikDialog()
+{
+ iModel=aModel;
+}
+#endif
+
+// Checks if data entered by user is correct
+// returns ETrue to exit dialog anf EFalse to not exit it (no name entered)
+
+#ifdef CALYPSO
+TBool CHostNameDialog::OkToExitL(TInt aButton)
+{
+ return CAknTextQueryDialog::OkToExitL(aButton);
+}
+#else
+TBool CHostNameDialog::OkToExitL(TInt aButton)
+{
+ iModel->iQueryType = ChoiceListCurrentItem(ENslookupQueryType);
+ iModel->iShowSource = (CheckBoxState(ENslookupShowSource)== CEikButtonBase::ESet);
+
+ TBuf<KHostNameLimit> hostname(_L(""));
+ if (aButton==EEikBidCancel) //CANCEL BUTTON
+ {
+ iOKPressed=EFalse;
+ return ETrue;
+ }
+
+ GetEdwinText(hostname,ENslookupHostName);
+
+ if (hostname.Length()!=0)
+ {
+ iModel->SetHostName(hostname);
+ return ETrue;
+ }
+ else
+ return EFalse; //If no hostname specified can't continue
+
+}
+#endif // CALYPSO
+
+//To initialize dialog data
+#ifdef CALYPSO
+void CHostNameDialog::PreLayoutDynInitL()
+{
+ CAknTextQueryDialog::PreLayoutDynInitL();
+}
+#else
+void CHostNameDialog::PreLayoutDynInitL()
+{
+ SetCheckBoxState(ENslookupShowSource, iModel->iShowSource ? CEikButtonBase::ESet : CEikButtonBase::EClear);
+ SetChoiceListCurrentItem(ENslookupQueryType, iModel->iQueryType);
+ SetEdwinTextL(ENslookupHostName,iModel->GetHostName());
+}
+#endif
+
+
+
+//
+// CNslookupAppUi
+//
+
+void CNslookupAppUi::ConstructL()
+{
+ BaseConstructL();
+
+ InitModelL();
+ iAppView=new(ELeave) CNslookupView(iModel);
+ iAppView->ConstructL(ClientRect());
+
+#if EPOC_SDK < 0x06000000
+ //Just to watch the name of the file on the top of the toolbar
+ CEikFileNameLabel* pingLabel=(CEikFileNameLabel*)iToolBar->ControlById(ENslookupCmdFileName);
+ pingLabel->UpdateL();
+#endif
+
+#ifndef CALYPSO
+
+ // add app view to stack; enables key event handling.
+ AddToStackL(iAppView);
+
+#else // if CALYPSO defined
+
+ AppViewToStackL();
+
+ iAppView->ActivateL();
+
+ iSettingView = new (ELeave) CSettingView(iModel);
+ iSettingView->ConstructL(ClientRect());
+ iSettingView->SetComponentsToInheritVisibility( ETrue );
+
+ SettingViewToStackL();
+
+ iSettingView->ActivateL();
+
+ ShowAppViewL();
+
+#endif
+}
+
+#ifdef CALYPSO
+
+void CNslookupAppUi::ShowAppViewL()
+{
+ iSettingView->MakeVisible( EFalse );
+ SettingViewFromStack();
+ AppViewToStackL();
+ iAppView->MakeVisible( ETrue );
+ iAppView->DrawNow();
+
+ CEikButtonGroupContainer *cba = ((CAknAppUi*)CEikonEnv::Static()->EikAppUi())->Cba();
+ cba->SetCommandSetL(R_NSLOOKUP_CBA);
+ cba->DrawDeferred();
+
+ // Make sure that setting view's scroll indicators are not shown in the app view
+ iSettingView->ListBox()->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOff);
+ iSettingView->ListBox()->UpdateScrollBarsL();
+}
+
+void CNslookupAppUi::ShowSettingViewL()
+{
+ iAppView->MakeVisible( EFalse );
+ AppViewFromStack();
+ SettingViewToStackL();
+ iSettingView->MakeVisible( ETrue );
+ iSettingView->DrawNow();
+
+ CEikButtonGroupContainer *cba = ((CAknAppUi*)CEikonEnv::Static()->EikAppUi())->Cba();
+ cba->SetCommandSetL(R_SETTINGS_CBA);
+ cba->DrawDeferred();
+
+ // Make sure that scroll bars are shown if needed
+ iSettingView->ListBox()->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOn, CEikScrollBarFrame::EAuto);
+ iSettingView->ListBox()->UpdateScrollBarsL();
+}
+
+void CNslookupAppUi::AppViewToStackL()
+{
+ if (!iAppViewOnStack)
+ {
+ AddToStackL(iAppView);
+ iAppViewOnStack = ETrue;
+ }
+}
+
+void CNslookupAppUi::SettingViewToStackL()
+{
+ if (!iSettingViewOnStack)
+ {
+ AddToStackL(iSettingView);
+ iSettingViewOnStack = ETrue;
+ }
+}
+
+void CNslookupAppUi::AppViewFromStack()
+{
+ if (iAppViewOnStack)
+ {
+ RemoveFromStack(iAppView);
+ iAppViewOnStack = EFalse;
+ }
+}
+
+void CNslookupAppUi::SettingViewFromStack()
+{
+ if (iSettingViewOnStack)
+ {
+ RemoveFromStack(iSettingView);
+ iSettingViewOnStack = EFalse;
+ }
+}
+
+#endif // #ifdef CALYPSO
+
+void CNslookupAppUi::InitModelL()
+{
+ TPreferences param;
+
+ RestorePreferencesL(param); //Reads the .ini file
+
+ iModel= new (ELeave) CNslookup();
+ iModel->ConstructL(param);
+}
+
+void CNslookupAppUi::HandleCommandL(TInt aCommand)
+{
+ TPreferences param;
+
+ switch (aCommand)
+ {
+ case ENslookupStart:
+ if (!(iModel->IsRunning()))
+ if (CreateHostNameDialogL())
+ iModel->BeginL();
+ break;
+
+ case ENslookupStop: //Stop ping
+ if (iModel->IsRunning())
+ iModel->EndNslookup();
+ break;
+
+ case ENslookupReset:
+ iAppView->ResetScreen();
+ break;
+
+ case ENslookupAbout:
+ CreateAboutDialogL();
+ break;
+
+ case EEikCmdExit:
+ if (iModel->IsRunning())
+ iModel->EndNslookup();
+ iModel->GetPreferences(param);
+ StorePreferencesL(param);
+#ifdef CALYPSO
+ AppViewFromStack();
+ SettingViewFromStack();
+#endif
+ Exit();
+ return;
+
+#ifdef CALYPSO
+
+ case ENslookupSave:
+ // Try to save settings data
+ if ( iSettingView->SaveSettingsL() )
+ {
+ // Switch back to the normal view
+ ShowAppViewL();
+ }
+ break;
+
+ case ENslookupCancel:
+ // Simply switch back to the normal view
+ ShowAppViewL();
+ break;
+
+#endif // #ifdef CALYPSO
+
+ default:
+ break;
+ }
+}
+
+
+// Launches a dialog to show an about box
+void CNslookupAppUi::CreateAboutDialogL() const
+ {
+ CEikDialog* dialog = new (ELeave) CEikDialog();
+ dialog->ExecuteLD(R_NSLOOKUP_ABOUT); //Final D means the dialog is destructed by itself
+ }
+
+
+//Launches a dialog to specify a hostname and returns if Ok has been pressed to
+//
+#ifdef CALYPSO
+TBool CNslookupAppUi::CreateHostNameDialogL()
+{
+ TBuf<KHostNameLimit> hostname;
+
+ hostname.Copy(*(iModel->GetHostName()));
+
+ CAknTextQueryDialog* dialog = new (ELeave) CHostNameDialog(hostname);
+
+ TInt button = dialog->ExecuteLD(R_NSLOOKUP_HOSTNAME_AVKON);
+
+ if ((button == EAknSoftkeyOk) && (hostname.Length() != 0))
+ {
+ iModel->SetHostName(hostname);
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+}
+#else
+TBool CNslookupAppUi::CreateHostNameDialogL()
+ {
+ CEikDialog* dialog = new (ELeave) CHostNameDialog(iModel);
+ TInt button=dialog->ExecuteLD(R_NSLOOKUP_HOSTNAME); //Final D means the dialog is destructed by itself
+ return (button==EEikBidOk); // If button is CANCEL then the ping is not executed
+ }
+#endif // CALYPSO
+
+void CNslookupAppUi::RestorePreferencesL(TPreferences& aPreferences) const
+{
+ CNslookup::DefaultPreferences(aPreferences);
+}
+
+
+void CNslookupAppUi::StorePreferencesL(const TPreferences & /*aPreferences*/) const
+{
+ // not supported
+}
+
+
+
+CNslookupAppUi::~CNslookupAppUi()
+ {
+#ifndef CALYPSO
+ RemoveFromStack(iAppView);
+#endif
+ delete iAppView;
+#ifdef CALYPSO
+ delete iSettingView;
+#endif
+ delete iModel;
+ }
+
+//
+// CNslookupDocument
+//
+
+CNslookupDocument::CNslookupDocument(CEikApplication& aApp)
+ : CEikDocument(aApp)
+ {
+ }
+
+CEikAppUi* CNslookupDocument::CreateAppUiL()
+ {
+ return(new(ELeave) CNslookupAppUi);
+ }
+
+//
+// CNslookupApplication
+//
+
+TUid CNslookupApplication::AppDllUid() const
+ {
+ return KUidNslookupApp;
+ }
+
+
+CApaDocument* CNslookupApplication::CreateDocumentL()
+ {
+ return new(ELeave) CNslookupDocument(*this);
+ }
+
+//
+// EXPORTed functions
+//
+
+EXPORT_C CApaApplication* NewApplication()
+ {
+ return new CNslookupApplication;
+ }
+
+
+#ifdef MAKE_EXE_APPLICATION
+
+GLDEF_C TInt E32Main()
+ {
+ return EikStart::RunApplication(NewApplication);
+ }
+
+#else
+
+
+#endif // MAKE_EXE_APPLICATION
+
+#ifdef CALYPSO
+
+//------------------------------------------------------------------
+// CNslookupBinaryPopupSettingItem
+//
+// NOTE. This class is implemented only to circumvent
+// a bug (?) in CAknBinaryPopupSettingItem::Load
+//------------------------------------------------------------------
+
+CNslookupBinaryPopupSettingItem::CNslookupBinaryPopupSettingItem( TInt aIdentifier, TBool& aBinaryValue ) :
+ CAknBinaryPopupSettingItem( aIdentifier, aBinaryValue )
+ {
+ }
+
+void CNslookupBinaryPopupSettingItem::LoadL()
+ {
+ // Call CAknEnumeratedTextPopupSettingItem::LoadL to copy
+ // the external boolean value to an internal value
+ // NOTE. CAknBinaryPopupSettingItem::LoadL must NOT be called
+ CAknEnumeratedTextPopupSettingItem::LoadL();
+ }
+
+//-----------------------------------------------------------------
+// CNslookupTextSettingItem
+//
+// NOTE. This is a re-implementation/copy of CAknTextSettingItem
+// (the only difference is in the LoadL method) due to a bug/
+// feature in CAknTextSettingItem::LoadL()
+//-----------------------------------------------------------------
+
+CNslookupTextSettingItem::CNslookupTextSettingItem( TInt aIdentifier, TDes& aText ) :
+ CAknSettingItem(aIdentifier), iExternalText( aText ), iInternalTextPtr(0,0)
+ {
+ }
+
+CNslookupTextSettingItem::~CNslookupTextSettingItem()
+ {
+ delete iInternalText;
+ }
+
+void CNslookupTextSettingItem::StoreL()
+ {
+ // Copy the internal to the external
+ iExternalText.Copy(iInternalText->Des() );
+ }
+
+// NOTE. This is the only method that has changed from CAknTextSettingItem
+void CNslookupTextSettingItem::LoadL()
+ {
+ delete iInternalText;
+ iInternalText = 0;
+ // NOTE. The difference is below
+ // OLD CODE:
+ // iInternalText = iExternalText.AllocL();
+ // END OF OLD CODE
+ // NEW CODE:
+ iInternalText = HBufC::NewL( iExternalText.MaxLength() );
+ TPtr ptrText = iInternalText->Des();
+ ptrText.Copy( iExternalText );
+ // END OF NEW CODE
+ // Use Set so that the whole TPtr is just overwritten - and gets a new buffer
+ iInternalTextPtr.Set(iInternalText->Des() );
+ }
+
+const TDesC& CNslookupTextSettingItem::SettingTextL()
+{
+ return *iInternalText;
+}
+
+void CNslookupTextSettingItem::EditItemL( TBool /* aCalledFromMenu */)
+ {
+ CAknSettingPage* dlg = new( ELeave )CAknTextSettingPage( SettingPageResourceId(), iInternalTextPtr, 0 );
+ SetSettingPage( dlg );
+ SettingPage()->SetSettingPageObserver(this);
+ SetUpStandardSettingPageL();
+ SettingPage()->ExecuteLD(CAknSettingPage::EUpdateWhenChanged);
+ }
+
+TPtr& CNslookupTextSettingItem::InternalTextPtr()
+{
+ return iInternalTextPtr;
+}
+
+TPtrC CNslookupTextSettingItem::ExternalText()
+{
+ return (TPtrC)(iExternalText);
+}
+
+void CNslookupTextSettingItem::SetExternalText( TDesC& aNewExternalText )
+{
+ iExternalText.Copy( aNewExternalText );
+}
+
+//-----------------------------------------------------------------
+// CSettingView
+//-----------------------------------------------------------------
+
+void CSettingView::ConstructL(const TRect& /*aRect*/)
+{
+ // Copy data from the model to member variables
+
+ iLimitPacketCount = iModel->iPackLimit ? ETrue : EFalse;
+ iMaxPacketCount.Num( iModel->iTotalPackets );
+ iPacketDataSize.Num( iModel->iPacketDataSize );
+ iWaitTime.Num( iModel->iSecWait );
+ iLastWaitTime.Num( iModel->iLastSecWait );
+
+ iPattern.Copy( iModel->iPattern );
+ iQuiet = iModel->iQuiet ? ETrue : EFalse;
+ iVerbose = iModel->iVerbose ? ETrue : EFalse;
+ iDebug = iModel->iDebug ? ETrue : EFalse;
+
+ CAknSettingItemList::ConstructFromResourceL( R_NSLOOKUP_SETTINGS );
+}
+
+CSettingView::CSettingView(CNslookup *aModel)
+ {
+ iModel = aModel;
+ }
+
+CSettingView::~CSettingView()
+ {
+ }
+
+void CSettingView::ProcessCommandL(TInt /*aCommand*/)
+ {
+ }
+
+CAknSettingItem* CSettingView::CreateSettingItemL( TInt identifier )
+ {
+ CAknSettingItem* settingItem;
+
+ switch (identifier)
+ {
+ case 1:
+ settingItem = new (ELeave) CNslookupBinaryPopupSettingItem( identifier, iLimitPacketCount );
+ return settingItem;
+ break;
+ case 2:
+ settingItem = new (ELeave) CNslookupTextSettingItem( identifier, iMaxPacketCount );
+ return settingItem;
+ break;
+ case 3:
+ settingItem = new (ELeave) CNslookupTextSettingItem(identifier, iPacketDataSize);
+ return settingItem;
+ break;
+ case 4:
+ settingItem = new (ELeave) CNslookupTextSettingItem(identifier, iWaitTime);
+ return settingItem;
+ break;
+ case 5:
+ settingItem = new (ELeave) CNslookupTextSettingItem(identifier, iLastWaitTime);
+ return settingItem;
+ break;
+ case 6:
+ settingItem = new (ELeave) CNslookupTextSettingItem(identifier, iPattern);
+ return settingItem;
+ break;
+ case 7:
+ settingItem = new (ELeave) CNslookupBinaryPopupSettingItem( identifier, iQuiet );
+ return settingItem;
+ break;
+ case 8:
+ settingItem = new (ELeave) CNslookupBinaryPopupSettingItem( identifier, iVerbose );
+ return settingItem;
+ break;
+ case 9:
+ settingItem = new (ELeave) CNslookupBinaryPopupSettingItem( identifier, iDebug );
+ return settingItem;
+ break;
+ default:
+ settingItem = new (ELeave) CAknSettingItem(identifier);
+ return settingItem;
+ break;
+ }
+}
+
+TBool CSettingView::SaveSettingsL()
+ {
+ // Save settings to the member variables
+
+ StoreSettingsL();
+
+ // Validate input
+
+ TLex lex;
+
+ TInt maxPacketCount;
+ lex.Assign( iMaxPacketCount );
+ if ( lex.Val( maxPacketCount ) != KErrNone )
+ {
+ CEikonEnv::Static()->InfoMsg(_L("Packet count must be numeric"));
+ return EFalse;
+ }
+
+ TInt packetDataSize;
+ lex.Assign( iPacketDataSize );
+ if ( lex.Val( packetDataSize ) != KErrNone )
+ {
+ CEikonEnv::Static()->InfoMsg(_L("Packet size must be numeric"));
+ return EFalse;
+ }
+
+ TInt waitTime;
+ lex.Assign( iWaitTime );
+ if ( lex.Val( waitTime ) != KErrNone )
+ {
+ CEikonEnv::Static()->InfoMsg(_L("Wait time must be numeric"));
+ return EFalse;
+ }
+
+ TInt lastWaitTime;
+ lex.Assign( iLastWaitTime );
+ if ( lex.Val( lastWaitTime ) != KErrNone )
+ {
+ CEikonEnv::Static()->InfoMsg(_L("Last wait time must be numeric"));
+ return EFalse;
+ }
+
+ lex.Assign( iPattern );
+ while (!lex.Eos())
+ {
+ if (!lex.Get().IsHexDigit())
+ {
+ CEikonEnv::Static()->InfoMsg(_L("Pattern must be hexadecimal"));
+ return EFalse;
+ }
+ }
+
+ // Validation OK, so save settings to the model
+
+ iModel->iPackLimit = iLimitPacketCount;
+ iModel->iTotalPackets = maxPacketCount;
+ iModel->iPacketDataSize = packetDataSize;
+ iModel->iSecWait = waitTime;
+ iModel->iLastSecWait = lastWaitTime;
+ iModel->iPattern.Copy(iPattern);
+ iModel->iQuiet = iQuiet;
+ iModel->iVerbose = iVerbose;
+ iModel->iDebug = iDebug;
+
+ return ETrue;
+}
+
+#endif // #ifdef CALYPSO