diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SampleApp/gameUI_techview/Src/SIPExAppUi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SampleApp/gameUI_techview/Src/SIPExAppUi.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,284 @@ + +// 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: +// INCLUDE FILES +// + + + +#include "SIPExAppUi.h" +#include "SIPExGameContainer.h" +#include "SIPEx.hrh" +#include "SIPExAddrQueryDlg.h" +#include "SIPExProfileQueryDlg.h" +#include "SIPExIMDialog.h" +#include "SIPExDoc.h" +#include +#include // CEikonEnv +#include // CEikMenupane +#include // CEikButtonGroupContainer +#include // CEikInfoDialog + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSIPExAppUi::CSIPExAppUi +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSIPExAppUi::CSIPExAppUi() +: iState( CSIPExEngine::EIdle ) + { + } + +// ----------------------------------------------------------------------------- +// CSIPExAppUi::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSIPExAppUi::ConstructL() + { + BaseConstructL(); + + iEngine = ( static_cast< CSIPExDoc* >( Document() ) )->CreateEngineL( *this ); + iGameContainer = CSIPExGameContainer::NewL( ClientRect(), *iEngine ); + iEngine->SetViewNotifier( *iGameContainer ); + + RegisterViewL( *iGameContainer ); + SetDefaultViewL( *iGameContainer ); + + HandleToolbar(); + + AddToStackL( iGameContainer ); + } + +// ----------------------------------------------------------------------------- +// CSIPExAppUi::~CSIPExAppUi +// Destructor +// ----------------------------------------------------------------------------- +// +CSIPExAppUi::~CSIPExAppUi() + { + if( iGameContainer ) + { + DeregisterView( *iGameContainer ); + iEikonEnv->RemoveFromStack( iGameContainer ); + delete iGameContainer; + } + } + +// ----------------------------------------------------------------------------- +// CSIPExAppUi::HandleCommandL +// User interaction handling. The views capture most of the events, but some +// might get pushed here +// ----------------------------------------------------------------------------- +// +void CSIPExAppUi::HandleCommandL( TInt aCommand ) + { + switch ( aCommand ) + { + case EEikCmdExit: + { + // If game is ongoing, notify opponent, ignore errors + TRAPD( err, iEngine->EndGameL() ); + CBaActiveScheduler::Exit(); + break; + } + + case ECmdInviteForGame: + { + CSIPExAddrQueryDlg* dlg = CSIPExAddrQueryDlg::NewL( iAddress ); + if( dlg->ExecuteLD( R_INVITE_ADDRESS_DLG ) ) + { + iEngine->InviteL( iAddress ); + } + iGameContainer->DrawNow(); + break; + } + + case ECmdEnableProfile: + { + TRAPD( err, iEngine->EnableProfileL()); + if (err == KErrNotFound) + { + CSIPExProfileQueryDlg* dlg = CSIPExProfileQueryDlg::NewL( ); + if( dlg->ExecuteLD( R_PROFILE_DLG ) ) + { + // iEngine->InviteL( iAddress ); + } + iGameContainer->DrawNow(); + iEngine->EnableProfileL(); + } + else + { + User::Leave(err); + } + break; + } + + case ECmdDisableProfile: + { + iEngine->DisableProfileL(); + break; + } + + // Send instant message + case ECmdSendIM: + { + TBuf< 256 > msg; + CSIPExIMDialog* dlg = CSIPExIMDialog::NewL( iAddress, msg ); + if( dlg->ExecuteLD( R_INSTANT_MESSAGE_DLG ) ) + { + iEngine->SendInstantMsgL( iAddress, msg ); + } + iGameContainer->DrawNow(); + break; + } + + // End game + case ECmdEndGame: + { + iEngine->EndGameL(); + break; + } + + default: + { + // Do nothing, no-one will handle it + // No use of leaving though, because this isn't an error - only + // an unhandled command + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CSIPExAppUi::GameStateChanged +// From MSIPExGameObserver. +// Game state changed. Then the game should be redraw. +// ----------------------------------------------------------------------------- +// +void CSIPExAppUi::GameStateChanged( CSIPExEngine::TEngineState aState ) + { + iState = aState; + HandleToolbar(); + iGameContainer->DrawDeferred(); + } + +// ----------------------------------------------------------------------------- +// CSIPExAppUi::HandleToolbar +// Sets the toolbar items dimmed/undimmed according game state. +// ----------------------------------------------------------------------------- +// +void CSIPExAppUi::HandleToolbar() + { + CEikButtonGroupContainer* toolbar = iEikonEnv->AppUiFactory()->ToolBar(); + + switch( iState ) + { + case CSIPExEngine::EIdle: + toolbar->DimCommand( ECmdInviteForGame, ETrue ); + toolbar->DimCommand( ECmdEnableProfile, EFalse ); + toolbar->DimCommand( ECmdDisableProfile, ETrue ); + toolbar->DimCommand( ECmdSendIM, ETrue ); + toolbar->DimCommand( ECmdEndGame, ETrue ); + break; + case CSIPExEngine::EEnabled: + toolbar->DimCommand( ECmdInviteForGame, EFalse ); + toolbar->DimCommand( ECmdEnableProfile, ETrue ); + toolbar->DimCommand( ECmdDisableProfile, EFalse ); + toolbar->DimCommand( ECmdSendIM, EFalse ); + toolbar->DimCommand( ECmdEndGame, ETrue ); + break; + case CSIPExEngine::EActivating: + toolbar->DimCommand( ECmdInviteForGame, ETrue ); + toolbar->DimCommand( ECmdEnableProfile, ETrue ); + toolbar->DimCommand( ECmdDisableProfile, ETrue ); + toolbar->DimCommand( ECmdSendIM, EFalse ); + toolbar->DimCommand( ECmdEndGame, ETrue ); + break; + case CSIPExEngine::EActive: + toolbar->DimCommand( ECmdInviteForGame, ETrue ); + toolbar->DimCommand( ECmdEnableProfile, ETrue ); + toolbar->DimCommand( ECmdDisableProfile, ETrue ); + toolbar->DimCommand( ECmdSendIM, EFalse ); + toolbar->DimCommand( ECmdEndGame, EFalse ); + break; + default: + break; + } + toolbar->DrawDeferred(); + } + +// ----------------------------------------------------------------------------- +// CSIPExAppUi::AcceptInvitationL +// From MSIPExGameObserver. +// Show confirmation dialog with summoner's address. +// If accepted return ETrue else EFalse. +// ----------------------------------------------------------------------------- +// +TBool CSIPExAppUi::AcceptInvitationL( const TDesC& aFrom ) + { + HBufC* title = + iEikonEnv->AllocReadResourceLC( R_SIP_EX_ACCEPT_INVITATION_DLG_TITLE ); + + HBufC* temp = iEikonEnv->AllocReadResourceLC( R_SIP_EX_ACCEPT_INVITATION ); + + HBufC* buf = HBufC::NewL( temp->Length() + aFrom.Length() ); + TPtr pbuf( buf->Des() ); + pbuf.AppendFormat( *temp, &aFrom ); + + CleanupStack::PopAndDestroy( temp ); + CleanupStack::PushL( buf ); + + TBool retVal( EFalse ); + if( CEikInfoDialog::RunDlgLD( *title, pbuf, CEikInfoDialog::EAllowEnter ) ) + { + retVal = ETrue; + } + + CleanupStack::PopAndDestroy( buf ); + CleanupStack::PopAndDestroy( title ); + + iGameContainer->DrawDeferred(); + return retVal; + } + +// ----------------------------------------------------------------------------- +// CSIPExAppUi::IMReceivedL +// From MSIPExGameObserver. +// Show the received instant message in info editor. +// ----------------------------------------------------------------------------- +// +void CSIPExAppUi::IMReceivedL( const TDesC8& aFrom, const TDesC8& aMsg ) + { + HBufC* from = HBufC::NewLC( aFrom.Length() ); + from->Des().Copy( aFrom ); + + HBufC* msg = HBufC::NewLC( aMsg.Length() ); + msg->Des().Copy( aMsg ); + + HBufC* temp = iEikonEnv->AllocReadResourceLC( R_SIP_EX_IM_RECEIVED ); + + HBufC* buf = + HBufC::NewLC( temp->Length() + aFrom.Length() + aMsg.Length() ); + TPtr pbuf( buf->Des() ); + pbuf.AppendFormat( *temp, from, msg ); + + iGameContainer->ShowInfoL( pbuf ); + CleanupStack::PopAndDestroy( 4 ); + } + +// End of File