realtimenetprots/sipfw/SampleApp/gameUI_techview/Src/SIPExAppUi.cpp
changeset 0 307788aac0a8
--- /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    <sipex.rsg>
+#include    <eikenv.h>          // CEikonEnv
+#include    <eikmenup.h>        // CEikMenupane
+#include    <eikbtgpc.h>        // CEikButtonGroupContainer
+#include    <eikinfo.h>         // 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