diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/serviceframework/inc/upnpdispatcherengine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/serviceframework/inc/upnpdispatcherengine.h Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,407 @@ +/** @file +* Copyright (c) 2005-2006 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: Message dispacther engine +* +*/ + + +#ifndef C_CUPNPDISPATCHERENGINE_H +#define C_CUPNPDISPATCHERENGINE_H + +// INCLUDES +#include +#include "upnpdispatchersession.h" +#include "upnpdevice.h" +#include "upnphttpserver.h" + +// FORWARD DECLARATIONS +class CUpnpDispatcherRequest; +class MDispatcherEngineObserver; +class CUpnpHttpServerSession; + +// CLASS DECLARATION + +/** +@brief A message dispatcher unit cooperating with Message Handler + +This class represents a logical unit between UPnP devices / control points +and Message Handler. Message Handler is a Symbian Server - thus, dispatcher +follows the same client/server framework and is a client that opens a session +to Message Handler. This is not done by class CUpnpDispatcherEngine; +the class RUpnpDispatcherSession represents the client interface. + +Using AddCustomer/RemoveCustomer functions it is possible to set the active +services. Dispatcher is able to forward messages to its customers. + +Also SendMessage function is very essential part of the dispatcher. + */ +class CUpnpDispatcherEngine : public CActive, public MUpnpHttpServerObserver + { +public: + /** + * Create a CUpnpDispatcherEngine object using two phase construction, + *and return a pointer to the created object. + * + * A session with Message Handler is initiated during the construction. + * + * @param aObserver + * @return a pointer to the created instance of CUpnpDispatcherEngine + */ + static CUpnpDispatcherEngine* NewL( MDispatcherEngineObserver& aObserver ); + + /** + * Create a CUpnpDispatcherEngine object using two phase construction, + * and return a pointer to the created object + * + * A session with Message Handler is initiated during the construction. + * + * @param aObserver + * @return a pointer to the created instance of CUpnpDispatcherEngine + */ + static CUpnpDispatcherEngine* NewLC( MDispatcherEngineObserver& aObserver ); + + /** + * Destroy the object and release all memory objects + */ + virtual ~CUpnpDispatcherEngine(); + +private: + /** + * CUpnpDispatcherEngine + * + * @discussion Perform the first phase of two phase construction + * @param aParent the object to be used to handle updates from the server + * @param aObserver + */ + CUpnpDispatcherEngine( MDispatcherEngineObserver& aObserver ); + + /** + * ConstructL performs the second phase construction of a CUpnpDispatcherEngine + * object + */ + void ConstructL(); + + /** + * Creates http server + */ + void ConstructHttpL(); + +public: + + /** + * Send a message. This function pushes the message to the Message Handler. + * @param aMessage The message to be sent. + */ + void SendMessageL( CUpnpHttpMessage* aMessage ); + + /** + * Add a customer to the customer list of this dispatcher. In practice, + * means that messages start being forwarded to that customer. + * @param aCustomer The customer to be added. + */ + void AddCustomer( const MUpnpDispatcherCustomer& aCustomer ); + + /** + * Remove a customer from the customer list of this dispatcher. In practice, + * means that messages stop being forwarded to that customer. + * @param aCustomer The customer to be removed. + */ + void RemoveCustomer( const MUpnpDispatcherCustomer& aCustomer ); + + /** + *Starts http server + *@since Series60 + *@param aRegister determines if starting error in message handler process will be checked + *@param aPort starts server on fixed port + */ + void StartHttpServerL( TBool aRegister, const TInt aPort ); + + /** + *Stops http server + *@since Series60 + */ + + void StopHttpServer(); + +public: // from CActive + + /** + * Active object RunL, pending request completed. + */ + void RunL(); + + /** + * Active object RunL, pending request completed. + * @param aError code from RunL. + * @result KErrNone. + */ + TInt RunError( TInt aError ); + + /** + * Active object DoCancel, cancel pending requests. + */ + void DoCancel(); + +public: + + // Enum that is used when finding out last request + enum TDispatcherRequest + { + EUnknown = -1, + ENewDevices, + EDeviceList + }; + + + /** + * Return the MAC addess of this CUpnpDispatcherEngine's HTTP server. + * @result Buffer that will contain the MAC address. + */ + const HBufC8* MacAddressL(); + + /** + * Removes a device from Message Handler's device library, + * which has an UUID of aUuid. + * @param aUuid UUID of device that is to be removed. + * @result None. + */ + void RemoveLocalDeviceL( const TDesC8& aUuid, TBool aSilent ); + + /** + * Return the IP addess of this CUpnpDispatcherEngine's HTTP server. + * @result TInetAddr that will contain the IP address of the server. + */ + TInetAddr HttpServerAddress(); + + /** + * Callback from HTTP server that a HTTP message has been received. + * @param aMessage Received message. + * @result None. + */ + void HttpEventLD( CUpnpHttpMessage* aMessage ); + + /** + * Sends a SSDP search for aString + * @param aString Search message we want to send + * @result None. + */ + void SsdpSearchL( const TDesC8& aString ); + + /** + * Sends a SSDP uuids that should not be filtered + * @param aString Uuids + */ + void SsdpStopFilteringL( const TDesC8& aString ); + + /** + * Adds a local device to Message Handler's device library with + * given information. + * @param aUuid UUID of the device + * @param aDeviceType Device type of the device + * @param aDescriptionPath URL to this device's desctiption + * @param aServices List of services provided by this device. + * @param aIsRootDevice ETrue, if this device is UPnP root device, \ + * EFalse otherwise. + * @result None. + */ + void AddLocalDeviceL( const TDesC8& aUuid, + const TDesC8& aDeviceType, + const TDesC8& aDescriptionPath, + const CDesC8Array& aServices, + const TBool aIsRootDevice ); + + /** + * Add control point client to message handler. + */ + void AddControlPointClientL( ); + + /** + * Add control point client to message handler. + */ + void RemoveControlPointClientL( ); + + /** + * This requests Message Handler for new device list. + * @param aUpdateId Dispatcher's last known update id. + */ + void UpdateDevicesL( TInt aUpdateId ); + + /** + * Returns a list of new devices found on last query. + * @return List of CUpnpDevice's. + */ + const RPointerArray& NewDevices() const; + + /** + * Clears the list of newly found devices. + * @result None. + */ + void RemoveDevices(); + + /** + * Deletes current request from list of requests. + * @result KErrNone, if successful. KErrNotFound if no requests + * in list. + */ + TInt RemoveHandledRequest(); + + /** + * Cancels current pending request, if there is a need to send + * for example a SSDP search. + * @result None. + */ + void StopRequestL(); + + /** + * This function sets handle to transaction creator interface. + * @since Series60 5.0 + * @param aTransactionCreator pointer to object implementing MUpnpHttpServerTransactionCreator + * interface. + **/ + void SetTransactionCreator( MUpnpHttpServerTransactionCreator* aTransactionCreator ); + +private: + /** + * Makes a request for devices to Message Handler. + * @return ENewDevices, if request is made for new devices, + * returns EDeviceList, if request is made for new devices list size. + */ + TDispatcherRequest GetDevicesL(); + + /** + * Function gets called when new devices are found. + * @return Last update id. + */ + TInt DevicesReceivedL(); + + /** + * Sets the Dispatcher to handle next request and remove + * the old one. + */ + void HandlePendingRequestL(); + + /** + *Check if start was succesfull + *@sience Series60 5.0 + *@param aRegister + */ + void CheckErrorL( TBool aRegister ); + +private: + + /*! @var iHttpServerSession Pointer to this dispatcher's HTTP server session*/ + CUpnpHttpServerSession* iHttpServerSession; + + /*! @var iSession the message handler session */ + RUpnpDispatcherSession iSession; + + /*! @var iCustomers list of dispatcher customers */ + RPointerArray iCustomers; + + /*! @var iNewDevices List of new devices that were found on this query */ + RPointerArray iNewDevices; + + /*! @var iAddLocalDevice Struct of TInt's that will \ + inform what is the length of each value in the data buffer */ + TUpnpAddLocalDevice iAddLocalDevice; + + /*! @var iAddLocalPtr Pointer to buffer that will contain device \ + information. */ + TPtr8 iAddLocalPtr; + + /*! @var iAddLocalBuffer Buffer that holds the information about \ + device to be added to Message Handler's device library. */ + HBufC8* iAddLocalBuffer; + + enum TGetDeviceListState + { + EGetListSize = 0, + EGetList, + EListReceived, + EOtherOperation, + ENoOperation, + }; + + /*! @var iDeviceGet Current state of DispatcherEngine. */ + TGetDeviceListState iDeviceGetState; + + /*! @var iSize Structure that holds information \ + about number of new services and devices. */ + TUpnpGetDeviceListSize iSize; + + /*! @var iDevs Pointer to list of new devices. */ + TUpnpDevice* iDevs; + + /*! @var iServs Pointer to list of new services. */ + TUpnpService* iServs; + + /*! @var iOldUpdateId Last known update id of this CUpnpDispatcher. */ + TInt iOldUpdateId; + + /*! @var iObserver Reference to this CUpnpDispatcherEngine's parent for \ + callbacks. */ + MDispatcherEngineObserver& iObserver; + + /*! @var iPendingRequests List of requests to Message Handler that \ + ahve not yet been sent. */ + RPointerArray iPendingRequests; + + /*! @var iActiveRequest Request that is currently active \ + to Message Handler. */ + CUpnpDispatcherRequest* iActiveRequest; + + /*! @var iSearch Buffer that holds a search string that will be \ + sent as SSDP message. */ + HBufC8* iSearch; + + /*! @var iGetDevPtr Pointer that is used to receive new devices \ + from Message Handler. */ + TPtr8 iGetDevPtr; + + /*! @var iGetServPtr Pointer that is used to receive new services \ + from Message Handler. */ + TPtr8 iGetServPtr; + + /*! @var iRemoveUuid Pointer to list of new services. */ + HBufC8* iRemoveUuid; + + /*! @var iRemoveUuidPtr Buffer that is used to hold UUID of the \ + device that needs to be removed from Message Handler's device \ + library. */ + TPtrC8 iRemoveUuidPtr; + + /* @var Handle counts for logging */ + TInt iProcessHandlesInStart; + // + TInt iThreadHandlesInStart; + // + TInt iReqsInStart; + // + TInt iProcessHandlesInEnd; + // + + TInt iThreadHandlesInEnd; + // + TInt iReqsInEnd; + + HBufC8* iMXString; + + HBufC8* iUuids; + + TBool iIsSessionOpen; + }; + +#endif // C_CUPNPDISPATCHERENGINE_H + +// End of File \ No newline at end of file