videofeeds/clientapi/src/CIptvVodDlClient.cpp
changeset 0 96612d01cf9f
equal deleted inserted replaced
-1:000000000000 0:96612d01cf9f
       
     1 /*
       
     2 * Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:    Implements VoD download API*
       
    15 */
       
    16 
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include <e32svr.h>
       
    22 
       
    23 #include <s32mem.h>
       
    24 #include "IptvDebug.h"
       
    25 #include "TIptvUint32StreamObject.h"
       
    26 
       
    27 #include "CIptvMyVideosVideoBriefDetails.h"
       
    28 #include "CIptvVodDlDownloadList.h"
       
    29 #include "IptvClientServerCommon.h"
       
    30 #include "CIptvVodDlClient.h"
       
    31 #include "MIptvVodDlClientObserver.h"
       
    32 #include "IptvServer.pan"
       
    33 #include "CIptvVodDlDownloadReq.h"
       
    34 #include "CIptvVodDlResumeDownloadReq.h"
       
    35 #include "TIptvVodDlDownloadId.h"
       
    36 #include "CIptvVodDlClient.h"
       
    37 #include "CIptvVodDlDownloadEvent.h"
       
    38 #include "CIptvVodDlCancelDownloadReq.h"
       
    39 #include "CIptvEventListener.h"
       
    40 
       
    41 // ============================ MEMBER FUNCTIONS ===============================
       
    42 
       
    43 // -----------------------------------------------------------------------------
       
    44 // CIptvVodDlClient::CIptvVodDlClient
       
    45 // C++ default constructor can NOT contain any code, that
       
    46 // might leave.
       
    47 // -----------------------------------------------------------------------------
       
    48 CIptvVodDlClient::CIptvVodDlClient( MIptvVodDlClientObserver& aClientObserver ) 
       
    49 : CIptvClientBase(), iClientObserver( aClientObserver ), iIpcMsgPtr((unsigned char*)0, 0)
       
    50     {
       
    51     CActiveScheduler::Add( this );
       
    52     }
       
    53 
       
    54 // -----------------------------------------------------------------------------
       
    55 // CIptvVodDlClient::ConstructL
       
    56 // Symbian 2nd phase constructor can leave.
       
    57 // -----------------------------------------------------------------------------
       
    58 //
       
    59 void CIptvVodDlClient::ConstructL()
       
    60     {
       
    61     iPendingReq = -1;
       
    62     
       
    63     iActiveSchedulerWait = new ( ELeave ) CActiveSchedulerWait();
       
    64     
       
    65     User::LeaveIfError( iSession.Connect() );
       
    66     
       
    67     CIptvVodDlDownloadEvent* event = CIptvVodDlDownloadEvent::NewL();
       
    68     CleanupStack::PushL(event); // 1->
       
    69     iEventListener = CIptvEventListener::NewL( *this,
       
    70                                                event /* ownership moves */,
       
    71                                                EIptvEngineVodDlGetEventSizeReq,
       
    72                                                EIptvEngineVodDlGetEventData,
       
    73                                                EIptvEngineVodDlCancelGetEventSizeReq );
       
    74     CleanupStack::Pop(event); // <-1
       
    75 
       
    76     iReqQueue.Reset();
       
    77     }
       
    78 
       
    79 // -----------------------------------------------------------------------------
       
    80 // CIptvVodDlClient::NewL
       
    81 // Two-phased constructor.
       
    82 // -----------------------------------------------------------------------------
       
    83 //
       
    84 EXPORT_C CIptvVodDlClient* CIptvVodDlClient::NewL(MIptvVodDlClientObserver& aClientObserver)
       
    85     {
       
    86     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::NewL()");
       
    87 
       
    88     CIptvVodDlClient* self = new ( ELeave ) CIptvVodDlClient( aClientObserver );
       
    89     CleanupStack::PushL( self );
       
    90     self->ConstructL();
       
    91     CleanupStack::Pop(self);
       
    92 
       
    93     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::NewL() exit");
       
    94 
       
    95     return self;
       
    96     }
       
    97 
       
    98 // -----------------------------------------------------------------------------
       
    99 // CIptvVodDlClient::NewLC
       
   100 // Two-phased constructor.
       
   101 // -----------------------------------------------------------------------------
       
   102 //
       
   103 EXPORT_C CIptvVodDlClient* CIptvVodDlClient::NewLC(MIptvVodDlClientObserver& aClientObserver)
       
   104     {
       
   105     CIptvVodDlClient* self = new ( ELeave ) CIptvVodDlClient( aClientObserver );
       
   106     CleanupStack::PushL( self );
       
   107     self->ConstructL();
       
   108 
       
   109     return self;
       
   110     }
       
   111 
       
   112 // Destructor
       
   113 EXPORT_C CIptvVodDlClient::~CIptvVodDlClient()
       
   114     {
       
   115     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::~CIptvVodDlClient() start");
       
   116 
       
   117     if (IsActive())
       
   118         {
       
   119         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: there is a message pending");
       
   120         if (iWaitForFlushInDestructor)
       
   121             {
       
   122             WaitForFlush();
       
   123             }
       
   124         else
       
   125             {
       
   126             IPTVLOGSTRING2_LOW_LEVEL("CIptvVodDlClient:: iWaitForFlushInDestructor was EFalse, discarding %d commands", iReqQueue.Count());
       
   127             Cancel();
       
   128             }
       
   129         }
       
   130 
       
   131     delete iEventListener;
       
   132     delete iIpcMsg;
       
   133         
       
   134     iReqQueue.Close();
       
   135     
       
   136     delete iActiveSchedulerWait;
       
   137     
       
   138     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::~CIptvVodDlClient exit");
       
   139     }
       
   140 
       
   141 // -----------------------------------------------------------------------------
       
   142 // CIptvVodDlClient::Purchase
       
   143 // -----------------------------------------------------------------------------
       
   144 EXPORT_C TInt CIptvVodDlClient::PurchaseL(TIptvServiceId /* aServiceId */,
       
   145                                           TIptvContentId /* aContentId */)
       
   146     {
       
   147     // 1) Create Ipc message function EIptvEngineVoDDlPurchaseReq with aServiceId and aContentId
       
   148     // 2) SendReceive message synchronously (request completed at server side)
       
   149     // 3) Return status to caller
       
   150     return KErrNone;
       
   151     }
       
   152 
       
   153 // -----------------------------------------------------------------------------
       
   154 // CIptvVodDlClient::DownloadL
       
   155 // -----------------------------------------------------------------------------
       
   156 EXPORT_C TIptvDlError CIptvVodDlClient::DownloadL(TUint32 aIapId,
       
   157                                                   TIptvServiceId aServiceId,
       
   158                                                   TIptvContentId aContentId,
       
   159                                                   TUint32 aIndex,                                                    
       
   160                                                   TIptvDownloadType aDlType)
       
   161     {
       
   162     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::DownloadL()");
       
   163             
       
   164     CIptvVodDlDownloadReq* dlReq;
       
   165     dlReq = CIptvVodDlDownloadReq::NewL();
       
   166     CleanupStack::PushL(dlReq); // 1->
       
   167 
       
   168     dlReq->iIapId     = aIapId;
       
   169     dlReq->iServiceId = aServiceId;
       
   170     dlReq->iContentId = aContentId;
       
   171     dlReq->iIndex     = aIndex;
       
   172     dlReq->iDlType    = aDlType;
       
   173 
       
   174     //allocate a new IPC message
       
   175     HBufC8* ipcMsg = HBufC8::NewL(dlReq->CountExternalizeSize());
       
   176     CleanupStack::PushL(ipcMsg); // 2->
       
   177     
       
   178     TPtr8 ipcMsgPtr(ipcMsg->Des());
       
   179 
       
   180     RDesWriteStream writeStream;
       
   181     writeStream.Open(ipcMsgPtr);
       
   182     writeStream.PushL(); // 3->        
       
   183     dlReq->ExternalizeL(writeStream); //write the download item to the stream
       
   184     writeStream.Close();
       
   185     writeStream.Pop(); // <-3
       
   186     
       
   187            
       
   188     //send download item as TPtr8 over IPC
       
   189     TInt globalError = iSession.SendRequest(EIptvEngineVodDlDownload, ipcMsgPtr);
       
   190     
       
   191     TIptvDlError result;
       
   192     
       
   193     if(globalError == KErrNone)
       
   194         {
       
   195         RDesReadStream readStream;
       
   196         readStream.Open(ipcMsgPtr);
       
   197         readStream.PushL(); // 2->
       
   198         result = static_cast<TIptvDlError>(readStream.ReadUint8L());
       
   199         readStream.Close();
       
   200         readStream.Pop(); // <-2
       
   201         }
       
   202     else
       
   203         {
       
   204         IPTVLOGSTRING2_LOW_LEVEL("CIptvVodDlClient:: dl request completed with error code: %d", globalError);
       
   205         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: server side leaved?");
       
   206         result = EIptvDlGeneral;
       
   207         }
       
   208     
       
   209     CleanupStack::PopAndDestroy(ipcMsg); // <-2
       
   210     CleanupStack::PopAndDestroy(dlReq); // <-1
       
   211 
       
   212 	
       
   213     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::DownloadL() exit");
       
   214     return result;
       
   215     }
       
   216 
       
   217 // -----------------------------------------------------------------------------
       
   218 // CIptvVodDlClient::DownloadReqL
       
   219 // -----------------------------------------------------------------------------
       
   220 EXPORT_C void CIptvVodDlClient::DownloadReqL( TUint32 aIapId,
       
   221                                               TIptvServiceId aServiceId,
       
   222                                               TIptvContentId aContentId,
       
   223                                               TUint32 aContentIndex,
       
   224                                               TIptvDownloadType aDlType )
       
   225     {
       
   226     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::DownloadReqL()");
       
   227 
       
   228     CIptvVodDlDownloadReq* dlReq = CIptvVodDlDownloadReq::NewL();
       
   229     CleanupStack::PushL( dlReq ); // 1->
       
   230 
       
   231     dlReq->iIapId     = aIapId;
       
   232     dlReq->iServiceId = aServiceId;
       
   233     dlReq->iContentId = aContentId;
       
   234     dlReq->iIndex     = aContentIndex;
       
   235     dlReq->iDlType    = aDlType;
       
   236     
       
   237     if ( IsActive() )
       
   238         {
       
   239         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: putting dl in queue");
       
   240         iReqQueue.AppendL(dlReq);
       
   241         CleanupStack::Pop(dlReq); // <-1
       
   242         }
       
   243     else
       
   244         {
       
   245         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: sending immedetially");
       
   246         SendDownloadReqL( *dlReq );
       
   247         CleanupStack::PopAndDestroy( dlReq ); // <-1
       
   248         }
       
   249        
       
   250     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::DownloadReqL() exit");
       
   251     }
       
   252 
       
   253 // -----------------------------------------------------------------------------
       
   254 // CIptvVodDlClient::CancelDownloadL
       
   255 // -----------------------------------------------------------------------------
       
   256 EXPORT_C TInt CIptvVodDlClient::CancelDownloadL( CIptvMyVideosGlobalFileId& aGlobalFileId )
       
   257     {
       
   258     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::CancelDownloadL()");
       
   259 
       
   260     TIptvVodDlDownloadId downloadId;
       
   261     
       
   262     downloadId.iServiceIdAndContentIdAreValid = EFalse;
       
   263     downloadId.iServiceId                     = 0;
       
   264     downloadId.iContentId                     = 0;
       
   265     downloadId.iFileIdAndDriveAreValid        = ETrue;
       
   266     downloadId.iFileId                        = aGlobalFileId.iFileId;
       
   267     downloadId.iDrive                         = aGlobalFileId.iDrive;
       
   268 
       
   269     //no need to check queue since the global file id is valid -> cant be in queue
       
   270             
       
   271     TInt resp = SendRequestL(static_cast<TUint16>(EIptvEngineVodDlCancelDownload), downloadId);
       
   272 
       
   273     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::CancelDownloadL()");
       
   274     return resp;
       
   275     }
       
   276 
       
   277 // -----------------------------------------------------------------------------
       
   278 // CIptvVodDlClient::CancelDownloadL
       
   279 // -----------------------------------------------------------------------------
       
   280 EXPORT_C TInt CIptvVodDlClient::CancelDownloadL(TUint32 aServiceId, TUint32 aContentId)
       
   281     {
       
   282     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::CancelDownloadL()");
       
   283 
       
   284     TIptvVodDlDownloadId downloadId;
       
   285     
       
   286     downloadId.iServiceIdAndContentIdAreValid = ETrue;
       
   287     downloadId.iServiceId                     = aServiceId;
       
   288     downloadId.iContentId                     = aContentId;
       
   289     downloadId.iFileIdAndDriveAreValid        = EFalse;
       
   290     downloadId.iFileId                        = 0;
       
   291     downloadId.iDrive                         = 0;
       
   292 
       
   293     TBool removed = CancelDlFromQueueL(downloadId.iServiceId, downloadId.iContentId, EFalse /* dont send event */);
       
   294     if (removed)
       
   295         {            
       
   296         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: dl cancelled from queue");
       
   297         return KErrNone;
       
   298         }
       
   299         
       
   300     TInt resp = SendRequestL(static_cast<TUint16>(EIptvEngineVodDlCancelDownload), downloadId);
       
   301 
       
   302     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::CancelDownloadL()");
       
   303     return resp;
       
   304     }
       
   305         
       
   306 // -----------------------------------------------------------------------------
       
   307 // CIptvVodDlClient::CancelDownloadReqL
       
   308 // -----------------------------------------------------------------------------
       
   309 EXPORT_C void CIptvVodDlClient::CancelDownloadReqL(TIptvVodDlDownloadId& aDownloadId)
       
   310     {
       
   311     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::CancelDownloadReqL(aDownloadId) start");
       
   312     
       
   313     if (aDownloadId.iServiceIdAndContentIdAreValid == EFalse && 
       
   314         aDownloadId.iFileIdAndDriveAreValid == EFalse)
       
   315         {
       
   316         User::Leave(KErrArgument);
       
   317         }
       
   318 
       
   319     //can be in queue only if iServiceIdAndContentIdAreValid is valid.
       
   320     //Cant be in queue if global file id is valid
       
   321     if (aDownloadId.iServiceIdAndContentIdAreValid)
       
   322         {
       
   323         TBool removed = CancelDlFromQueueL(aDownloadId.iServiceId, aDownloadId.iContentId, ETrue /* send event */);
       
   324         if (removed)
       
   325             {            
       
   326             IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: dl cancelled from queue");
       
   327             return;
       
   328             }
       
   329         }
       
   330     
       
   331     CIptvVodDlCancelDownloadReq* cancelDlReq = CIptvVodDlCancelDownloadReq::NewL();
       
   332     CleanupStack::PushL(cancelDlReq); // 1->
       
   333     
       
   334     cancelDlReq->Set(aDownloadId);
       
   335         
       
   336     if (IsActive())
       
   337         {
       
   338         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: active -> putting CancelDlReq in queue");
       
   339         iReqQueue.AppendL(cancelDlReq);
       
   340         CleanupStack::Pop(cancelDlReq); // <-1
       
   341         }
       
   342     else
       
   343         {
       
   344         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: sending cancel dl req immedetially");
       
   345         SendCancelDownloadReqL(*cancelDlReq);
       
   346         CleanupStack::PopAndDestroy(cancelDlReq); // <-1
       
   347         }
       
   348         
       
   349     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::CancelDownloadReqL(aDownloadId) exit");
       
   350     }
       
   351 
       
   352 // -----------------------------------------------------------------------------
       
   353 // CIptvVodDlClient::PauseDownload
       
   354 // -----------------------------------------------------------------------------
       
   355 EXPORT_C TInt CIptvVodDlClient::PauseDownloadL(CIptvMyVideosGlobalFileId& aGlobalFileId)
       
   356     {
       
   357     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::PauseDownloadL()");
       
   358            
       
   359     //send download item as TPtr8 over IPC
       
   360     TInt result = SendRequestL(static_cast<TUint16>(EIptvEngineVodDlPauseDownload),
       
   361                                aGlobalFileId);
       
   362 
       
   363     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::PauseDownloadL() exit");
       
   364     return result;
       
   365     }
       
   366 
       
   367 // -----------------------------------------------------------------------------
       
   368 // CIptvVodDlClient::PauseAllDownloads
       
   369 // -----------------------------------------------------------------------------
       
   370 EXPORT_C TInt CIptvVodDlClient::PauseAllDownloads()
       
   371     {
       
   372     return iSession.SendRequest(static_cast<TUint16>(EIptvEngineVodDlPauseAllDownloads));
       
   373     }
       
   374 
       
   375 // -----------------------------------------------------------------------------
       
   376 // CIptvVodDlClient::ResumeDownload
       
   377 // -----------------------------------------------------------------------------
       
   378 EXPORT_C TInt CIptvVodDlClient::ResumeDownloadL(CIptvMyVideosGlobalFileId& aGlobalFileId,
       
   379                                                 TBool aUseUserNameAndPassword,
       
   380                                                 const TDesC& aUserName,
       
   381                                                 const TDesC& aPassword,
       
   382                                                 TUint32 aIapId,
       
   383                                                 TBool aUseIapId)
       
   384     {
       
   385     if(aUserName.Length() > KIptvVodDlUserNameMaxLength)
       
   386         {
       
   387         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: User name too long");
       
   388         return KErrArgument;        
       
   389         }
       
   390         
       
   391     if(aPassword.Length() > KIptvVodDlPasswordMaxLength)
       
   392         {
       
   393         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: Password too long");
       
   394         return KErrArgument;
       
   395         }
       
   396 
       
   397     CIptvVodDlResumeDownloadReq* resumeDownloadReq = CIptvVodDlResumeDownloadReq::NewL();
       
   398     CleanupStack::PushL(resumeDownloadReq); // 1->
       
   399 
       
   400     resumeDownloadReq->iDownloadId.iFileIdAndDriveAreValid        = ETrue;
       
   401     resumeDownloadReq->iDownloadId.iFileId                        = aGlobalFileId.iFileId;
       
   402     resumeDownloadReq->iDownloadId.iDrive                         = aGlobalFileId.iDrive;
       
   403     resumeDownloadReq->iDownloadId.iServiceIdAndContentIdAreValid = EFalse;
       
   404     resumeDownloadReq->iUseUserNameAndPassword                    = aUseUserNameAndPassword;
       
   405     resumeDownloadReq->iUserName                                  = aUserName;
       
   406     resumeDownloadReq->iPassword                                  = aPassword;
       
   407     resumeDownloadReq->iIapId                                     = aIapId;
       
   408     resumeDownloadReq->iUseIapId                                  = aUseIapId;
       
   409     
       
   410     TInt resp = SendRequestL(static_cast<TUint16>(EIptvEngineVodDlResumeDownload), *resumeDownloadReq);
       
   411     CleanupStack::PopAndDestroy(resumeDownloadReq); // <-1
       
   412     return resp;    
       
   413     }
       
   414 
       
   415 // -----------------------------------------------------------------------------
       
   416 // CIptvVodDlClient::ResumeDownload
       
   417 // -----------------------------------------------------------------------------
       
   418 EXPORT_C TInt CIptvVodDlClient::ResumeDownloadL(TUint32 aServiceId,
       
   419                                                 TUint32 aContentId,
       
   420                                                 TBool aUseUserNameAndPassword,
       
   421                                                 const TDesC& aUserName,
       
   422                                                 const TDesC& aPassword,
       
   423                                                 TUint32 aIapId,
       
   424                                                 TBool aUseIapId)
       
   425     {
       
   426     if(aUserName.Length() > KIptvVodDlUserNameMaxLength)
       
   427         {
       
   428         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: User name too long");
       
   429         return KErrArgument;        
       
   430         }
       
   431         
       
   432     if(aPassword.Length() > KIptvVodDlPasswordMaxLength)
       
   433         {
       
   434         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: Password too long");
       
   435         return KErrArgument;
       
   436         }
       
   437 
       
   438     CIptvVodDlResumeDownloadReq* resumeDownloadReq = CIptvVodDlResumeDownloadReq::NewL();
       
   439     CleanupStack::PushL(resumeDownloadReq); // 1->
       
   440     
       
   441     resumeDownloadReq->iDownloadId.iFileIdAndDriveAreValid        = EFalse;
       
   442     resumeDownloadReq->iDownloadId.iServiceIdAndContentIdAreValid = ETrue;
       
   443     resumeDownloadReq->iDownloadId.iServiceId                     = aServiceId;
       
   444     resumeDownloadReq->iDownloadId.iContentId                     = aContentId;
       
   445     resumeDownloadReq->iUseUserNameAndPassword                    = aUseUserNameAndPassword;
       
   446     resumeDownloadReq->iUserName                                  = aUserName;
       
   447     resumeDownloadReq->iPassword                                  = aPassword;
       
   448     resumeDownloadReq->iIapId                                     = aIapId;
       
   449     resumeDownloadReq->iUseIapId                                  = aUseIapId;
       
   450     
       
   451     TInt resp = SendRequestL(static_cast<TUint16>(EIptvEngineVodDlResumeDownload), *resumeDownloadReq);
       
   452     CleanupStack::PopAndDestroy(resumeDownloadReq); // <-1
       
   453     return resp;    
       
   454     }
       
   455 
       
   456 // -----------------------------------------------------------------------------
       
   457 // CIptvVodDlClient::ResumeAllDownloads
       
   458 // -----------------------------------------------------------------------------
       
   459 EXPORT_C TInt CIptvVodDlClient::ResumeAllDownloads()
       
   460     {    
       
   461     return iSession.SendRequest(static_cast<TUint16>(EIptvEngineVodDlResumeAllDownloads));
       
   462     }
       
   463 
       
   464 // -----------------------------------------------------------------------------
       
   465 // CIptvVodDlClient::GetDownloadList
       
   466 // -----------------------------------------------------------------------------
       
   467 EXPORT_C TInt CIptvVodDlClient::GetDownloadListL(CIptvVodDlDownloadList& aDownloadList)
       
   468     {
       
   469     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::GetDownloadListL()");
       
   470 
       
   471     TIptvUint32StreamObject sizeObj;
       
   472     
       
   473     TInt globalError = SendRequestL(static_cast<TUint16>(EIptvEngineVodDlGetDownloadListSize),
       
   474                        sizeObj,
       
   475                        sizeObj.CountExternalizeSize() /* = 4 */);
       
   476     
       
   477     if(globalError == KErrNone)
       
   478         {
       
   479         if(sizeObj.iData > 0)
       
   480             {
       
   481             globalError = SendRequestL(static_cast<TUint16>(EIptvEngineVodDlGetDownloadList),
       
   482                                        aDownloadList,
       
   483                                        sizeObj.iData);
       
   484             }
       
   485         else
       
   486             {
       
   487             IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: download list was empty");
       
   488             globalError = KErrNotFound;            
       
   489             }
       
   490         }
       
   491         
       
   492     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::GetDownloadListL() exit");
       
   493     return globalError;
       
   494     }
       
   495 
       
   496 // -----------------------------------------------------------------------------
       
   497 // CIptvVodDlClient::GetDownloadProgress
       
   498 // -----------------------------------------------------------------------------
       
   499 EXPORT_C TInt CIptvVodDlClient::GetDownloadProgressL(CIptvMyVideosGlobalFileId& aGlobalFileId)
       
   500     {
       
   501     // 1) Create Ipc message function EIptvEngineVoDDlGetDownloadProgressReq with aGlobalFileId
       
   502     // 2) SendReceive message synchronously
       
   503     // 3) Return progress and status to caller
       
   504         
       
   505     TIptvUint32StreamObject progress;
       
   506 
       
   507     TInt result = SendRequestL(static_cast<TUint16>(EIptvEngineVodDlGetDownloadProgressReq),
       
   508                                aGlobalFileId,
       
   509                                progress,
       
   510                                0);
       
   511 
       
   512     if(result != KErrNone)
       
   513         {
       
   514         return result;
       
   515         }
       
   516     else 
       
   517         {   
       
   518         return static_cast<TInt>(progress.iData);
       
   519         }
       
   520 
       
   521     }
       
   522 
       
   523 // -----------------------------------------------------------------------------
       
   524 // Updates existing soft notification.
       
   525 // -----------------------------------------------------------------------------
       
   526 //
       
   527 EXPORT_C void CIptvVodDlClient::UpdateDownloadNotification(
       
   528     const TDesC& aMsg )
       
   529     {
       
   530     if ( !IsActive() )
       
   531         {
       
   532         TRAP_IGNORE( SendRequestL(
       
   533             EIptvEngineVodDlUpdateDownloadNotification,
       
   534             aMsg ) );
       
   535         }
       
   536     }
       
   537 
       
   538 // -----------------------------------------------------------------------------
       
   539 // CIptvVodDlClient::RunL
       
   540 // -----------------------------------------------------------------------------
       
   541 void CIptvVodDlClient::RunL()
       
   542     {
       
   543     //build common parts of the download event
       
   544     CIptvVodDlDownloadEvent* dlEvent = CIptvVodDlDownloadEvent::NewL();
       
   545     CleanupStack::PushL(dlEvent); // 1->
       
   546     dlEvent->iServiceIdAndContentIdAreValid = iReqDownloadId.iServiceIdAndContentIdAreValid;
       
   547     dlEvent->iServiceId                     = iReqDownloadId.iServiceId;          
       
   548     dlEvent->iContentId                     = iReqDownloadId.iContentId;
       
   549     dlEvent->iGlobalFileIdIsValid           = iReqDownloadId.iFileIdAndDriveAreValid;
       
   550     dlEvent->iGlobalFileId->iFileId         = iReqDownloadId.iFileId;
       
   551     dlEvent->iGlobalFileId->iDrive          = iReqDownloadId.iDrive;
       
   552     
       
   553     dlEvent->iGlobalError = iStatus.Int();
       
   554 
       
   555     switch(iPendingReq)
       
   556         {
       
   557         //response to asynchronous dl req
       
   558         case EIptvEngineVodDlDownloadReq:
       
   559             {
       
   560             IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: RunL, response to download req arrived");
       
   561 
       
   562             iPendingReq = -1;
       
   563 
       
   564             if (iStatus.Int() == KErrNone)
       
   565                 {
       
   566                 //VOD DL Manager generated the response
       
   567                 RDesReadStream readStream;
       
   568                 readStream.Open(iIpcMsgPtr);
       
   569                 readStream.PushL(); // 2->
       
   570                 TUint8 dlError = readStream.ReadUint8L();
       
   571                 readStream.Close();
       
   572                 readStream.Pop(); // <-2
       
   573                 dlEvent->iError = static_cast<TIptvDlError>(dlError);
       
   574                 if (dlEvent->iError != EIptvDlNoError)
       
   575                     {
       
   576                     //VOD DL Manager informs that download request failed
       
   577                     dlEvent->iEvent = CIptvVodDlDownloadEvent::EDownloadReqFailed;
       
   578                     }
       
   579                 else
       
   580                     {
       
   581                     //VOD DL Manager informs that download request was ok
       
   582                     dlEvent->iEvent = CIptvVodDlDownloadEvent::EDownloadReqSucceeded;
       
   583                     }
       
   584                 }
       
   585             else
       
   586                 {
       
   587                 //Request failed before it reached VOD DL manager
       
   588                 dlEvent->iEvent = CIptvVodDlDownloadEvent::EDownloadReqFailed;
       
   589                 dlEvent->iError = EIptvDlGeneral;
       
   590                 }
       
   591 
       
   592             delete iIpcMsg;
       
   593             iIpcMsg = NULL;
       
   594 
       
   595             iClientObserver.HandleVodDlDownloadEvent(*dlEvent);
       
   596 
       
   597             HandleNextReqInQueueL();
       
   598 
       
   599             }
       
   600             break;
       
   601             
       
   602         case EIptvEngineVodDlCancelDownloadReq:
       
   603             {
       
   604             iPendingReq = -1;
       
   605 
       
   606             if (iStatus.Int() == KErrNone)
       
   607                 {
       
   608                 dlEvent->iEvent = CIptvVodDlDownloadEvent::ECancelReqSucceeded;
       
   609                 dlEvent->iError = EIptvDlNoError;
       
   610                 }
       
   611             else
       
   612                 {
       
   613                 dlEvent->iEvent = CIptvVodDlDownloadEvent::ECancelReqFailed;
       
   614                 dlEvent->iError = EIptvDlGeneral;
       
   615                 }
       
   616                 
       
   617             iClientObserver.HandleVodDlDownloadEvent(*dlEvent);
       
   618             
       
   619             HandleNextReqInQueueL();
       
   620             }
       
   621             break;
       
   622         }
       
   623         
       
   624     CleanupStack::PopAndDestroy(dlEvent); // <-1
       
   625     }
       
   626 
       
   627 // -----------------------------------------------------------------------------
       
   628 // CIptvVodDlClient::DoCancel
       
   629 // -----------------------------------------------------------------------------
       
   630 void CIptvVodDlClient::DoCancel()
       
   631     {
       
   632     switch(iPendingReq)
       
   633         {
       
   634         case EIptvEngineVodDlDownloadReq:
       
   635         case EIptvEngineVodDlCancelDownloadReq:
       
   636             iSession.SendRequest(EIptvEngineVodDlCancel);
       
   637             break;
       
   638         }
       
   639     }
       
   640 
       
   641 // -----------------------------------------------------------------------------
       
   642 // CIptvVodDlClient::HandleEvent
       
   643 // -----------------------------------------------------------------------------
       
   644 void CIptvVodDlClient::HandleEvent( MIptvEvent& aEvent )
       
   645     {
       
   646     iClientObserver.HandleVodDlDownloadEvent( static_cast<CIptvVodDlDownloadEvent&>(aEvent) );
       
   647     }
       
   648 
       
   649 // -----------------------------------------------------------------------------
       
   650 // CIptvVodDlClient::CancelDlFromQueueL()
       
   651 // -----------------------------------------------------------------------------
       
   652 //
       
   653 TBool CIptvVodDlClient::CancelDlFromQueueL(TUint32 aServiceId,
       
   654                                            TUint32 aContentId,
       
   655                                            TBool aSendEvent)
       
   656     {
       
   657     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::CancelDlFromQueueL() start");
       
   658     
       
   659     if (iReqQueue.Count() > 0)
       
   660         {
       
   661         CIptvVodDlDownloadReq* dlReq;
       
   662         TInt i;
       
   663         for (i = 0; i < iReqQueue.Count(); i++)
       
   664             {
       
   665             if (iReqQueue[i]->iObjId == EIptvEngineVodDlDownloadReq)
       
   666                 {
       
   667                 dlReq = static_cast<CIptvVodDlDownloadReq*>(iReqQueue[i]);
       
   668                 if (aServiceId == dlReq->iServiceId &&
       
   669                     aContentId == dlReq->iContentId)
       
   670                     {
       
   671                     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: dl was still on client queue, deleting it and sending cancel event");
       
   672 
       
   673                     if (aSendEvent)
       
   674                         {
       
   675                         SendCancelEventL(dlReq->iServiceId,
       
   676                                          dlReq->iContentId,
       
   677                                          ETrue /* ETrue = cancel successfull */);
       
   678                         }
       
   679 
       
   680                     iReqQueue.Remove(i);
       
   681                     iReqQueue.Compress();
       
   682                     return ETrue;
       
   683                     }                
       
   684                 }
       
   685             }
       
   686         }
       
   687     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::CancelDlFromQueueL() exit");
       
   688     return EFalse;
       
   689     }
       
   690 
       
   691 // -----------------------------------------------------------------------------
       
   692 // CIptvVodDlClient::SendCancelEventL()
       
   693 // -----------------------------------------------------------------------------
       
   694 //
       
   695 void CIptvVodDlClient::SendCancelEventL(TUint32 aServiceId,
       
   696                                         TUint32 aContentId,
       
   697                                         TBool aSuccess)
       
   698     {
       
   699     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::SendCancelEventL() start");
       
   700 
       
   701     CIptvVodDlDownloadEvent* dlEvent = CIptvVodDlDownloadEvent::NewL();
       
   702     CleanupStack::PushL(dlEvent); // 1->
       
   703     if (aSuccess)
       
   704         {
       
   705         dlEvent->iEvent = CIptvVodDlDownloadEvent::ECancelReqSucceeded;
       
   706         }
       
   707     else
       
   708         {
       
   709         dlEvent->iEvent = CIptvVodDlDownloadEvent::ECancelReqFailed;
       
   710         }
       
   711         
       
   712     dlEvent->iServiceIdAndContentIdAreValid = iReqDownloadId.iServiceIdAndContentIdAreValid;
       
   713     dlEvent->iServiceId                     = aServiceId;          
       
   714     dlEvent->iContentId                     = aContentId;
       
   715     dlEvent->iGlobalFileIdIsValid           = EFalse;
       
   716     dlEvent->iGlobalError                   = KErrNone;
       
   717     dlEvent->iError                         = EIptvDlNoError;
       
   718 
       
   719     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: sending cancel download response event");
       
   720     iClientObserver.HandleVodDlDownloadEvent(*dlEvent);
       
   721     
       
   722     CleanupStack::PopAndDestroy(dlEvent); // <-1
       
   723     
       
   724     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::SendCancelEventL() exit");
       
   725     }
       
   726 
       
   727 // -----------------------------------------------------------------------------
       
   728 // CIptvVodDlClient::SendCancelDownloadReqL()
       
   729 // -----------------------------------------------------------------------------
       
   730 //
       
   731 void CIptvVodDlClient::SendCancelDownloadReqL(CIptvVodDlCancelDownloadReq& aCancelDlReq)
       
   732     {
       
   733     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::SendCancelDownloadReqL() start");
       
   734     
       
   735     //store download id so we can generate response event    
       
   736     iReqDownloadId.Set(aCancelDlReq.iDownloadId);
       
   737 
       
   738     //delete old IPC message
       
   739     if(iIpcMsg)
       
   740         {
       
   741         delete iIpcMsg;
       
   742         iIpcMsg = NULL;
       
   743         }
       
   744 
       
   745     //allocate a new IPC message
       
   746     iIpcMsg = HBufC8::NewL(aCancelDlReq.CountExternalizeSize());
       
   747     
       
   748     iIpcMsgPtr.Set(iIpcMsg->Des());
       
   749 
       
   750     RDesWriteStream writeStream;
       
   751     writeStream.Open(iIpcMsgPtr);
       
   752     writeStream.PushL(); // 1->
       
   753     aCancelDlReq.ExternalizeL(writeStream); //write the item to the stream
       
   754     writeStream.Pop(); // <-1
       
   755     writeStream.Close();
       
   756     
       
   757     //send async message           
       
   758     iSession.SendRequest(EIptvEngineVodDlCancelDownloadReq, iIpcMsgPtr, iStatus);
       
   759     SetActive();
       
   760     iPendingReq = EIptvEngineVodDlCancelDownloadReq;
       
   761 
       
   762     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::SendCancelDownloadReqL() exit");
       
   763     }
       
   764 
       
   765 // -----------------------------------------------------------------------------
       
   766 // CIptvVodDlClient::SendDownloadReqL()
       
   767 // -----------------------------------------------------------------------------
       
   768 //
       
   769 void CIptvVodDlClient::SendDownloadReqL(CIptvVodDlDownloadReq& aDownloadReq)
       
   770     {
       
   771     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::SendDownloadReqL() start");
       
   772 
       
   773     //store download id so that we can generate response event
       
   774     iReqDownloadId.iServiceIdAndContentIdAreValid = ETrue;
       
   775     iReqDownloadId.iServiceId                     = aDownloadReq.iServiceId;
       
   776     iReqDownloadId.iContentId                     = aDownloadReq.iContentId;
       
   777     iReqDownloadId.iFileIdAndDriveAreValid        = EFalse;
       
   778     iReqDownloadId.iFileId                        = 0;
       
   779     iReqDownloadId.iDrive                         = 0;
       
   780                 
       
   781     //delete old IPC message
       
   782     if (iIpcMsg)
       
   783         {
       
   784         delete iIpcMsg;
       
   785         iIpcMsg = NULL;
       
   786         }
       
   787 
       
   788     //allocate a new IPC message
       
   789     iIpcMsg = HBufC8::NewL(aDownloadReq.CountExternalizeSize());
       
   790     
       
   791     iIpcMsgPtr.Set(iIpcMsg->Des());
       
   792 
       
   793     RDesWriteStream writeStream;
       
   794     writeStream.Open(iIpcMsgPtr);
       
   795     writeStream.PushL(); // 1->
       
   796     aDownloadReq.ExternalizeL(writeStream); //write the download item to the stream
       
   797     writeStream.Pop(); // <-1
       
   798     writeStream.Close();
       
   799                                 
       
   800     //send download item as TPtr8 over IPC asynchronously
       
   801     iSession.SendRequest(EIptvEngineVodDlDownloadReq, iIpcMsgPtr, iStatus);
       
   802 
       
   803     SetActive();    
       
   804     iPendingReq = EIptvEngineVodDlDownloadReq;
       
   805 
       
   806     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::SendDownloadReqL() exit");
       
   807     }
       
   808 
       
   809 // -----------------------------------------------------------------------------
       
   810 // CIptvVodDlClient::HandleNextReqInQueueL()
       
   811 // -----------------------------------------------------------------------------
       
   812 //
       
   813 void CIptvVodDlClient::HandleNextReqInQueueL()
       
   814     {
       
   815     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::HandleNextReqInQueueL() start");
       
   816 
       
   817     if (iReqQueue.Count() > 0)
       
   818         {
       
   819         switch(iReqQueue[0]->iObjId)
       
   820             {
       
   821             case EIptvEngineVodDlDownloadReq:
       
   822                 SendDownloadReqL(*(static_cast<CIptvVodDlDownloadReq*>(iReqQueue[0])));
       
   823                 delete static_cast<CIptvVodDlDownloadReq*>(iReqQueue[0]);
       
   824                 break;
       
   825                 
       
   826             case EIptvEngineVodDlCancelDownloadReq:
       
   827                 SendCancelDownloadReqL(*(static_cast<CIptvVodDlCancelDownloadReq*>(iReqQueue[0])));
       
   828                 delete static_cast<CIptvVodDlCancelDownloadReq*>(iReqQueue[0]);
       
   829                 break;
       
   830             }
       
   831         iReqQueue[0] = NULL;
       
   832         iReqQueue.Remove(0);
       
   833         iReqQueue.Compress();
       
   834         }
       
   835     else
       
   836         {
       
   837         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: no request in queue");
       
   838         
       
   839         if ( iWaitingForFlush )
       
   840             {
       
   841             IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: destructing was going on..stopping activescheduler");
       
   842             iActiveSchedulerWait->AsyncStop();
       
   843             }
       
   844         }
       
   845         
       
   846     
       
   847     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::HandleNextReqInQueueL() exit");
       
   848     }
       
   849 
       
   850 // -----------------------------------------------------------------------------
       
   851 // CIptvVodDlClient::SetWaitForFlushInDestructor()
       
   852 // -----------------------------------------------------------------------------
       
   853 //
       
   854 EXPORT_C void CIptvVodDlClient::SetWaitForFlushInDestructor(TBool aWaitForFlushInDestructor)
       
   855     {
       
   856     iWaitForFlushInDestructor = aWaitForFlushInDestructor;
       
   857     }
       
   858 
       
   859 // -----------------------------------------------------------------------------
       
   860 // CIptvVodDlClient::WaitForFlush()
       
   861 // -----------------------------------------------------------------------------
       
   862 //
       
   863 EXPORT_C void CIptvVodDlClient::WaitForFlush()
       
   864     {
       
   865     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::WaitForFlush() start");
       
   866     
       
   867     if (IsActive())
       
   868         {
       
   869         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: waiting for flush");
       
   870         iWaitingForFlush = ETrue;
       
   871         if ( ! iActiveSchedulerWait->IsStarted() )
       
   872             {
       
   873             iActiveSchedulerWait->Start();
       
   874             }
       
   875         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: flush finished");
       
   876         }
       
   877     else
       
   878         {
       
   879         IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient:: there were no messages pending, continuing");
       
   880         }
       
   881         
       
   882     IPTVLOGSTRING_LOW_LEVEL("CIptvVodDlClient::WaitForFlush() exit");
       
   883     }