--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/servicediscoveryandcontrol/pnp/test/upnp/Server/ControlPoint/inc/upnpstatemachine.h Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,255 @@
+// Copyright (c) 2008-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:
+// @file
+// @internalComponent
+//
+//
+
+#ifndef __UPNPSTATEMACHINE_H_
+#define __UPNPSTATEMACHINE_H_
+
+//System Includes
+#include <comms-infras/ss_coreprstates.h>
+#include <comms-infras/corescprstates.h>
+#include <comms-infras/ss_coreprstates.h>
+#include <comms-infras/ss_corepractivities.h>
+#include <comms-infras/ss_nodemessages_factory.h>
+#include <ss_glob.h>
+
+//Local Includes
+#include "upnpctrlscpr.h"
+#include "upnpservicescpr.h"
+#include "upnpservicedeftscpr.h"
+#include "upnpflowfactory.h"
+#include "upnpflowbase.h"
+
+namespace UPnPStateMachine
+{
+ //Should never be used except for the MM itself
+ const TInt KSendRequest = NetStateMachine::KExecuteAlways - 5;
+ const TInt KProcessResponse = NetStateMachine::KExecuteAlways - 6;
+ const TInt KDescribeRequest = NetStateMachine::KExecuteAlways - 7;
+ const TInt KSubscribeRequest = NetStateMachine::KExecuteAlways - 8;
+ const TInt KUnsubscribeRequest = NetStateMachine::KExecuteAlways - 9;
+ const TInt KNotifyRequest = NetStateMachine::KExecuteAlways - 10;
+ const TInt KDeviceTag = NetStateMachine::KExecuteAlways - 11;
+ const TInt KServiceTag = NetStateMachine::KExecuteAlways - 12;
+ const TInt KRootRegisteredTag = NetStateMachine::KExecuteAlways - 13;
+ const TInt KStart = NetStateMachine::KExecuteAlways - 14;
+ const TInt KStop = NetStateMachine::KExecuteAlways - 15;
+ const TInt KActivityStop = NetStateMachine::KExecuteAlways - 16;
+ const TInt KCreateIconTag = NetStateMachine::KExecuteAlways - 17;
+ const TInt KIconCreatedTag = NetStateMachine::KExecuteAlways - 18;
+ const TInt KIconRequest = NetStateMachine::KExecuteAlways - 19;
+
+enum TUpnpServerFlowType
+ {
+ ECallback,
+ ERootDescription,
+ EDescription,
+ ESubscription,
+ EControl,
+ };
+
+typedef TNodeContext<CUPnPSubConnectionProvider, PRStates::TContext> TContext;
+
+DECLARE_SMELEMENT_HEADER ( TAwaitingSetParamRequest, TState<TContext>, NetStateMachine::MState, TContext )
+ virtual TBool Accept ( );
+DECLARE_SMELEMENT_FOOTER ( TAwaitingSetParamRequest )
+
+typedef TAwaitingMessageState<TUpnpMessage::TCreateServerFlow> TAwaitingServerFlowRequest;
+typedef TAwaitingMessageState<TUpnpMessage::TUPnPRequestInfo> TAwaitingUpnpRequestInfo;
+typedef TAwaiting2MessagesState<TUpnpMessage::TLocalHost, TEBase::TError> TAwaitingLocalHostFromMCpr;
+typedef TAwaitingMessageState<TUpnpMessage::TUPnPSearchRequest> TAwaitingSearchRequest;
+
+
+DECLARE_SMELEMENT_HEADER ( TFindOrCreateUdpClientFlow, TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL ( );
+DECLARE_SMELEMENT_FOOTER ( TFindOrCreateUdpClientFlow )
+
+
+DECLARE_SMELEMENT_HEADER ( TFindOrCreateUdpServerFlow, TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL ( );
+DECLARE_SMELEMENT_FOOTER ( TFindOrCreateUdpServerFlow )
+
+
+template<TUpnpServerFlowType FLOWTYPE>
+class TCreateServerFlow : public TStateTransition<PRStates::TContext>
+ {
+public:
+ NETSM_TPL_DECLARE_CTR ( TCreateServerFlow, NetStateMachine::MStateTransition, PRStates::TContext )
+
+ TCreateServerFlow ( PRStates::TContext& aContext )
+ : TStateTransition<PRStates::TContext> ( aContext )
+ {
+ }
+
+ virtual void DoL ( )
+ {
+ ASSERT ( this->iContext.iNodeActivity );
+
+ const TUint8* uriPtr = NULL;
+ TUint size = 0;
+ switch ( FLOWTYPE )
+ {
+ case ECallback:
+ {
+ CUPnPControlSubConnectionProvider& node = static_cast<CUPnPControlSubConnectionProvider&> ( iContext.Node() );
+ uriPtr = node.Callback( ).Ptr ( );
+ size = node.Callback( ).Size ( );
+ }
+ break;
+
+ case EDescription:
+ {
+ CUPnPServiceSubConnectionProvider& node1 = static_cast<CUPnPServiceSubConnectionProvider&> ( iContext.Node ( ) );
+ uriPtr = node1.Key ( ).Ptr ( );
+ size = node1.Key ( ).Size ( );
+ }
+ break;
+
+ case ESubscription:
+ {
+ CUPnPServiceSubConnectionProvider& node2 = static_cast<CUPnPServiceSubConnectionProvider&> ( iContext.Node ( ) );
+ uriPtr = node2.EventUrl ( ).Ptr ( );
+ size = node2.EventUrl ( ).Size ( );
+ }
+ break;
+
+ case EControl:
+ {
+ CUPnPServiceSubConnectionProvider& node3 = static_cast<CUPnPServiceSubConnectionProvider&> ( iContext.Node ( ) );
+ uriPtr = node3.ControlUrl ( ).Ptr ( );
+ size = node3.ControlUrl ( ).Size ( );
+ }
+ break;
+
+ case ERootDescription:
+ {
+ CUPnPServiceDefaultSubConnectionProvider& node4 = static_cast<CUPnPServiceDefaultSubConnectionProvider&> (iContext.Node());
+ uriPtr = node4.Key ( ).Ptr ( );
+ size = node4.Key ( ).Size ( );
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ const TUid requestedUid = { CUPnPFlowFactory::iUid };
+ THttpServerFlowQuery flowQuery ( uriPtr,
+ size,
+ iContext.NodeId (),
+ EHttpServerFlow );
+
+ ESock::TCFFactory::TFindOrCreatePeer msg ( TCFPlayerRole::EDataPlane, requestedUid, &flowQuery );
+
+ TCFPlayerRole playerRole ( TCFPlayerRole::EDataPlane );
+ Messages::TNodeId factoryContainer = SockManGlobals::Get()->GetPlaneFC( playerRole );
+ iContext.iNodeActivity->PostRequestTo( factoryContainer, msg );
+ }
+ };
+
+
+DECLARE_SMELEMENT_HEADER ( TStartServerFlow, TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL ( );
+DECLARE_SMELEMENT_FOOTER ( TStartServerFlow )
+
+DECLARE_AGGREGATED_TRANSITION2 (
+ TProcessServerFlowCreation,
+ PRStates::TProcessDataClientCreation,
+ TStartServerFlow
+ )
+
+DECLARE_SMELEMENT_HEADER ( THandleControlChannelDataClientIdle, TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL ( );
+DECLARE_SMELEMENT_FOOTER ( THandleControlChannelDataClientIdle )
+
+
+DECLARE_SMELEMENT_HEADER ( TRequestLocalHost, TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL ( );
+DECLARE_SMELEMENT_FOOTER ( TRequestLocalHost )
+
+
+DECLARE_SMELEMENT_HEADER ( TSendIgnoreResponse, TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL ( );
+DECLARE_SMELEMENT_FOOTER ( TSendIgnoreResponse )
+
+
+DECLARE_SMELEMENT_HEADER ( TRequestOrIgnoreTag, TStateFork<PRStates::TContext>, NetStateMachine::MStateFork, TContext )
+ virtual TInt TransitionTag ( );
+DECLARE_SMELEMENT_FOOTER ( TRequestOrIgnoreTag )
+
+
+DECLARE_SMELEMENT_HEADER ( TDiscardSearchRequestData, TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL ( );
+DECLARE_SMELEMENT_FOOTER ( TDiscardSearchRequestData )
+
+
+DECLARE_SMELEMENT_HEADER ( TDestroyDataClients, TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL ( );
+DECLARE_SMELEMENT_FOOTER ( TDestroyDataClients )
+
+
+DECLARE_SMELEMENT_HEADER ( TStopDataClients, TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL ( );
+DECLARE_SMELEMENT_FOOTER ( TStopDataClients )
+
+
+DECLARE_SMELEMENT_HEADER ( TAwaitingToStopDataClients, TState<TContext>, NetStateMachine::MState, TContext )
+ virtual TBool Accept ( );
+DECLARE_SMELEMENT_FOOTER ( TAwaitingToStopDataClients )
+
+DECLARE_SMELEMENT_HEADER ( TAwaitingBindToComplete, TState<TContext>, NetStateMachine::MState, TContext )
+virtual TBool Accept ( );
+DECLARE_SMELEMENT_FOOTER ( TAwaitingBindToComplete )
+
+DECLARE_SMELEMENT_HEADER ( TStoreBindToOriginator, TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL ( );
+DECLARE_SMELEMENT_FOOTER ( TStoreBindToOriginator )
+
+
+
+
+// State Forks..
+
+struct TCheckIfAllActivitiesStopped
+ {
+ // graceful closing of activites is not needed in case of service point,
+ // since the State machines are simple and there are no lo
+ static TBool IsBlocked ( TNodeContextBase& aContext )
+ {
+ // wait untill all upnp activites are done with protocol specific transactions
+ return aContext.iNode.CountAllActivities ( ) == 1 ? EFalse : ETrue;
+ }
+ };
+
+DECLARE_SERIALIZABLE_STATE(
+ TBlockedByAllActivitiesStopped,
+ TCheckIfAllActivitiesStopped,
+ TNoTag
+ )
+
+// Utiliy API's
+class CUPnPUtils
+ {
+public:
+ static TInt ExtractVersionNumber ( const TDesC8& aSearchTarget, TInt& aUriIndex );
+ static void CleanupMBufChain ( TAny* aAny );
+ static void FindAndSendIconDataL ( CTransaction* aTransaction, TInt& aStatus, RMemoryAllocator& aAllocator );
+ };
+
+}
+
+#endif /*__UPNPSTATEMACHINE_H_*/