diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/ssdpserver/inc/upnpudpserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/ssdpserver/inc/upnpudpserver.h Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,360 @@ +/** @file + * Copyright (c) 2005-2008 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: Declares main application class. + * + */ + +#ifndef C_CUPNPUDPSERVER_H +#define C_CUPNPUDPSERVER_H + +// INCLUDES +#include +#include +#include +#include +#include +#include "upnpssdpmessage.h" +#include "upnpmessageobserver.h" +#include "upnpconnectionmanagerproxy.h" + +// FORWARD DECLARATIONS +class CUpnpHttpMessage; +class CUpnpUdpSendRequest; + +// CONSTANTS +static const TUint KDefaultStartPort = 2000; +static const TUint KDefaultMulticastPort = 1900; +static const TUint32 KDefaultMulticastAddress = INET_ADDR(239,255,255,250); +static const TUint KAddressLength = 35; +static const TInt KSendTimerLimit = 10; +static const TUint KSendingDelay = 15000; //DLNA specyfies that: UPnP network devices must not send more than 10 ssdp:alive messages +//on a single network interface in any given 200 ms period. So 15ms delay between each message +//should be sufficient 15ms = 15000 microseconds. +static const TUint32 KDefaultAutoIPAddress = INET_ADDR(169,254,255,255); + +// DATA TYPES +typedef CUpnpHttpMessage CUdpMessage; + +// CLASS DECLARATION + +/** + * MUpnpUdpServerObserver is used as interface-class for message delivery + * from CUpnpUdpServer to CUpnpSsdpServer + * + * @since Series60 2.0 + */ +class MUpnpUdpServerObserver + { +public: + // New functions + + /** + * Notifies udp message reception + * @param aMessage UDP message received + */ + virtual void UdpMessageReceivedL( CUdpMessage* aMessage ) = 0; + + }; + +// CLASS DECLARATION + +/** + * CUpnpUdpServer is a base class for CUpnpSsdpServer and it contains all + * "real" methods, as CUpnpSsdpServer contains logical functions. + * + * @since Series60 2.0 + */ +NONSHARABLE_CLASS(CUpnpUdpServer) : public CActive, + public MUpnpMessageObserver + { +public: + // Constructors and destructor + + /** + * C++ default constructor. + * @param aSocketServ Pointer to SocketServer used. + * @param aObserver Pointer to class derived from MUpnpUdpServerObserver. + * Used for callbacks. + * @param aListeningPort Listening port. + * @return A new CUpnpUdpServer instance. + */ + CUpnpUdpServer( RSocketServ* aSocketServ, + MUpnpUdpServerObserver* aObserver, TInt aListeningPort ); + + /** + * Destructor. + */ + ~CUpnpUdpServer(); + +public: + // New functions + + /** + * Returns ETrue if udp server stared, EFalse otherwise + * @since Series60 3.2 + * @return stared flag + */ + TBool IsStarted(); + + /** + * Active Object RunL. + * @since Series60 2.0 + */ + void RunL(); + + /** + * Callback for RunL leave situations. + * @since Series60 2.0 + * @param aError contains the error code that caused the RunL leave. + * @return KErrNone. + */ + TInt RunError( TInt aError ); + + /** + * Active Object DoCancel. + * @since Series60 2.0 + */ + void DoCancel(); + + /** + * Starts to listen for address. + * @since Series60 2.0 + */ + void OpenL(); + + /** + * Closes the server. + * @since Series60 2.0 + */ + void Close(); + + /** + * Sets the server ready for receiving. + * @since Series60 2.0 + */ + void ReceiveL(); + + /** + * Sends aBuffer to IP address anAddr. + * @since Series60 2.0 + * @param aBuffer Buffer that is to be sent. + * @param anAddr Address that aBuffer is to be sent. + */ + void SendL( TDesC8& aBuffer, TInetAddr& anAddr ); + + /** + * Prepares server for receiving after sending. + * @since Series60 2.0 + */ + void SendDoneL(); + + /** + * From MUpnpAddressObserver + * This function will be invoke if IP Address of UPnP changes + */ + IMPORT_C void AddressChangedL( TInetAddr& aAddr ); + +protected: + + // DATA TYPES + enum TSsdpValidity + { + // Message is valid SSDP message. + EMessageOk, + // Message is missing some essential headers. + EHeadersMissing, + // Name of method is not "M-SEARCH". + EHeaderNotMSearch, + // Value of MX header is not numerical. + EErrorInMxConversion, + // Value of MX header not valid. + EInvalidMXValue, + // Value of MAN header not valid. + EInvalidManHeader, + // Value of ST header not valid. + EInvalidStHeader, + // Value of HOST header not valid. + EInvalidHostHeader, + // Message is not valid SSDP response. + EBadSsdpResponse, + // Value of CACHE-CONTROL header not valid. + EInvalidCacheControlHeader + }; + + /** + * Checks that given SSDP message is valid. + * @since Series60 2.0 + * @param aMsg Message to validate. + * @return Error code. KErrNone, if valid message. + */ + TSsdpValidity ValidateSsdpMessageL( CUpnpSsdpMessage* aMsg ); + + /** + * Function gets called when message's timer expires. + * @since Series60 2.0 + * @param aMessage Pointer to message that has expired. + */ + void MessageExpiredL( CUpnpHttpMessage* aMessage ); + + /** + * Function ompares two line ignoring number of space between elements + * @since Series60 2.0 + * @param aValue current value + * @param aPattern pattern value + * @return true if equal, else false + */ + TBool CompareLinesL( const TDesC8& aValue, const TDesC8& aPattern ); + + /** + * Sets socket option which adds address to multicast group + */ + void JoinMulticastGroupL(); + + /** + * Sets socket configuration specific to multicast server + */ + void ApplyMulticastSocketSettingsL(); + + /** + * Sets socket common configuration + */ + void ApplyCommonSocketSettingsL(); + + /** + * Open socket and starts receiving datagrams + */ + void OpenSocketAndStartReceiveL(); + + /** + * Refresh IP address and change auto ip status accordingly + */ + void RefreshLocalAddressInfo(); + +private: + + /** + * Function continue procesing queued request or switch to receive mode + * @since Series60 3.2 + */ + void RestartOrContinueProcessingL(); + + /** + * Function continue send procesing + * @return ETrue if processing restarted + * @since Series60 3.2 + */ + TBool RestartOrContinueSendProcessingL(); + + /** + * Function calculates MX value + * @return MX value + * @since Series60 3.2 + */ + TInt CalculateMxValue( const TDesC8& aMxString ); + + /** + * Function queues response for M-Serach message + * @param Message to be sent after timer elapse + * @since Series60 MCL + */ + void AddPendingTimerMessageL( CUpnpSsdpMessage* aMessage ); + +protected: + + /** + * Used from CUpnpSsdpServer to construct the CUpnpUdpServer correctly. + * @since Series60 2.0 + */ + void UdpConstructL(); + + // DATA TYPES + enum TState + { + EClosed, + EOpen, + EReceiving, + ESending, + ESendingTimer, // new state introduced to handle delay timer between sending messages + ESendDone + }; + +protected: + + // State of CUpnpUdpServer defined as TState + TState iState; + + // Random seed that is used for generating random timeouts + // for sending SSDP responses. + TInt64 iRandomSeed; + + // Address of remote client returned by RSocket::RecvFrom() function + TInetAddr iClientAddr; + + // Address of remote host, e.g. destination of message + TInetAddr iSenderAddress; + + // Flags of UDP message + TUint iMulticastFlags; + + // List of messages that are waiting to be sent. + RPointerArray iSendRequestList; + + // Pointer to observer, CUpnpSsdpServer + MUpnpUdpServerObserver* iObserver; + + // Pointer to RSocketServer, that is used to bind + // sockets + RSocketServ* iSocketServ; + + // Socket that is used to receive (and send) SSDP messages. + RSocket iSocket; + + // Port number of CUpnpUdpServer + TUint iServerPort; + + // Buffer that is used for receiving messages. + HBufC8* iMessage; + + // Pointer to receive buffer. + TPtr8 iMessagePtr; + + // Buffer that is used for sending + HBufC8* iSendMessage; + + // Array that holds list of messages which are waiting + // for sending after their timers have expired. + CArrayPtrSeg* iPendingTimerMessages; + + // IAP ID of the connection + TInt iActiveIap; + + // Connection for opened sockets + CUpnpConnectionManagerProxy* iConnectionManagerProxy; + + // Timer used to introduce delays to prevent from sending + // SSDP messages more often than one in 20ms time period. + RTimer iSendTimer; + + // indicate if server is started, socket was opened correctly + TBool iIsStarted; + + //Local IP Address of Server + TInetAddr iLocalInterfaceAddress; + + // If the interface goes to AutoIp address + TBool iAutoIP; + }; + +#endif // C_CUPNPUDPSERVER_H +// End of File