--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmceserver/inc/mceactionset.h Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,857 @@
+/*
+* Copyright (c) 2005 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 MCEACTIONSET_H
+#define MCEACTIONSET_H
+
+#include <e32std.h>
+#include "mcesrv.h"
+#include "mcesession.h"
+#include "mcestate.h"
+#include "mcesipsession.h"
+#include "mcedefs.h"
+
+
+// FORWARD DECLARATION
+class CMceSipSession;
+class CSIPServerTransaction;
+class CSIPClientTransaction;
+class CMceMsgBase;
+class CMceMediaManager;
+class CSIPHeaderBase;
+class CSdpDocument;
+class CSIPMessageElements;
+class CMceComSession;
+class CSIPResponseElements;
+class CMceMsgSIPReply;
+class CMceMsgSIPData;
+class TMceMccComEvent;
+class TMceStateTransitionEvent;
+
+
+const TInt KMceAutoReasonPhrase = KErrNotFound;
+
+// CLASS DECLARATION
+
+/**
+* MCE SIP session.
+*
+* @lib
+* @since
+*/
+class TMceActionSet
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * C++ constructor
+ * @param aSession, reference to session.
+ */
+ TMceActionSet( CMceSipSession& aSession );
+
+public://state changing related
+
+ /**
+ * Changes server state
+ * @param aNewState new server state
+ */
+ void StateChanged( TMceStateIndex aNewState );
+
+ /**
+ * Changes client state synchronously as a response
+ * to client's ITC call
+ * @param aIds set of ids defining ITC call context
+ * @param aNewState new client state
+ * @param aStatus status
+ */
+ void ClientStateChanged( TMceIds& aIds,
+ CMceSession::TState aNewState,
+ TInt aStatus = KErrNone );
+
+ /**
+ * Changes client state.
+ * This is called when there is no SIP data for client
+ * explaining the reason of state change. This happens,
+ * for example, when client is establishing session and
+ * there is no response, but media manager fails in offer
+ * creation.
+ * @param aNewState new client state
+ * @param aReason a reason of state change
+ */
+ void ClientStateChangedL( CMceSession::TState aNewState,
+ TInt aReason = KErrNone );
+
+ /**
+ * Changes client state.
+ * This is called when there is SIP response explaining
+ * the reason of state change. If handling of response fails
+ * (error) reason is used for identifying the problem.
+ * @param aNewState new client state
+ * @param aResponse SIP response
+ * @param aReason a reason of state change
+ */
+ void ClientStateChangedL( CMceSession::TState aNewState,
+ CSIPClientTransaction& aResponse,
+ TInt aReason = KErrNone );
+
+
+ /**
+ * Changes client state.
+ * This is called when there is SIP request explaining
+ * the reason of state change. Only BYE is supported.
+ * This method should not be used when handling INVITE request,
+ * becauseINVITE causes always new incoming session creation and thus
+ * state change is always EIncoming.
+ * @param aNewState new client state
+ * @param aRequest SIP request
+ * @param aReason a reason of state change
+ */
+ void ClientStateChangedL( CMceSession::TState aNewState,
+ CSIPServerTransaction& aRequest );
+
+
+ /**
+ * Changes client state. Used in session update.
+ * This is called when there is SIP response explaining
+ * the reason of state change and client session (body) must be
+ * updated because of it. If handling of response has been
+ * failed (error) reason is used for identifying the problem.
+ * If reason is other than KErrNone, EMceItcUpdateFailed is
+ * used in callback.
+ * @param aNewState new client state
+ * @param aBody client session
+ * @param aResponse SIP response
+ * @param aReason a reason of state change
+ */
+ void ClientStateChangedL( CMceSession::TState aNewState,
+ CMceComSession& aBody,
+ CSIPClientTransaction& aResponse,
+ TInt aReason = KErrNone );
+
+ /**
+ * Changes client state. Used in session update.
+ * This is called when client session (body) must be
+ * updated. This happens, for example, when client is updating
+ * session, but media manager fails in update creation and
+ * rollback is needed.
+ * EMceItcUpdateFailed call back is used always
+ * used in callback.
+ * @param aNewState new client state
+ * @param aBody client session
+ * @param aReason a reason of state change
+ */
+ void ClientStateChangedL( CMceSession::TState aNewState,
+ CMceComSession& aBody,
+ TInt aReason );
+
+
+
+ /**
+ * informs client of occured severe error
+ * @param aError a reason of error
+ */
+ void ClientErrorOccured( TInt aError );
+
+
+public://basic session establisment and update
+
+ /**
+ * Encode body to SDP. Encoded body can me obtained with
+ * Offer() method.
+ */
+ void EncodeL();
+
+ /**
+ * Decode body from SDP, which is created with
+ * method CreateSDP() and stored as session offer.
+ * @return warning code
+ */
+ TMceSipWarningCode DecodeL();
+
+ /**
+ * Decode body from SDP, which is created with
+ * method CreateSDP() and stored as session offer.
+ * @return warning code
+ */
+ TMceSipWarningCode Decode();
+
+ /**
+ * Update media manager according to body
+ * @return return status:
+ * -System error < 0: error situation
+ * -KMceReady: update was synchronous
+ * -KMceAsync: updating asynchronously, wait EMEMediaUpdated event.
+ */
+ TMceReturnStatus UpdateL();
+
+ /**
+ * Update media manager according to body
+ * @return return status:
+ * -System error < 0: error situation
+ * -KMceReady: update was synchronous
+ * -KMceAsync: updating asynchronously, wait EMEMediaUpdated event.
+ */
+ TMceReturnStatus Update();
+
+ /**
+ * Reserve resources
+ * @return return status:
+ * -System error < 0: error situation
+ * -KMceReady: reservation was synchronous or not needed
+ * -KMceAsync: reserving asynchronously, wait EMEMediaReserved event.
+ */
+ TMceReturnStatus ReserveL();
+
+ /**
+ * Update clients parameters in body
+ * @param aIds set of ids defining ITC call context
+ * @param aBody client session
+ */
+ void UpdateBodyL( TMceIds& aIds, CMceMsgBase& aBody );
+
+ /**
+ * Create body candidate for session update.
+ * @param aType the direction of the body candidate
+ */
+ void CreateBodyCandidateL( CMceComSession::TType aType );
+
+ /**
+ * Returns truth value, reservation needed.
+ * @return ETrue, if reservation is needed
+ */
+ TBool ReservationNeeded();
+
+ /**
+ * Sends INVITE with SDP
+ */
+ void SendInviteL();
+
+ /**
+ * Informs client about new incoming session
+ * @param aInvite server transaction
+ */
+ void ClientUpdateIncomingSessionL( CSIPServerTransaction& aInvite );
+
+ /**
+ * Informs client about new incoming session update
+ * @param aInvite server transaction
+ * @param aCallback callback for client
+ */
+ void ClientUpdateSessionL( CSIPServerTransaction& aInvite,
+ TUint32 aCallback = EMceItcIncomingUpdate );
+
+public://requests
+
+ /**
+ * Sends INVITE
+ * @param aData session body for creation of SDP content
+ */
+ void SendInviteL( CMceComSession& aData );
+
+ /**
+ * Sends ACK to response (2XX)
+ * @param aResponse client transaction
+ */
+ void SendACKL( CSIPClientTransaction& aResponse );
+
+ /**
+ * Sends BYE with default headers
+ */
+ void SendBYEL();
+
+ /**
+ * Sends BYE with client defined headers and content
+ * This is called when client terminates (EMceItcTerminateSession)
+ * @param aData data containing headers
+ */
+ void SendBYEL( CMceMsgBase& aData );
+
+ /**
+ * Sends CANCEL
+ * @return ETrue, if CANCEL was sent
+ */
+ TBool SendCancelL();
+
+ /**
+ * Sends UPDATE
+ * @return ETrue, if UPDATE was sent
+ */
+ void SendUpdateRequestL();
+
+ /**
+ * Sends PRACK
+ * @param aContent if ETrue, use content in PRACK
+ * @return ETrue, if PRACK was sent
+ */
+ void SendPrackL( TBool aContent = ETrue );
+
+ /**
+ * Sends Extension Request
+ * @param aData SIP data
+ * @param aIds set of ids defining ITC call context
+ */
+ void SendExtensionRequestL( CMceMsgBase& aData, TMceIds& aIds );
+
+
+ /**
+ * Receive Response to the Extension Requests sent.
+ * @param aEvent, event
+ */
+ void ReceiveExtensionRequestL( TMceStateTransitionEvent& aEvent );
+
+ /**
+ * Receive Error for an Extension Request sent.
+ * Error Can be anything like ICMP, SIP Timeout.
+ * @param aRequest, request for which error is received.
+ */
+ void ReceiveExtensionError( CSIPTransactionBase& aTransaction, TInt aError );
+
+
+public://responses
+
+
+ /**
+ * Sends answer to offer carried by INVITE
+ * This is called when client accepts (EMceItcAcceptSession)
+ * @param aRequest server transaction
+ * @param aReply user defined response (CMceMsgSIPReply)
+ */
+ void SendAnswerL( CSIPServerTransaction& aRequest,
+ CMceMsgBase& aReply );
+
+ /**
+ * Sends answer to offer carried by re-INVITE
+ * @param aRequest the re-invite
+ */
+ void SendAnswerL( CSIPServerTransaction& aRequest );
+
+ /**
+ * Sends rejection 488 Not Acceptable Here to offer with warning,
+ * if warning is assigned to one of 3xx warnings. If warning is assigned
+ * to 4xx, 5xx or 6xx it is been interpretet as response code.
+ * @param aReason reason why 488 or response code is sent
+ * @param aInvite server transaction
+ */
+ void SendRejectOfferWithWarningL( TMceSipWarningCode aReason,
+ CSIPServerTransaction& aInvite );
+ /**
+ * Sends 200OK reponse (to BYE)
+ * @param aRequest server transaction
+ */
+ void Send200OKL( CSIPServerTransaction& aRequest );
+
+ /**
+ * Sends 603 Decline or user response to request (INVITE)
+ * @param aRequest server transaction
+ * @param aReply user defined response (CMceMsgSIPReply)
+ */
+ void SendDeclineL( CSIPServerTransaction& aRequest,
+ CMceMsgBase& aReply );
+
+ /**
+ * Sends 180 Ringing to request (INVITE)
+ * @param aRequest server transaction
+ * @param aReply user defined response (CMceMsgSIPReply)
+ * @return ETrue, if response was sent reliably
+ */
+ TBool SendRingL( CSIPServerTransaction& aRequest,
+ CMceMsgBase& aReply );
+
+ /**
+ * Sends 182 SipQueued message to request (INVITE)
+ * @param aRequest server transaction
+ * @param aReply user defined response (CMceMsgSIPReply)
+ * @return ETrue, if response was sent reliably
+ */
+
+
+ TBool SendSipQueuedL( CSIPServerTransaction& aRequest,
+ CMceMsgBase& aReply );
+
+
+ /**
+ * Sends a response to request (INVITE).
+ * For responses sent automatically by state machine,
+ * not for those coming from client.
+ * @param aRequest server transaction
+ * @param aCode the reason code
+ * @param aReason the reasn phrase as string pool index
+ */
+ void SendResponseL( CSIPServerTransaction& aRequest,
+ TUint32 aCode,
+ TInt aReason );
+
+ /**
+ * Seize re-sending UPDATE/PRACK.
+ * @return ETrue if interrupt succeeded.
+ */
+ TBool InterruptConfirming();
+
+ /**
+ * Receive Responses to the Extnesion request sent.
+ * @param aResponse, response need to be sent to the client
+ * @param aBody session body
+ */
+
+ void ReceiveExtensionResponseL( CSIPClientTransaction& aResponse,
+ CMceComSession& aBody );
+
+
+ /**
+ * Sends a response to the extension requests received
+ * @param aData SIP data
+ * @param aIds set of ids defining ITC call context
+ */
+ void SendExtensionResponseL( CMceMsgBase& aData, TMceIds& aIds );
+
+
+public://new functions
+
+ /**
+ * Called when update has been succeed
+ */
+ void UpdateSucceed();
+
+ /**
+ * Called when update has been failed
+ */
+ void UpdateFailed();
+
+ /**
+ * Encodes session body
+ * @return aEncodedBody place holder to encode session body
+ */
+ HBufC8* BodyToTextL();
+
+ /**
+ * Creates SDP document based on client/server transaction
+ * @param aSDPContainer transaction
+ * containing SDP document in its content
+ * @return system wide error / SDP error
+ */
+ TInt CreateSDP( CSIPTransactionBase& aSDPContainer );
+
+
+ /**
+ * Process the ReliableResponse
+ * @return EFalse if response contains RSeq value that is not one higher than the last one.
+ */
+ TBool ProcessReliableResponse( const CSIPResponseElements& aResponseElements );
+
+
+ /**
+ * Handle Reliable Response
+ * @return EFalse if response contains RSeq value that is not one higher than the last one.
+ */
+ TBool TMceActionSet::NeedToProcessL( TMceStateTransitionEvent& aEvent );
+
+
+ /**
+ * Check if session response contact header has sips uri or tls parameters
+ * @param aTransaction sip transaction msgs
+ * @return void
+ */
+ void CheckContactIsSecureL( CSIPTransactionBase& aTransaction );
+
+
+ /**
+ * Finds if the Request is Extenssion Request
+ * @return ETrue if the Request is Extension Request
+ */
+
+ TBool IsExtensionRequest( RStringF method );
+
+
+public://Session timer related
+
+ /**
+ * Process session timer data in received INVITE
+ * @param aRequest the request
+ */
+ void ProcessSessionTimerServerL( CSIPServerTransaction& aRequest );
+
+ /**
+ * Process session timer data in received response
+ * @param aResponse the response
+ */
+ void ProcessSessionTimerClientL( CSIPClientTransaction& aResponse );
+
+ /**
+ * Resets session timer
+ */
+ void ResetSessionTimerL();
+
+ /**
+ * Stop pending timer
+ */
+ void StopPendingTimer();
+
+ /**
+ * Sends re-invite indicating session refresh
+ */
+ void SendSessionRefreshL();
+
+public://Media related
+
+ /**
+ * Handles ITC function, which controls media
+ * @param aIds set of ids defining ITC call context
+ * @param aAction ITC function defining the action
+ * @return aReturnMessage message to return
+ */
+ HBufC8* ControlMediaL( TMceIds& aIds, TMceItcFunctions aAction );
+
+ /**
+ * Handles ITC function, which controls media
+ * @param aIds set of ids defining ITC call context
+ * @param aAction ITC function defining the action
+ * @param aMessage message
+ */
+ void ControlMediaL( TMceIds& aIds, TMceItcFunctions aAction,
+ const TDesC8& aMessage );
+
+ /**
+ * Handles ITC function, which controls media
+ * @param aIds set of ids defining ITC call context
+ * @param aAction ITC function defining the action
+ * @param aMessage message
+ */
+ void ControlMediaL( TMceIds& aIds, TMceItcFunctions aAction,
+ TPtr8& aMessage );
+
+
+ /**
+ * Stops all media
+ */
+ void StopMedia();
+
+ /*
+ * stop the ongoing updating media
+ */
+ void StopUpdatingMedia();
+
+
+ /**
+ * Informs client about new incoming session update
+ * @param aInvite server transaction
+ */
+ void ClientMediaStateChangedL( TMceMccComEvent* aMccEvent,
+ TMceMediaEventCode aEvent = EMceMediaEventReceived );
+
+
+protected://methods
+
+
+ /**
+ * Converts SDP document to text
+ * @param aDocument SDP document
+ * @return SDP document as text
+ */
+ HBufC8* CreateSDPContentLC( CSdpDocument& aDocument );
+
+ /**
+ * Creates multipart-mixed content
+ * @param aDocument SDP document
+ * @param aUserContentType user defined content type to be mixed in
+ * @param aUserContent user content to be mixed in
+ * @return multipart-mixed content
+ */
+ HBufC8* CreateMultipartContentLC( CSdpDocument& aDocument,
+ const TDesC8& aUserContentType,
+ const TDesC8& aUserContent );
+
+ /**
+ * Process session timer data in received INVITE
+ * @param aElements message elements
+ */
+ void ProcessSessionTimerServerL( const CSIPMessageElements& aElements );
+
+ /**
+ * Adds session timer headers, when session is acting as server,
+ * to response
+ * @param aSipHeaders SIP headers container
+ */
+ void AddSessionTimerFieldsServerL(
+ RPointerArray<CSIPHeaderBase>& aHeaders );
+ /**
+ * Adds session timer headers, when session is acting as client,
+ * to request
+ * @param aSipHeaders SIP headers container
+ */
+ void AddSessionTimerFieldsClientL(
+ RPointerArray<CSIPHeaderBase>& aSipHeaders );
+
+ /**
+ * Sends response to request.
+ * @param aRequest the request
+ * @param aResponse the response from client
+ * @return ETrue, if response was sent reliably
+ */
+ TBool SendResponseL( CSIPServerTransaction& aRequest,
+ CMceMsgSIPReply& aResponse );
+
+ /**
+ * Sends warning response to request.
+ * @param aResponseCode the response code
+ * @param aWarnCode the warning code
+ * @param aRequest the request
+ */
+ void SendWarningResponseL( const TUint aResponseCode,
+ const TUint aWarnCode,
+ CSIPServerTransaction& aRequest );
+
+ /**
+ * Processes invite
+ * @param aBody session body
+ * @param aInvite the invite
+ */
+ const CSIPMessageElements* ProcessInviteL(
+ CMceComSession& aBody,
+ CSIPServerTransaction& aInvite );
+
+ /**
+ * Sends session body via callback mechanism to client (session)
+ * @param aIds set of ids defining ITC callback context
+ * @param aBody session body
+ * @param aContent content of message
+ */
+ void SendBodyToClientL( TMceIds& aIds,
+ CMceComSession& aBody,
+ HBufC8* aContent );
+
+
+ /**
+ * Sends SIP data via callback mechanism to client (session)
+ * @param aIds set of ids defining ITC callback context
+ * @param aData SIP data
+ * @param aContent content of message
+ */
+ void SendSIPDataToClientL( TMceIds& aIds,
+ CMceMsgBase& aData,
+ HBufC8* aContent );
+
+
+ /**
+ * Fills client reply from SIP response
+ * @param aReply client reply
+ * @param aResponse SIP response
+ * @return message elements
+ */
+ const CSIPMessageElements* ResponseDataL(
+ CMceMsgSIPReply& aReply,
+ CSIPClientTransaction& aResponse,
+ CMceComSession& aBody );
+
+ /**
+ * Fills session body from SIP request
+ * @param aContainer session body
+ * @param aRequest SIP request
+ * @return message elements
+ */
+ const CSIPMessageElements* RequestDataL( CMceComSession& aContainer,
+ CSIPServerTransaction& aRequest );
+
+ /**
+ * Fills client (request) data from SIP request
+ * @param aContainer client (request) data
+ * @param aRequest SIP request
+ * @return message elements
+ */
+ const CSIPMessageElements* RequestDataL( CMceMsgSIPData& aContainer,
+ CSIPServerTransaction& aRequest );
+
+ /**
+ * Adds SIP headers to SIP request/response. If no headers, adds
+ * default headers
+ * @param aMessageElements message elements of SIP request/response
+ * @param aPrimaryHeaders headers
+ * @param aMethodInd if request, indicates method, whose default headers
+ * @param aContact if ETrue, the Contact header is created and added
+ * will be added
+ */
+ void AddHeadersL( CSIPMessageElements& aMessageElements,
+ CDesC8Array* aPrimaryHeaders,
+ TInt aMethodInd = KErrNotFound );
+
+ /**
+ * Adds SIP headers to SIP request/response. If no headers, adds
+ * default headers
+ * @param aHeaders SIP headers container
+ * @param aPrimaryHeaders headers
+ * @param aMethodInd if request, indicates method, whose default headers
+ * @param aContact if ETrue, the Contact header is created and added
+ * will be added
+ */
+ void AddHeadersL( RPointerArray<CSIPHeaderBase>& aHeaders,
+ CDesC8Array* aPrimaryHeaders,
+ TInt aMethodInd = KErrNotFound );
+
+ /**
+ * Adds the SIP extension headers according to support of the extensions.
+ * @param aHeaders SIP headers container
+ * @param aTransactionType the transaction type as SIP string constant
+ * @param aIsBody ETrue, if request/response will contain a body
+ * @param aIsResponse ETrue, if the headers are for response
+ * @param aResponseCode the response code
+ * @return ETrue if this yelds to a relibly sent provisional response.
+ */
+ TBool AddExtensionHeadersL( RPointerArray<CSIPHeaderBase>& aHeaders,
+ TInt aTransactionType,
+ TBool aIsBody,
+ TBool aIsResponse = EFalse,
+ TUint aResponseCode = KErrNone );
+
+ /**
+ * Sends specified request. Supports INVITE, PRACK and UPDATE.
+ * @param the request method as SIP string
+ * @param client data
+ * @param aContent if ETrue, use content in request
+ */
+ void SendRequestL( TInt aMethod, CMceComSession* aData = NULL,
+ TBool aContent = ETrue );
+
+ /**
+ * Find active body for sip session.
+ * @return active body
+ */
+ CMceComSession& ActiveBody();
+
+
+private://data
+
+ //SIP session instance
+ CMceSipSession& iSession;
+
+ //definitions for unit testing
+ MCESRV_UT_DEFINITIONS
+
+ };
+
+
+/**
+ * implementaion of event handler interface
+ *
+ */
+class TMceComEventHandler : public MMceEventHandler
+ {
+
+public:
+
+ TMceComEventHandler( CMceMediaManager& aMediaManager );
+
+ TMceComEventHandler( CMceMediaManager& aMediaManager,
+ TPtr8& aWriteData );
+
+ TMceComEventHandler( CMceMediaManager& aMediaManager,
+ const TDesC8& aReadData );
+
+ TMceComEventHandler( CMceMediaManager& aMediaManager,
+ HBufC8*& aWriteData );
+
+ /**
+ * Handles event for sink
+ * @param aTarget target
+ * @param aEvent event
+ */
+ TInt HandleL( CMceComMediaSink& aTarget, TMceComEvent& aEvent );
+
+ /**
+ * Handles event for source
+ * @param aTarget target
+ * @param aEvent event
+ */
+ TInt HandleL( CMceComMediaSource& aTarget, TMceComEvent& aEvent );
+
+ /**
+ * Handles event for rtp sink
+ * @param aTarget target
+ * @param aEvent event
+ */
+ TInt HandleL( CMceComRtpSink& aTarget, TMceComEvent& aEvent );
+
+ /**
+ * Handles event for rtp source
+ * @param aTarget target
+ * @param aEvent event
+ */
+ TInt HandleL( CMceComRtpSource& aTarget, TMceComEvent& aEvent );
+
+
+ /**
+ * Handles event for speaker sink
+ * @param aTarget target
+ * @param aEvent event
+ */
+ TInt HandleL( CMceComSpeakerSink& aTarget, TMceComEvent& aEvent );
+
+ /**
+ * Handles event for display sink
+ * @param aTarget target
+ * @param aEvent event
+ */
+ TInt HandleL( CMceComDisplaySink& aTarget, TMceComEvent& aEvent );
+
+ /**
+ * Handles event for mic source
+ * @param aTarget target
+ * @param aEvent event
+ */
+ TInt HandleL( CMceComMicSource& aTarget, TMceComEvent& aEvent );
+
+ /**
+ * Handles event for camera source
+ * @param aTarget target
+ * @param aEvent event
+ */
+ TInt HandleL( CMceComCameraSource& aTarget, TMceComEvent& aEvent );
+
+ /**
+ * Handles event for file source
+ * @param aTarget target
+ * @param aEvent event
+ */
+ TInt HandleL( CMceComFileSource& aTarget, TMceComEvent& aEvent );
+
+ /**
+ * Handles event for file sink
+ * @param aTarget target
+ * @param aEvent event
+ */
+ TInt HandleL( CMceComFileSink& aTarget, TMceComEvent& aEvent );
+
+
+private://NOT owned data
+
+ //media manager instance
+ CMceMediaManager& iMediaManager;
+
+ TPtr8* iWriteData;
+ const TDesC8* iReadData;
+
+ HBufC8** iReturnData;
+
+ };
+
+
+#endif //MCEACTIONSET_H
+
+
+// End of File