upnp/upnpstack/serviceframework/inc/upnpdispatcherengine.h
changeset 0 f5a58ecadc66
--- /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 <e32base.h>
+#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<CUpnpDevice>& 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<MUpnpDispatcherCustomer>  iCustomers;
+
+    /*! @var iNewDevices List of new devices that were found on this query */
+    RPointerArray<CUpnpDevice>              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<CUpnpDispatcherRequest>  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