videofeeds/clientapi/inc/CIptvServiceManagementClient.h
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/clientapi/inc/CIptvServiceManagementClient.h	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,611 @@
+/*
+* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:    Header file for CIptvServiceManagementClient class*
+*/
+
+
+
+
+
+#ifndef __CIPTVSERVICEMANAGEMENTCLIENT_H__
+#define __CIPTVSERVICEMANAGEMENTCLIENT_H__
+
+// INCLUDE FILES
+#include <e32base.h>
+#include "CIptvIapList.h"
+#include "CIptvTimer.h"
+#include "MIptvTimerObserver.h"
+
+#include "CIptvClientBase.h"
+#include "RIptvClientSession.h"
+#include "IptvClientServerCommon.h"
+#include "CIptvNetworkSelection.h"
+#include "CIptvSmEvent.h"
+#include "CIptvServices.h"
+#include "MIptvServiceManagementClientObserver.h"
+
+// FORWARD DECLARATIONS
+class CIptvSmClientSynchronizer;
+class CIptvService;
+class CIptvServices;
+class MIptvServiceManagementClient;
+class MIptvEvent;
+class CIptvEventListener;
+
+// CLASS DECLARATION
+/**
+*  CIptvServiceManagementClient is the API object for IPTV Service database and Network Selection.\n
+*  Application must implement virtual callback functions from MIptvServiceManagementClientObserver class.\n
+*
+*  Instantiating of CIptvServiceManagementClient will start IPTV engine server if it is not running\n
+*  already.
+*
+*  Only one request pending per CIptvServiceManagementClient object is allowed simultaneously.\n
+*  There is no protocol involved in calling functions. Any request may be called anytime assuming\n
+*  that there is no other request pending already.\n
+*  After service shutdown, client may not call any API functions anymore for that\n
+*  CIptvServiceManagementClient object.\n
+*
+*  Example:\n
+*
+*   void CIptvClient::SomeFunc()\n
+*       {\n
+*       iIptvServiceManagementClient = CIptvServiceManagementClient::NewL(*this);\n							
+*       iIptvServiceManagementClient->GetAllServicesReq();\n
+*       }\n
+*                  
+*   void CIptvClient::GetAllServicesResp(MIptvServiceManagementClientObserver::TRespStatus aRespStatus,\n
+*                                                  CDesC16ArraySeg* aServicesArray)\n
+*   {\n
+*    
+*   TInt i;\n
+*
+*   CIptvService* iptvService;\n
+*   iptvService = CIptvService::NewL();\n				
+*   CleanupStack::PushL(iptvService);\n
+*			
+*   for(i = 0; i < aServicesArray->MdcaCount(); i++)\n
+*      {\n
+*      iptvService->Set(aServicesArray->MdcaPoint(i));\n
+*      RDebug::Print(_L("Service: %S"), &(iptvService->GetName()));\n
+*      }\n
+*
+*   CleanupStack::PopAndDestroy(iptvService);\n
+*   delete aServicesArray;\n
+*
+*   delete iIptvServiceManagementClient;\n
+*   iIptvServiceManagementClient = NULL;\n
+*   }\n
+*/
+class CIptvServiceManagementClient : public CIptvClientBase
+    {
+    public:
+    
+        /**
+        * Flags used for limiting search from the database.
+        */
+        enum TSearchLimitFlag
+            {
+            ESelectedServices = ( 1 << 0 ),  // 1
+            EMainServices     = ( 1 << 1 ),  // 2
+            ESubServices      = ( 1 << 2 ),  // 4
+            EVod              = ( 1 << 3 ),  // 8
+            ELiveTv           = ( 1 << 4 ),  // 16
+            EVodCast          = ( 1 << 5 ),  // 32
+            EBrowser          = ( 1 << 6 ),  // 64
+            EVideoRemote      = ( 1 << 7 ),  // 128
+            EApplication      = ( 1 << 8 ),  // 256
+            EMobileTv         = ( 1 << 9 ),  // 512
+            EVodServices      = ( 1 << 10 ), // 1024
+            EServiceGroup     = ( 1 << 11 ), // 2048
+            EGroupedServices  = ( 1 << 12 ), // 4096
+            EOther            = ( 1 << 13 )  // 8192
+            };
+        
+        /**
+        * Defines the sorting order of the search.
+        */    
+        enum TOrder
+            {
+            /**
+            * Sort by creation date, ascending
+            */
+            EDateAscending = 0,
+            
+            /**
+            * Sort by creation date, descending
+            */
+            EDateDescending,
+            
+            /**
+            * Sort by display order, ascending
+            */
+            EDisplayOrderAscending,
+
+            /**
+            * Sort by display order, descending
+            */
+            EDisplayOrderDescending
+            };
+
+    private:
+    
+        /**
+        * We have to know which service entity has the message pending
+        * in order to send correct cancel message.
+        */
+        enum TRequestPendingFor
+            {
+            ENoRequestPending = 0,
+            EServerRequestPending,
+            EServiceManagerRequestPending,
+            ENetworkSelectionRequestPending
+            };
+                                 		    		       
+    public: // Constructors and destructors
+        /**
+        * Two-phased constructor.
+        * Creates a CIptvServiceManagementClient object using two phase construction,
+        * and return a pointer to the created object.
+        * @param aClient A reference to client.
+        * @return        A pointer to the created instance of CIptvServiceManagementClient.
+        */
+        IMPORT_C static CIptvServiceManagementClient* NewL(MIptvServiceManagementClientObserver& aClient);
+		
+        /**
+        * Destructor.
+        * Destroys the object and releases all memory objects.
+        */
+        IMPORT_C virtual ~CIptvServiceManagementClient();
+
+    public: // New functions
+
+        /**
+         * Adds a new entry to Services database asynchronously.
+         * AddServiceResp is the callback function.
+         *
+         * @param aService Service data which is added to database.
+         * @return         KErrNone if request was sent to server successfully,
+         *                 system-wide error code otherwise.
+         */
+        IMPORT_C TInt AddServiceReqL(CIptvService& aService);
+
+        /**
+         * Adds a new entry to Services database synchronously.
+         *
+         * @param aService    Service data which is added to database.
+         * @param aRespStatus Status of the operation.
+         * @return            Returns KErrNone if request was sent to server successfully,
+         *                    system-wide error code otherwise. If != KErrNone, aRespStatus
+         *                    doesn't contain valid data.
+         */
+        IMPORT_C TInt AddServiceL(CIptvService& aService,
+		                              MIptvServiceManagementClientObserver::TRespStatus& aRespStatus);
+
+        /**
+         * Updates existing entry in Services database asynchronously.
+         * Every item in CIptvService class is compared with database values,
+         * if they differ the database value is changed.
+         * If entry does not exist, EServiceNotFound error is given in UpdateServiceResp
+         * callback function argument.
+         * @param aService New service data
+         * @return         Returns KErrNone if request was sent to server successfully,
+         *                 system-wide error code otherwise.
+         */
+        IMPORT_C TInt UpdateServiceReqL(CIptvService& aService);
+
+        /**
+         * Updates existing entry in Services database synchronously.
+         * If entry does not exist, EServiceNotFound error is given in aRespStatus.
+         * @param aService    New service data
+         * @param aRespStatus Status of the operation.
+         * @return            Returns KErrNone if request was sent to server successfully,
+         *                    System-wide error code otherwise. If != KErrNone, aRespStatus
+         *                    doesn't contain valid data.
+         */
+        IMPORT_C TInt UpdateServiceL(CIptvService& aService,
+                                     MIptvServiceManagementClientObserver::TRespStatus& aRespStatus);
+
+        /**
+         * Gets services from the database asynchronously.
+         * GetServicesResp is the callback function.
+         * @param aSearchLimitFlags Indicates how the search is limited. Flags can be
+         *                          combined with "or" -operation. 0 returns all services.
+         * @param aOrder            Order in which the services are returned.
+         * @return                  Returns KErrNone if request was sent to server successfully,
+         *                          system-wide error code otherwise.
+         */
+        IMPORT_C TInt GetServicesReqL(TUint32 aSearchLimitFlags, TOrder aOrder);
+
+        /**
+         * Gets services from database synchronously.
+         * @param aSearchLimitFlags Indicates how the search is limited, ie only services which have the feature
+         *                          flag set are included in the search. See TSearchLimitFlag
+         *                          for bit values, flags can be combined with "or" -operation.
+         *                          0 returns all services.
+         * @param aOrder            Order in which the services are returned.
+         * @param aServicesArray    Contains array of pointers to descriptors.
+         *                          aServicesArray ownership is transferred to caller, ie client
+         *                          is responsible for freeing the array.
+         *                          Array elements are binary descriptors built with CIptvService::GetL() method.
+         *                          CIptvService::SetL() method can be used to init CIptvService class with
+         *                          array element data. Client should ensure that aServicesArray pointer
+         *                          does not point to reserved memory when calling this method, since the pointer
+         *                          will be overwritten.
+         *                          In case of error, aServicesArray is set to NULL.
+         * @param aRespStatus       ESucceeded is returned even if no matching
+         *                          services were found. In that case the aServicesArray contains
+         *                          empty array. If aRespStatus != ESucceeded, aServicesArray
+         *                          pointer is NULL.
+         * @return                  Returns KErrNone if request was sent to server successfully,
+         *                          system-wide error code otherwise. If != KErrNone, aServicesArray
+         *                          and aRespStatus do not contain valid data.
+         */
+        IMPORT_C TInt GetServicesL(TUint32 aSearchLimitFlags,
+                                   TOrder aOrder,
+                                   CDesC8ArraySeg*& aServicesArray,
+                                   MIptvServiceManagementClientObserver::TRespStatus& aRespStatus);
+
+        /**
+         * Gets service entries from Services database asynchronously.
+         * Services whos ID are between aStartId and aEndId are returned.
+         * This method is not meant for searching the database, one should know
+         * service ids already when issuing the call.
+         * GetServicesResp is the callback function.
+		     * @param aStartId Unique ID of the first service to be fetched.
+		     * @param aEndId   Unique ID of the last service to be fetched.
+         * @return         Returns KErrNone if request was sent to server successfully,
+         *                 system-wide error code otherwise.
+         */
+        IMPORT_C TInt GetServicesReqL(TUint32 aStartId, TUint32 aEndId);
+
+        /**
+         * Gets service entries from Services database synchronously.
+         * Services whos ID are between aStartId and aEndId are returned.
+         * This method is not meant for searching the database, one should know
+         * service ids already when issuing the call.
+         * @param aStartId       Unique ID of the first service to be fetched.
+         * @param aEndId         Unique ID of the last service to be fetched.
+         * @param aServicesArray Contains array of pointers to descriptors.
+         *                       aServicesArray ownership is transferred to caller, ie application
+         *                       is responsible for freeing the array.
+         *                       Array elements are binary descriptors built with CIptvService::GetL() method.
+         *                       CIptvService::SetL() method can be used to init CIptvService class with
+         *                       array element data. Client should ensure that aServicesArray pointer
+         *                       does not point to reserved memory when calling this method, since the pointer
+         *                       will be overwritten.
+         *                       In case of error, aServicesArray is set to NULL.
+         * @param aRespStatus    ESucceeded is returned even if no matching
+         *                       services were found. In that case the aServicesArray contains
+         *                       empty array. If aRespStatus != ESucceeded, the aServicesArray
+         *                       pointer is NULL.
+         * @return Returns       KErrNone if request was sent to server successfully,
+         *                       system-wide error code otherwise. If != KErrNone, aServicesArray and
+         *                       aRespStatus do not contain valid data.
+         */
+        IMPORT_C TInt GetServicesL(TUint32 aStartId,
+                                   TUint32 aEndId,
+                                   CDesC8ArraySeg*& aServicesArray,
+                                   MIptvServiceManagementClientObserver::TRespStatus& aRespStatus);
+
+        
+        /**
+         * Deletes entry from Service database asynchronously.
+         * If entry is not found, ESucceeded is still returned
+         * in aRespStatus.
+         * DeleteServiceResp is the callback function.
+         *
+         * @param aId Unique ID of the service to delete.
+         * @return    Returns KErrNone if request was sent to server successfully,
+         *            System-wide error code otherwise.
+         */
+        IMPORT_C TInt DeleteServiceReqL(TUint32 aId);
+
+        /**
+         * Deletes entry from Service database synchronously.
+         * If entry is not found, ESucceeded is still returned
+         * in aRespStatus.
+         *
+         * @param aId         Unique ID of the service to delete.
+         * @param aRespStatus Status of the operation.
+         * @return            Returns KErrNone if request was sent to server successfully,
+         *                    System-wide error code otherwise. If != KErrNone, aRespStatus
+         *                    doesn't contain valid data.
+         */
+        IMPORT_C TInt DeleteServiceL(TUint32 aId,
+                                     MIptvServiceManagementClientObserver::TRespStatus& aRespStatus);
+
+        /**
+         * Gets services by provider ID synchronously.
+         *
+         * @param aProviderId Provider ID in Services database.  
+         * @param aServices   All services which provider ID match, will be written here.
+         * @return            Returns KErrNone if operation was successful,
+         *                    system-wide error code otherwise. If != KErrNone, aServices
+         *                    does not contain valid data.
+         */
+        IMPORT_C TInt GetServicesL(const TDesC& aProviderId,
+                                   CIptvServices& aServices);
+
+        /**
+         * Sets IAP list to every service asynchronously.
+         * SetAllIapsResp is the callback function.
+         * Not supported currently.
+         *
+         * @param aIapList            IAP list to be written to all service records.
+         * @param aIgnoreReadOnlyFlag If ETrue the read only flag has no effect on Service DB,
+         *                            ie. all services are changed.
+         */
+        IMPORT_C void SetAllIapsReqL(CIptvIapList& aIapList, TBool aIgnoreReadOnlyFlag);
+
+        /**
+         * Sets IAP list to every service synchronously.
+         * Not supported.
+         *
+         * @param aIapList            IAP list to be written to all service records.
+         * @param aIgnoreReadOnlyFlag If ETrue the read only flag has no effect on Service DB,
+         *                            ie. all services are changed.
+         */
+        IMPORT_C void SetAllIapsL(CIptvIapList& aIapList,
+                                  TBool aIgnoreReadOnlyFlag,
+                                  MIptvServiceManagementClientObserver::TRespStatus& aRespStatus);
+        
+        /* Network selection API */
+
+        /**
+         * Sets IAP aIapId to be used for all services.
+         * This setting is valid for the server lifetime.
+         * This function is synchronous.
+         *
+         * @param aIapId                  IAP ID to be used.
+         * @param aServiceId.             Service ID in Services database.
+         * @param aSetToDefaultForService If ETrue, then the IAP is written to Service database
+         *                                (only to aServiceId) and it lasts over reboots.
+         * @param aRespStatus             Status of the operation.
+         */
+        IMPORT_C void SetUsedIapL(TUint32 aIapId,
+                                  TUint32 aServiceId,
+                                  TBool aSetToDefaultForService,
+                                  CIptvNetworkSelection::TRespStatus& aRespStatus);
+
+        /**
+         * Clears used IAP from Network Selection, set previosly with SetUsedIapL
+         * method.
+         * Function is synchronous.
+         *
+         * @return System-wide error code.
+         */        
+        IMPORT_C TInt ClearUsedIap();
+
+        /**
+         * Gets IAP ID which is used when connecting to aServiceId.
+         * Function is asynchronous, GetUsedIapResp is the callback function.
+         *
+         * @param aServiceId
+         */        
+        IMPORT_C void GetUsedIapReqL(TUint32 aServiceId);
+
+        /**
+         * Gets IAP ID which is used when connecting to aServiceId.
+         * Warning, this might block a few seconds since it involves WLAN scan,
+         * use GetUsedIapReqL if this is a problem.
+         * Function is synchronous.
+         *
+         * @param aServiceId            Service ID in Services database.
+         * @param aIapId                IAP ID in CommsDb.
+         * @param aIapName              IAP name is written here, KIptvNsIapNameMaxLength is the max length.
+         * @param aConnectionPermission This is valid only if aIapId is valid.
+         * @param aRespStatus           If != ESucceeded, aIapId, aIapName and aConnectionPermission
+         *                              do not contain valid data.
+         */        
+        IMPORT_C void GetUsedIapL( TUint32 aServiceId,
+                                   TUint32& aIapId,
+                                   TDes& aIapName,
+                                   CIptvNetworkSelection::TConnectionPermission& aConnectionPermission,
+                                   CIptvNetworkSelection::TRespStatus& aRespStatus );
+
+        /**
+         * Gets connection permission status for aIapId.
+         * Function is synchronous.
+         *
+         * @param aIapId                IAP ID in CommsDb.
+         * @param aConnectionPermission Connection permission status is written here.
+         * @param aRespStatus           Status of the operation.
+         */
+        IMPORT_C void IsConnectionAllowedL(TUint32 aIapId,
+                                           CIptvNetworkSelection::TConnectionPermission& aConnectionPermission,
+                                           CIptvNetworkSelection::TRespStatus& aRespStatus);
+        /**
+         * Sets connection permission status for the connection type used
+         * by aIapId.
+         * Function is synchronous.
+         *
+         * @param aConnectionAllowed If ETrue, then connection will be allowed, not allowed otherwise.
+         * @param aIapId             IAP ID in CommsDb, used for getting the connection type: WLAN, GPRS/CSD.
+         * @param aRespStatus        Status of the operation.
+         */
+        IMPORT_C void SetConnectionAllowedL(TBool aConnectionAllowed,
+                                            TUint32 aIapId,
+                                            CIptvNetworkSelection::TRespStatus& aRespStatus);
+      
+       /* Server Control API */
+       
+        /**
+         * This function is not supported. It does not close the server.
+         * ServerShutdownResp is the callback function.
+         *
+         * @return System-wide error code.
+         */
+        IMPORT_C TInt ServerShutdownReq();
+
+        /**
+         * This function is not supported. It does not close the server.
+         *
+         * @param aRespStatus Status of the operation.
+         * @return            System-wide error code. If != KErrNone, aRespStatus
+         *                    doesn't contain valid data.
+         */
+        IMPORT_C TInt ServerShutdown(MIptvServiceManagementClientObserver::TRespStatus& aRespStatus);
+		
+        /**
+         * Cancels the pending asynchronous request synchronously.
+         * This method always succees. If there was asynchronous request pending, after
+         * this call it is gone and a new asynchronous
+         * request may be sent immedetially.
+         */
+        IMPORT_C void CancelRequest() ;
+        
+        /**
+        * From MIptvEventListenerObserver. MIptvEvent is converted to CIptvSmEvent
+        * and sent to iClient.HandleSmEvent(). 
+        * @param aEvent Event.
+        */        
+        void HandleEvent(MIptvEvent& aEvent);
+
+    protected: // Functions from base classes
+
+        /**
+         * From CActive, RunL.
+         * Callback function.
+         * Invoked to handle responses from the server.
+         */
+        void RunL();
+
+        /**
+         * From CActive, DoCancel.
+         * Cancels any outstanding operation.
+         */
+        void DoCancel();
+		 
+    private:
+
+        /**
+        * Default C++ constructor.
+        * @param aClient pointer to client, no ownership is transferred.
+        */
+        IMPORT_C CIptvServiceManagementClient(MIptvServiceManagementClientObserver& aClient);
+
+        /**
+        * Performs the second phase construction of a
+        * CIptvRequestHandler object.
+        */
+        void ConstructL();
+
+        /**
+        * Handles EIptvEngineSmGetServicesSizeResp,\n
+        * and EIptvEngineSmGetServicesUsingIdSizeResp messages.\n
+        * @param aMsgId identifies which message completed.
+        */
+        void HandleGetServicesSizeRespL(TUint8 aMsgId);
+
+        /**
+        * Handles EIptvEngineSmGetServicesDataResp,\n
+        * and EIptvEngineSmGetServicesUsingIdDataResp messages.\n
+        * @param aMsgId identifies which of the three message completed.
+        */
+        void HandleGetServicesDataRespL(TUint8 aMsgId);
+                
+        /**
+        * Gets resp status from ipc message buffer.
+        */
+        MIptvServiceManagementClientObserver::TRespStatus GetRespStatusL();
+
+        /**
+        * Builds IPC msg which is sent to server in service adding.
+        */
+        void BuildAddServiceReqL(CIptvService& aService);
+
+        /**
+        * Builds IPC msg which is sent to server in service updating.
+        */
+        void BuildUpdateServiceReqL(CIptvService& aService);
+
+        /**
+        * Builds GetServicesSizeReq IPC msg.
+        */
+        void BuildGetServicesSizeReqL(TUint32 aSearchLimitFlags,
+                                      TOrder aOrder);
+        
+        /**
+         * Internalizes GetServicesDataResp IPC message and builds CDesC8ArraySeg* of it.
+         */
+        CDesC8ArraySeg* InternalizeGetServicesDataRespL();
+
+        /**
+        * Builds DeleteServiceReq IPC msg.
+        */
+        void BuildDeleteServiceReqL(TUint32 aId);
+
+        /**
+        * Builds GetServicesUsingIndexSizeReq IPC msg.
+        */
+        void BuildGetServicesUsingIndexSizeReqL(TUint32 aStartId, TUint32 aEndId);
+
+        /**
+        * Builds GetUsedIapReq IPC msg.
+        *
+        * @param aServiceId Service id which is wished to connect.
+        */        
+        void BuildGetUsedIapReqL( TUint32 aServiceId );
+
+        /**
+        * Handles GetUsedIapResp from the server, fills all parameters.
+        */
+        void HandleGetUsedIapRespL( TUint32& aIapId,
+                                    TDes& aIapName,
+                                    CIptvNetworkSelection::TConnectionPermission& aConnectionPermission,
+                                    TUint8& aWlanGprs,
+                                    CIptvNetworkSelection::TRespStatus& aRespStatus );
+        
+    private: // Data
+
+        /**
+        * A client which is making the requests.
+        */        
+        MIptvServiceManagementClientObserver& iClient;
+
+        /**
+        * iMsg Heap object to restore memory for IPC messaging.
+        */
+        HBufC8* iMsg;
+        
+        /**
+        * Passed to RIptvClientSession object to store the sent and received data.
+        * Points to iMsg heap object.
+        */
+        TPtr8                      iMsgPtr;
+                
+        /**
+        * Used to store information or which entity has the message pending.
+        * This information is needed when doing cancel.
+        */
+        TRequestPendingFor         iRequestPendingFor;
+
+        /**
+        * Used to store the resp op-code, so we know in RunL which request
+        * completed.
+        */
+        TInt                       iResponseMsgId;
+        
+        /**
+        * Listens events from the server side (CIptvEventGenerator sends them).
+        */
+        CIptvEventListener*        iEventListener;
+				        
+    };
+
+
+#endif //__CIPTVSERVICEMANAGEMENTCLIENT_H__
+
+// End of File