📄 appui.cpp
字号:
// appui.cpp
//
// Copyright (c) 2000 Symbian Ltd. All rights reserved.
//
#include "gdp.h"
#include "appui.h"
#include "controller.h"
#include "appview.h"
#include <eikenv.h>
#include <eikbutb.h>
#include <eiktbar.h>
#include <eikdialg.h>
#include <eikedwin.h>
#include <eikfnlab.h>
#include <eikchlst.h>
#include <qiknumbereditor.h>
// for use with r_game_gdp_protocols
TInt GDPProtocolIDToChoiceList(TUid aProtocol);
TUid ChoiceListToGDPProtocol(TInt aIndex);
/*
CGameSendDialog
*/
class CGameSendDialog : public CEikDialog
{
public:
CGameSendDialog(CGameController* aController);
private:
// from CEikDialog
void PreLayoutDynInitL(); // initialization
TBool OkToExitL(TInt aKeycode); // termination
private:
CGameController* iController;
};
CGameSendDialog::CGameSendDialog(CGameController* aController)
: iController(aController)
{
}
void CGameSendDialog::PreLayoutDynInitL() // initialization
{
static_cast<CEikEdwin*>(Control(EGameControlIdSendText))->SetTextL(&(iController->iEngine->LastSent()));
}
TBool CGameSendDialog::OkToExitL(TInt /* aKeycode */) // termination
{
CEikEdwin* edwin=STATIC_CAST(CEikEdwin*, Control(EGameControlIdSendText));
HBufC* string=edwin->GetTextInHBufL();
if (!string)
string=_L("").AllocL();
CleanupStack::PushL(string);
iController->CmdSendMessageL(*string);
CleanupStack::PopAndDestroy(); // string
return ETrue;
}
/*
CGameInitiateDialog
*/
class CGameInitiateDialog : public CEikDialog
{
public:
CGameInitiateDialog(CGameController* aController);
private:
// from CEikDialog
void PreLayoutDynInitL(); // initialization
TBool OkToExitL(TInt aKeycode); // termination
private:
CGameController* iController;
};
CGameInitiateDialog::CGameInitiateDialog(CGameController* aController)
: iController(aController)
{
}
void CGameInitiateDialog::PreLayoutDynInitL() // initialization
{
_LIT(KBlank,"");
static_cast<CEikEdwin*>(Control(EGameControlIdOtherAddress))->SetTextL(&KBlank);
}
TBool CGameInitiateDialog::OkToExitL(TInt /* aKeycode */) // termination
{
// reset controller if necessary
if (!iController->iRgcp->IsBlank())
iController->Reset();
// get other address
CEikEdwin* edwin=STATIC_CAST(CEikEdwin*, Control(EGameControlIdOtherAddress));
HBufC* address=edwin->GetTextInHBufL();
if (!address)
address=_L("").AllocL();
CleanupStack::PushL(address);
// get controller to handle set up
iController->InitiateL(*address);
iEikonEnv->InfoMsg(R_GAME_HAVE_INITIATED);
// clean up and return
CleanupStack::PopAndDestroy(); // address
return ETrue;
}
/*
CGameSetMeDialog
*/
class CGameSetMeDialog : public CEikDialog
{
public:
CGameSetMeDialog(CGameController* aController);
private:
// from CEikDialog
void PreLayoutDynInitL(); // initialization
TBool OkToExitL(TInt aKeycode); // termination
private:
CGameController* iController;
};
CGameSetMeDialog::CGameSetMeDialog(CGameController* aController)
: iController(aController)
{
}
void CGameSetMeDialog::PreLayoutDynInitL() // initialization
{
TInt cursor = GDPProtocolIDToChoiceList(iController->iRgcp->Gsdp().GetGdpProtocol());
static_cast<CEikChoiceListBase*>(Control(EGameControlIdProtocol))->SetCurrentItem(cursor);
}
TBool CGameSetMeDialog::OkToExitL(TInt /* aKeycode */) // termination
{
// reset controller if necessary
if (!iController->iRgcp->IsBlank())
iController->Reset();
// get protocol
TInt cursor = static_cast<CEikChoiceListBase*>(Control(EGameControlIdProtocol))->CurrentItem() + 1;
// get controller to handle set up
iController->SetupMeL(ChoiceListToGDPProtocol(cursor));
iEikonEnv->InfoMsg(R_GAME_HAVE_SETME);
// clean up and return
return ETrue;
}
// ordering in these two functions must match resource file
TInt GDPProtocolIDToChoiceList(TUid aProtocol)
{
if (aProtocol == KGdpLoopbackUid) return 0;
else if (aProtocol == KGdpBTUid) return 1;
else if (aProtocol == KGdpSmsUid) return 2;
else return 0;
}
TUid ChoiceListToGDPProtocol(TInt aIndex)
{
switch (aIndex)
{
case 1: return KGdpLoopbackUid;
case 2: return KGdpBTUid;
case 3: return KGdpSmsUid;
default: return KGdpLoopbackUid;
}
}
/*
CGameDisplaySettingsDialog
*/
class CGameDisplaySettingsDialog : public CEikDialog
{
public:
CGameDisplaySettingsDialog(CGameController* aController);
private:
// from CEikDialog
void PreLayoutDynInitL(); // initialization
private:
CGameController* iController;
};
CGameDisplaySettingsDialog::CGameDisplaySettingsDialog(CGameController* aController)
: iController(aController)
{
}
void CGameDisplaySettingsDialog::PreLayoutDynInitL() // initialization
{
static_cast<CEikChoiceListBase*>(Control(EGameControlIdState))->SetCurrentItem(iController->iRgcp->State());
static_cast<CEikChoiceListBase*>(Control(EGameControlIdProtocol))->SetCurrentItem(GDPProtocolIDToChoiceList(iController->iRgcp->Gsdp().GetGdpProtocol()));
TBuf<10> port;
port.AppendNum(TUint(iController->iRgcp->Gsdp().GetMyPort()));
static_cast<CEikEdwin*>(Control(EGameControlIdMyPort))->SetTextL(&port);
port.Zero();
port.AppendNum(TUint(iController->iRgcp->Gsdp().GetOtherPort()));
static_cast<CEikEdwin*>(Control(EGameControlIdOtherPort))->SetTextL(&port);
TBuf<KMaxGsdpAddress> address;
iController->GetOtherAddress(address);
static_cast<CEikEdwin*>(Control(EGameControlIdOtherAddress))->SetTextL(&address);
}
/*
CGameAppUi
*/
void CGameAppUi::ConstructL()
{
BaseConstructL();
// construct comms interfaces and controller for player 1
iController=new(ELeave) CGameController;
iController->ConstructL(STATIC_CAST(CGameDocument*, Document())->iEngine, STATIC_CAST(CGameDocument*, Document())->iRgcp, this);
iController->Reset();
}
CGameAppUi::~CGameAppUi()
{
delete iController;
}
void CGameAppUi::HandleCommandL(TInt aCommand)
{
switch (aCommand)
{
case EGameCmdSend:
CmdSendL();
break;
case EGameCmdResend:
CmdResend();
break;
case EGameCmdReceive:
CmdReceiveL();
break;
case EGameCmdDisplaySettings:
CmdDisplaySettingsL();
break;
case EGameCmdReset:
CmdResetL();
break;
case EGameCmdSetMe:
CmdSetMeL();
break;
case EGameCmdInitiate:
CmdInitiateL();
break;
case EGameCmdListen:
CmdListenL();
break;
case EEikCmdExit:
SaveL();
Exit();
break;
}
}
void CGameAppUi::CmdSetMeL()
{
// user-friendly checks
if (!iController->iRgcp->IsBlank() && !iEikonEnv->QueryWinL(R_GAME_CONFIRM_SETME))
return;
// do it
CEikDialog* dialog=new(ELeave) CGameSetMeDialog(iController);
dialog->ExecuteLD(R_GAME_SET_ME_DIALOG);
}
void CGameAppUi::CmdDisplaySettingsL()
{
CEikDialog* dialog=new(ELeave) CGameDisplaySettingsDialog(iController);
dialog->ExecuteLD(R_GAME_DISPLAY_SETTINGS_DIALOG);
}
void CGameAppUi::CmdListenL()
{
// user-friendly checks
if (!iController->iRgcp->IsBlank() && !iEikonEnv->QueryWinL(R_GAME_CONFIRM_LISTEN))
return;
// do it
iController->Reset();
iController->Listen();
iEikonEnv->InfoMsg(R_GAME_AM_LISTENING);
}
void CGameAppUi::CmdInitiateL()
{
// user-friendly checks
if (!iController->iRgcp->IsBlank() && !iEikonEnv->QueryWinL(R_GAME_CONFIRM_INITIATE))
return;
// do it
CEikDialog* dialog=new(ELeave) CGameInitiateDialog(iController);
dialog->ExecuteLD(R_GAME_INITIATE_DIALOG);
}
void CGameAppUi::CmdResetL()
{
// user-friendly checks and messages
if (iController->iRgcp->IsBlank())
iEikonEnv->LeaveWithInfoMsg(R_GAME_ALREADY_RESET);
if (!iEikonEnv->QueryWinL(R_GAME_CONFIRM_RESET))
return;
// ok, do it
iController->Reset();
iEikonEnv->InfoMsg(R_GAME_HAVE_RESET);
}
void CGameAppUi::CmdSendL()
{
// user-friendly check
if (!iController->iRgcp->IsBound())
iEikonEnv->LeaveWithInfoMsg(R_GAME_CANT_SEND);
if (!iController->iRgcp->IsRequesting())
iEikonEnv->LeaveWithInfoMsg(R_GAME_NOT_YOUR_TURN);
// do it
CEikDialog* dialog=new(ELeave) CGameSendDialog(iController);
dialog->ExecuteLD(R_GAME_SEND_DIALOG);
}
void CGameAppUi::CmdResend()
{
// user-friendly check
if (!iController->iRgcp->IsWaiting() && !iController->iRgcp->IsInitiating())
iEikonEnv->LeaveWithInfoMsg(R_GAME_NOTHING_TO_RESEND);
iController->iRgcp->Resend();
iEikonEnv->InfoMsg(R_GAME_RESENT);
}
void CGameAppUi::CmdReceiveL()
{
iEikonEnv->InfoMsg(R_GAME_RECEIVE_NOT_IMPLEMENTED);
}
// file-based app framework
TBool CGameAppUi::ProcessCommandParametersL(TApaCommand aCommand, TFileName& aDocumentName, const TDesC& /*aTail*/)
{
return CEikAppUi::ProcessCommandParametersL(aCommand, aDocumentName);
}
void CGameAppUi::HandleModelChangeL()
{
iController->SetEngineL(STATIC_CAST(CGameDocument*, Document())->iEngine);
iController->SetRgcpL(STATIC_CAST(CGameDocument*, Document())->iRgcp);
iEikonEnv->UpdateTaskNameL();
/*
CEikFileNameLabel* filenameLabel=
STATIC_CAST(CEikFileNameLabel*,
iToolBar->ControlById(EGameControlIdFileNameLabel));
filenameLabel->UpdateL();
filenameLabel->DrawNow();
*/
}
/*
CGameDocument
*/
CGameDocument::CGameDocument(CEikApplication& aApp)
: CEikDocument(aApp)
{
}
void CGameDocument::ConstructL()
{
iEngine=new(ELeave) CGameEngine;
iRgcp=new(ELeave) CRgcpSession;
iRgcp->ConstructL(KUidExample.iUid);
}
CGameDocument::~CGameDocument()
{
delete iRgcp;
delete iEngine;
}
CEikAppUi* CGameDocument::CreateAppUiL()
{
return new(ELeave) CGameAppUi;
}
void CGameDocument::NewDocumentL()
{
iEngine->Reset();
iRgcp->Terminate();
}
void CGameDocument::RestoreL(const CStreamStore& aStore,const CStreamDictionary& aStreamDict)
{
// new engine initialized from store
CGameEngine* engine=new(ELeave) CGameEngine;
CleanupStack::PushL(engine);
TStreamId id=aStreamDict.At(KUidExample);
engine->RestoreL(aStore, id);
// new RGCP session initialized from store
CRgcpSession* rgcp=new(ELeave) CRgcpSession;
CleanupStack::PushL(rgcp);
rgcp->ConstructL(KUidExample.iUid);
id=aStreamDict.At(KUidRgcp);
rgcp->RestoreL(aStore, id);
// tidy up and set new values
CleanupStack::Pop(2); // rgcp, engine
delete iEngine;
iEngine=engine;
delete iRgcp;
iRgcp=rgcp;
}
void CGameDocument::StoreL(CStreamStore& aStore,CStreamDictionary& aStreamDict) const
{
TStreamId id=iEngine->StoreL(aStore);
aStreamDict.AssignL(KUidExample,id);
id=iRgcp->StoreL(aStore);
aStreamDict.AssignL(KUidRgcp,id);
}
/*
CGameApplication
*/
TUid CGameApplication::AppDllUid() const
{
TUid uid;
uid.iUid = 0x10005408;;
return uid;
}
CApaDocument* CGameApplication::CreateDocumentL()
{
CGameDocument* doc=new(ELeave) CGameDocument(*this);
CleanupStack::PushL(doc);
doc->ConstructL();
CleanupStack::Pop();
return doc;
}
// DLL interface stuff
EXPORT_C CApaApplication* NewApplication()
{
return new CGameApplication;
}
GLDEF_C TInt E32Dll(TDllReason)
{
return KErrNone;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -