realtimenetprots/sipfw/SampleApp/gameengine/Inc/SIPExGameEngine.h
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SampleApp/gameengine/Inc/SIPExGameEngine.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,425 @@
+
+/*
+* 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:
+*
+*/
+
+
+
+#ifndef __CSIPEXENGINE_H__
+#define __CSIPEXENGINE_H__
+
+// INCLUDES
+#include    "SIPExGameConstants.h"
+#include    "SIPExSocketEngineObserver.h"
+#include    "SIPExSIPEngineObserver.h"
+
+
+// Remove imports in unit test build
+#ifdef CPPUNIT_TEST
+#undef IMPORT_C
+#define IMPORT_C
+#endif
+
+// DATA TYPES
+
+// FORWARD DECLARATIONS
+class MSIPExStateViewNotifier;
+class TSIPExState;
+class MSIPExGameObserver;
+class CSIPExSIPEngine;
+class CSIPExSocketEngine;
+class TInetAddr;
+
+// CLASS DECLARATIONS
+/**
+* The engine class for SIP Example application.
+* the networking and SIP messaging.
+*/
+class CSIPExEngine 
+:   public CBase, 
+    public MSIPExSIPEngineObserver,
+    public MSIPExSocketEngineObserver
+    {
+    public:
+
+		/**
+		* Create new instance of GameEngine.
+		* @param aGameObserver Reference to observing class.
+		* @returns Pointer to new CSIPExEngine instance.
+		*/
+        IMPORT_C static CSIPExEngine* NewL( MSIPExGameObserver& aGameObserver );
+
+		/**
+		* Create new instance of GameEngine.
+        * The GameEngine pointer is left to the CleanupStack 
+        * returned.
+		* @param aGameObserver Reference to observing class.
+		* @returns Pointer to new CSIPExEngine instance.
+		*/
+        IMPORT_C static CSIPExEngine* NewLC( MSIPExGameObserver& aGameObserver );
+
+		/**
+		* Destructor.
+		*/
+        IMPORT_C ~CSIPExEngine();
+
+    public: // public data
+
+		/**
+		* Enumerations for the application role.
+        * The inviting peer acts as a client and invited peer as a server.
+		*/        
+        enum TPeer 
+            {
+            EUnknown,
+            EClient,
+            EServer
+            };
+
+        /**
+        * Game engine states for UI.
+        */
+        enum TEngineState
+            {
+            EIdle,
+            EEnabled,
+            EActivating,
+            EActive
+            };
+
+    public: // New functions
+
+        /**
+        * The instant message is send to the remote user.
+		* Redirects the call to the active State object.
+        * @param aAddress The address of the recipient.
+        * @param aMsg The message.
+		*/
+        IMPORT_C void SendInstantMsgL( const TDesC& aAddress, const TDesC& aMsg );
+
+        /**
+		* Player invites the remote peer to the game.
+        * Redirectes the call to the active State object.
+        * @param aAddress The address of the invited peer.
+		*/
+        IMPORT_C void InviteL( const TDesC& aAddress );
+
+        /**
+		* The SIP profile is enabled.
+        * Redirectes the call to the active State object.
+		*/
+        IMPORT_C void EnableProfileL();
+
+        /**
+		* The SIP profile is disabled.
+        * Redirectes the call to the active State object.
+		*/
+        IMPORT_C void DisableProfileL();
+
+        /**
+		* The user ends the game.
+        * Redirectes the call to the active State object.
+		*/
+        IMPORT_C void EndGameL();
+
+        /**
+        * Resolves whether we should draw cursor or not.
+        * @return Returns ETrue if the game is in state where we 
+        * should draw cursor (if it is our turn). Otherwise
+        * EFalse is returned.
+        */
+        IMPORT_C TBool DrawCursor();
+
+        /**
+        * Resolves whether we should draw board or not.
+        * @return Returns ETrue if the game is in state where we 
+        * should draw board (if profile is enabled). Otherwise
+        * EFalse is returned.
+        */
+        IMPORT_C TBool DrawBoard();
+
+        /**
+        * Updates the game state. User has pressed left key.
+        */
+        IMPORT_C void CursorLeft();
+
+        /**
+        * Updates the game state. User has pressed right key.
+        */
+        IMPORT_C void CursorRight();
+
+        /**
+        * Updates the game state. User has pressed enter key.
+        */
+        IMPORT_C void CursorPressed();
+
+        /**
+        * Updatas the game state. User moves the cursor with pointer.
+        * @param aNewCursorPosition A new cursor column position.
+        */
+        IMPORT_C void MoveCursorL( const TInt aNewCursorPosition );
+
+        /**
+        * Returns value in specified place in the board.
+        * @param aX The place's x coordinate.
+        * @param aY The place's y coordinate.
+        * @return The value in specified place.
+        */
+        IMPORT_C TInt BoardValue( TInt aX, TInt aY );
+
+        /**
+        * Returns the cursor position.
+        * @return The cursor's position
+        */
+        IMPORT_C TInt Cursor();
+
+        /**
+        * Sets the iNotifier.
+        * @param aNotifier Reference to the view notifier.
+        */
+        IMPORT_C void SetViewNotifier( MSIPExStateViewNotifier& aNotifier );
+
+    public: // From socket observer
+
+        /**
+		* Callback from socket observer.
+        * Called when the state changes in the socket engine.
+        * @param aNewState A new state of the socket engine.
+        */
+        void SocketState( TInt aNewState );
+
+        /**
+		* Callback from socket observer.
+        * Called when the data is received from the socket.
+        * @param aData The data received from the socket.
+        */
+        void SocketData( TDesC8& aData );
+        
+    private: // From SIP observer. See SIPExObserver.h
+        void InviteReceived( const TDesC8& aFrom, const TUint32 aIapId );
+        void InviteReceivedByRemote( const TInt aResponse );
+        void InviteDeclinedByRemote( const TInt aResponse );
+        void InviteAcceptedByRemote( const TInetAddr& aIPAddress, const TUint32 aIapId );
+        void InviteAcceptedByUs();
+        void InvitationCancelled();
+        void EngineError( TInt aError );
+        void CancelFailed();
+        void SessionEnded();
+        void ConnectionLost();
+        void ProfileEnabled( TUint32 aSIPProfileId );
+        void ProfileError( TInt aError );
+        void IMReceived( const TDesC8& aFrom,
+						 const TDesC8& aMessage );
+        void WriteLog( const TDesC8& aLog );
+
+    private: // New functions
+
+        /**
+        * Initilizes the game state.
+        */
+        void ResetGame();
+
+        /**
+        * Destroys the iSocketEngine.
+        */
+        void DestroySocketEngine();
+
+        /**
+        * Changes the active state.
+        * @param aNewState A reference the to new active state.
+        */
+        void ChangeState( TSIPExState& aNewState );
+
+        /**
+        * Send the move to the remote peer.
+        * @param aX The x coordinate of the move.
+        * @param aY The y coordinate of the move.
+        */
+        void SendMessage( const TInt aX, const TInt aY );
+
+        /**
+        * Shows the text in the status info area. The call is
+        * redirected to the view notifier.
+        * @param aTxt The text shown in the status info area.
+        */
+        void StatusInfoL( const TDesC& aTxt );
+
+        /**
+        * Shows the text in the info area. The call is redirected 
+        * to the view notifier.
+        * @param aTxt The text shown in the info area.
+        */
+        void InfoL( const TDesC& aInfoTxt );
+
+        /**
+        * Calculates the next free place in cursor's column.
+        * @return The next free position on the board.
+        */
+        TInt CalculatePos();
+
+        /**
+        * Checks if the move is win move.
+        * @param aX The x coordinate of the move.
+        * @param aY The y coordinate of the move.
+        * @return 1 if you won, 
+        *         2 if the remote player has won,
+        *         -1 if not win move.
+        */
+        TInt IsWin( const TInt aX, const TInt aY );
+
+        /**
+        * Returns the count of moves in this game.
+        * @return The count of moves.
+        */
+        TInt Moves();
+
+        /**
+        * Sets the specified value in to the specified place in
+        * the board.
+        * @param aX The x coordinate value.
+        * @param aY The y coordinate value.
+        * @param aValue The value to be set to the (x, y) position.
+        */
+        void SetBoard( const TInt aX, const TInt aY, const TInt aValue );
+
+        /**
+        * Increases the moves value by specified amount.
+        * @param aAmount The amount of the increased moves.
+        */
+        void IncreaseMovesBy( const TInt aAmount );
+
+        /**
+        * Set cursor the specified position.
+        * @param aNewValue The new position value for the cursor.
+        */
+        void SetCursor( const TInt aNewValue );
+        
+        /**
+        * Returns the peer value.
+        * @return The iPeer value.
+        */
+        TPeer Peer();
+        
+        /**
+        * Sets the iPeer's value
+        * @param aPeer A new value for the iPeer.
+        */
+        void SetPeer( TPeer aPeer );
+        
+        /**
+        * Sets remote peer's move to the board.
+        * @param aX The x coordinate value.
+        * @param aY The y coordinate value.
+        */
+        void SetRemote( const TInt aX, const TInt aY );
+
+        /**
+		* The acceptance is asked from the user
+        * Redirectes the call to the game observer.
+        * @param aFrom The summoner's address
+        * @return Whether we accept the invitation or not.
+		*/
+        TBool AcceptInvitationL( const TDesC8& aFrom );
+
+        /**
+        * Returns the SIP Engine pointer.
+        * @return The pointer to the CSIPExSIPEngine. The ownership
+        *         is NOT transferred.
+        */
+        CSIPExSIPEngine*    SIPEngine();
+
+        /**
+        * Returns the socket engine. If the socket engine (iSocketEngine) is 
+        * NULL it will be created.
+        * @return The pointer to the CSIPExSocketEngine. The ownership
+        *         is NOT transferred.
+        */        
+        CSIPExSocketEngine* SocketEngineL();
+
+        /**
+        * Returns the game observer reference.
+        * @return The reference to the MSIPExGameObserver.
+        */        
+        MSIPExGameObserver& GameObserver();
+
+    private:
+
+        /**
+        * Constructor
+        * @param aGameObserver The observer reference.
+        */        
+        CSIPExEngine( MSIPExGameObserver& aGameObserver );
+
+        /**
+        * 2nd phase constructor
+        */        
+        void ConstructL();
+
+    private: // Member variables
+        // Owned: States
+        TSIPExState*    iStateIdle;
+        TSIPExState*    iStateRegistering;
+        TSIPExState*    iStateRegistered;
+        TSIPExState*    iStateInviting;
+        TSIPExState*    iStateConnecting;
+        TSIPExState*    iStateLocal;
+        TSIPExState*    iStateRemote;
+        TSIPExState*    iStateAcceptingSIP;
+        
+        // Not owned: ui notifier
+        MSIPExStateViewNotifier*     iNotifier;
+
+        // Owned: The networking engine
+        CSIPExSocketEngine*     iSocketEngine;
+
+        // Owned: The SIP signaling engine.
+        CSIPExSIPEngine*        iSIPEngine;
+        
+        // Observer for game events
+        MSIPExGameObserver&     iGameObserver;
+
+        // Game data
+        TInt iMoves;
+	    TInt iBoard[ KBoxCountX ][ KBoxCountY ];
+	    TInt iCursor;
+        TPeer iPeer;
+
+        // Not owned: Reference to active state
+        TSIPExState*    iActiveState;
+
+       // State classes are friend classes because they need access 
+        // to the engine.
+        
+        friend class TSIPExState;
+        friend class TSIPExStateAcceptingSIP;
+        friend class TSIPExStateConnecting;
+        friend class TSIPExStateIdle;
+        friend class TSIPExStateInviting;
+        friend class TSIPExStateLocal;
+        friend class TSIPExStateRegistered;
+        friend class TSIPExStateRegistering;
+        friend class TSIPExStateRemote;
+        
+        // In unit tests following friend class definitions are needed
+        #ifdef CPPUNIT_TEST
+        friend class CGameEngineTest;
+        friend class CBaseStateTest;
+        friend class CStateAcceptingSIPTest;
+        #endif
+    };
+
+#endif // __CSIPEXENGINE_H__
+