upnpmediaserver/mediaserverengine/inc/upnpmediaserver.h
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpmediaserver/mediaserverengine/inc/upnpmediaserver.h	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,437 @@
+/** @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:  Media server device
+ *
+*/
+
+
+#ifndef C_CUPNPMEDIASERVER_H
+#define C_CUPNPMEDIASERVER_H
+
+// INCLUDES
+#include <in_sock.h>
+#include <upnpnetworkeventobserver.h>
+#include "upnpmediaserver.pan"
+#include "upnpmediaserversettings.h"
+#include "upnpmediaservereventhandler.h"
+#include "upnpnotifytimer.h"
+#include "upnpsymbianserverbase.h"
+#include "upnpmediaserverclient.h"
+
+
+// CONSTANTS
+_LIT(KMSPublicAccessedDir,"public");
+_LIT(KMSMediaDir,"Media");
+_LIT(KMSDeviceXmlDescDir,"MediaServer1");
+_LIT(KMSDeviceXmlDescFile,"MediaServer1.xml");
+_LIT(KCDXmlDescFile,"ContentDirectory1.xml");
+_LIT(KCMXmlDescFile,"ConnectionManager1.xml");
+_LIT(KIconDirectory, "icon");
+_LIT(KBackupSuffix,".bak");
+_LIT(KDescTemplateDrive,"Z:");
+//
+const TUint KMSDescriptionMaxSize = 204800;
+
+//note that this value should be less than upnp server process shutdown timeout value
+const TInt KStopAVMediaServerDelay = 1500000;
+
+// FORWARD DECLARATIONS
+class CUpnpContentDirectoryService;
+class CUpnpContainerList;
+class CUpnpItem;
+class CUpnpContainer;
+class CUpnpCM;
+class CUpnpSecurityManager;
+class CUpnpDeviceImplementation;
+class CUpnpIconManager;
+class CUpnpDiskRemoveDetector;
+class CUpnpDeviceDescriptionStore;
+
+class CUpnpConnectionManagerNetworkEventProvider;
+class CUpnpMediaServerDescriptionProvider;
+
+
+
+// CLASS DECLARATION
+
+/**
+ *  UPnP Media Server container.
+ *  Provides interface for Media Server maintanace purposes.
+ *
+ *  @since Series 60 3.1
+ */
+class CUpnpMediaServer : public CUpnpSymbianServerBase, MUpnpSettingObserver,
+        MUpnpContentDirectoryEventObserver, MUpnpNetworkEventObserver
+    {
+public:
+    // Constructors and destructor
+
+    /**
+     * Two-phased constructor.
+     */
+    static CUpnpSymbianServerBase* NewLC();
+
+    /**
+     * Destructor.
+     */
+    virtual ~CUpnpMediaServer();
+
+public:
+    // New functions
+    void GetSharedItemListL( TInt aContId,
+        CUpnpBrowseCriteria* aBrowseCriteria, TInt* TotalMatches,
+        CUpnpItemList* aItemList );
+    void GetSharedContainerListL( TInt aContId,
+        CUpnpBrowseCriteria* aBrowseCriteria, TInt* TotalMatches,
+        CUpnpContainerList* aContainerList );
+    void UnshareItemListL( RArray<TInt>& aItemList, TInt* aExecutionStatus );
+    CUpnpItem* GetSharedItemL( TInt aItem );
+    CUpnpContainer* GetSingleContainerL( TInt aContainerId );
+    void UnshareRootL();
+    void UnshareItemL( TInt aId );
+    void UnshareContainerL( TInt aId );
+
+    /**
+     * Shares new item
+     */
+    void ShareObjectL( CUpnpObject* aItem );
+
+    /**
+     * Shares new items
+     */
+    void ShareItemListL( CUpnpItemList* aItemList, TInt* aStatus );
+
+    /**
+     * Creates a new reference
+     */
+    void ShareReferenceL( CUpnpItem* aItem );
+
+    /**
+     * Shares new 'reference item' list
+     */
+    void ShareReferenceListL( CUpnpItemList* aItemList, TInt* aStatus );
+
+    /**
+     * Starts AV Media Server - Device, Service, ContentDirecory, ConnectionManager
+     */
+    void StartAVMediaServerL();
+
+    /**
+     * Starts AV Media Server in offline mode
+     */
+    void StartAVMediaServerOfflineL();
+
+    /**
+     * Stops AV Media Server - Device, ContentDirecory, ConnectionManager
+     * Starts timeout timer
+     */
+    void StopAVMediaServer( TBool aSilent );
+
+    /**
+     * Restarts AV Media Server - Device, ContentDirecory, ConnectionManager
+     */
+    void RestartAVMediaServerL();
+
+    /**
+     * Check status of AV Media Server
+     */
+    RUpnpMediaServerClient::TServerStatus Status() const;
+
+    /**
+     * Sets description properties for device, changes are available after restarting
+     * the server.
+     * Values are read from Central Repository
+     * @param aDevice device to change
+     */
+    void SetDescriptionSettingsL( CUpnpDeviceImplementation* aDevice );
+
+    /**
+     * Adds icon to public\MediaServer1\icon and adds icon element
+     * to device description xml
+     * @param aProperty device to change
+     */
+    void AddIconL( const TDesC8& aProperty );
+
+    /**
+     * Updates icon in public\MediaServer1\icon and updates icon element
+     * in device description xml
+     * @param aProperty
+     * @param aUrl icon url
+     */
+    void UpdateIconL( const TDesC8& aProperty, const TDesC8& aUrl );
+
+    /**
+     * Removes icon from public\MediaServer1\icon and removes icon element
+     * from device description xml
+     * @param aUrl icon url
+     */
+    void RemoveIconL( const TDesC8& aUrl );
+
+    /**
+     * Removes all icons from public\MediaServer1\icon and removes icon elements
+     * from device description xml
+     */
+    void RemoveIconsL();
+
+    /**
+     * Sets description property for device, changes are available after restarting
+     * the server.
+     * Value is read from Central Repository
+     * @param aDevice device to change
+     * @param aKey Central Repository property key
+     * @param aName property name (XML)
+     */
+    void SetDescriptionPropertyL( CUpnpDeviceImplementation* aDevice,
+        TInt aKey, const TDesC8& aName );
+
+    /**
+     * Sets description required property for device, changes are available after restarting
+     * the server.
+     * Value is read from Central Repository
+     * @param aDevice device to change
+     * @param aKey Central Repository required property key
+     * @param aName property name (XML)
+     */
+    void SetDescriptionRequiredPropertyL( CUpnpDeviceImplementation* aDevice,
+        TInt aKey, const TDesC8& aName );
+
+    /**
+     * Removes white characters from input descriptor
+     * @param aString to change
+     */
+    void RemoveWhiteSpaces( TDes8& aString );
+
+    /**
+     * Initialize Media Server files in private directory.
+     * @param aOverwrite indicate whether files should be overwrite if exist
+     */
+    void InitializeL( TBool aOverwrite );
+
+    /**
+     * Reset Content Directory DB
+     * It means that it rename original file adding suffix KBackupSuffix,
+     * s during next running Content Directory will create new DB file.
+     */
+    void ResetDbL();
+
+    /**
+     * Delete Content Directory DB
+     * It means that it deletes database file
+     */
+    void DeleteDbL();
+
+    /**
+     * Subscribe events, adds observer to the list
+     * @param aObserver event observer
+     */
+    void SubscribeEvents( MUpnpContentDirectoryEventObserver* aObserver );
+
+    /**
+     * Unsubscribe events, removes observer from list
+     * @param aObserver event observer
+     */
+    void UnsubscribeEvents( MUpnpContentDirectoryEventObserver* aObserver );
+
+    TInetAddr GetAddress();
+
+    /**
+     * Set the download and thumbnail path in CD according to the value of the upload directory.
+     * @param aContentDirectory
+     * @return full name of description file
+     */
+    void SetUploadDirToCDL( const TDesC& aPath );
+
+    /**
+     * Cancels scheduled shutdown of MS
+     */
+    void CancelAVMediaServerStop();
+
+    /**
+    * Set the upload and thumbnail path in CD and in central repository.
+    * @param aPath new path
+    */
+    void SetUploadDirL( const TDesC& aPath );
+
+public:
+    // From MUpnpContentDirectoryEventObserver
+    /**
+     * Called when transfer event happens
+     * @param aTransferEvent transfer event
+     */
+    virtual void FileTransferEvent( CUpnpFileTransferEvent *aTransferEvent );
+
+    /**
+    * Checks if interface is up
+    * @result return ETrue if started in online mode
+    */
+    TBool IsInterfaceUp();
+
+    // From MUpnpSettingObserver
+    /**
+     * Function notify when setting will change
+     */
+    virtual void SettingChangedL();
+
+private:
+    // New methods
+
+    /**
+     * Constructor
+     */
+    CUpnpMediaServer();
+
+    /**
+     * Perform the second phase construction of a CUpnpMessageHandler object
+     */
+    void ConstructL();
+
+    /**
+     * Init Media Server directory structure in private directory.
+     * @param aFs handle to RFs
+     * @return a updateId of container
+     */
+    void InitPrivateDirL( RFs &aFs );
+
+    /**
+     * Checks is description file exists. If not creates it from teplate stored on Z:
+     * If parameter aOverwrite
+     * @param aFs handle to RFs
+     * @param aTempleteDescFile xml description file name
+     * @param aOverwrite indicate whether file should be overwrite if exists
+     * @return full name of description file
+     */
+    HBufC* InitDescFileL( RFs &aFs, const TDesC& aTempleteDescFile,
+        TBool aOverwrite );
+
+    /**
+     * Create full name using drive MS directory structure and file name.
+     * @param aFs handle to RFs
+     * @param aDrive drive
+     * @param aName file name
+     * @return full name of description file
+     */
+    HBufC* CreateFullNameL( RFs &aFs, const TDesC& aDrive,
+                const TDesC& aName );
+
+private:
+    /**
+     * Stops MS immediatly
+     */
+    void StopAVMediaServerImmediately( TBool aSilent, TBool aWlanLost );
+
+private://from CUpnpSymbianServerBase
+
+    /**
+     * Create a time server session, and return a pointer to the created object
+     * @param aMessage client message
+     * @result pointer to new session
+     */
+    CSession2* NewSessionL( const RMessage2& aMessage ) const;
+
+    /**
+     * @return ETrue when media server is in state that it can be stopped
+     */
+    TBool CanBeStopped() const;
+
+    /**
+     * Returns version that is supported by this server.
+     */
+    TVersion SupportedVersion() const;
+
+    /**
+     * Returns server name
+     */
+    const TDesC& ServerName() const;
+    
+    /**
+     * Change media server status
+     */
+    void SetStatus( RUpnpMediaServerClient::TServerStatus aStatus );
+    
+    /**
+     * Method should be invoked to notify all subscribed clients about
+     * media server change. It is invoked if after RunL method status
+     * is changed, and in every case that server change its status
+     * without user request (eq. wlan lost) 
+     */
+    void NotifyStatusChanged();
+
+private:    // from MUpnpNetworkEventObserver
+
+    /**
+     * It is called from bottom layer when network event occurs [callback method]     
+     * @result None
+     */
+    void NetworkEvent( CUpnpNetworkEventBase* aEvent );
+
+private:    // from CUpnpSymbianServerBase
+    virtual void RunL();
+    
+private:
+    /**
+     * Callback if timer expires
+     */
+    void TimerEventL( CUpnpNotifyTimer* aTimer );
+
+private:
+
+    /*! @var iDevice Media Server Device */
+    CUpnpDeviceImplementation* iDevice;
+    /*! @var iContentDirecory Content Directory */
+    CUpnpContentDirectoryService* iContentDirecory;
+    /*! @var iCm Connection Manager  */
+    CUpnpCM* iCm;
+    /*! @var iIconManager Icon Manager  */
+    CUpnpIconManager* iIconManager;
+
+    /*! @var iMsName Media Server Device description file full name */
+    HBufC* iMsName;
+    /*! @var iCdName Content Directory Service description file full name */
+    HBufC* iCdName;
+    /*! @var iCmName Connection Manager Service description file full name */
+    HBufC* iCmName;
+
+    /*! @var iMsStatus Media Server operational status - started/started offline/stopped */
+    RUpnpMediaServerClient::TServerStatus iMsStatus;
+
+    /*! @var interface for reading and setting Media Server settings */
+    CUpnpMediaServerSettings* iSettings;
+
+    /*! @var security manager pointer */
+    CUpnpSecurityManager* iManager;
+
+    /*! @var list of event observers (subscribed sessions) */
+    RPointerArray<MUpnpContentDirectoryEventObserver> iObserverList;
+
+    // memory card remove watcher
+    CUpnpDiskRemoveDetector* iDiskDetector;
+
+    // flag that stores shut down type
+    TBool iIsSilentShutdown;
+
+    //please note that it only stops media server as UPnP entity (sends bye bye etc.)
+    //not symbian server object
+    CUpnpNotifyTimer* iStopAVMediaServerTimer;
+    
+    // Network events provider used for WLAN lost and address change
+    CUpnpConnectionManagerNetworkEventProvider* iConnectionManagerNetworkEventProvider;
+    
+    // Provides files for description part
+    CUpnpMediaServerDescriptionProvider* iDescriptionProvider;
+    
+    // Services device description
+    CUpnpDeviceDescriptionStore* iDescriptionStore;
+    };
+
+#endif // C_CUPNPMEDIASERVER_H