omadrm/drmengine/dcfrepository/client/src/DcfRep.cpp
changeset 0 95b198f216e5
child 18 8a03a285ab14
equal deleted inserted replaced
-1:000000000000 0:95b198f216e5
       
     1 /*
       
     2 * Copyright (c) 2002-2004 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 "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:  API wrapper side implementation
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include    "DcfRep.h"
       
    21 #include    "DcfEntry.h"
       
    22 #include    "DcfRepCommon.h"
       
    23 #include    <e32std.h>
       
    24 #include    <e32base.h>
       
    25 #include    <DRMRightsClient.h>
       
    26 
       
    27 #ifdef RD_MULTIPLE_DRIVE
       
    28 #include <DriveInfo.h>
       
    29 #endif
       
    30 
       
    31 // EXTERNAL DATA STRUCTURES
       
    32 // EXTERNAL FUNCTION PROTOTYPES
       
    33 // CONSTANTS
       
    34 _LIT(KSqlOrderList , "select filename,position,cid,group from dcf");
       
    35 _LIT(KSqlOrderListStart , "select filename,position,cid,group from dcf where cid = '");
       
    36 _LIT(KSqlOrderListEnd , "' order by filename");
       
    37 _LIT(KSqlOrderListGroupStart , "select filename,position,cid,group from dcf where group = '");
       
    38 _LIT(KSqlOrderListGroupEnd , "' order by filename");
       
    39 _LIT(KSqlGetTtidStart , "select ttid from dcf where cid = '");
       
    40 _LIT(KSqlGetTtidEnd , "' order by ttid");
       
    41 _LIT(KSqlGetFileStart , "select filename from dcf where cid = '");
       
    42 _LIT(KSqlGetFileEnd , "' order by filename");
       
    43 _LIT(KSqlGetCidStart , "select cid from dcf where filename = '");
       
    44 _LIT(KSqlGetCidEnd , "' order by cid");
       
    45 _LIT(KSqlDeleteStart , "delete from dcf where filename = '");
       
    46 _LIT(KSqlDeleteEnd , "'");
       
    47 _LIT8(KFlkString, "flk:");
       
    48 _LIT8(KCidString, "cid:");
       
    49 // MACROS
       
    50 // LOCAL CONSTANTS AND MACROS
       
    51 static const TInt KDcfRepExtra( 100 );
       
    52 #ifdef RD_MULTIPLE_DRIVE
       
    53 _LIT( KDbFileLoc, "%c:\\system\\data\\DcfRepDb" );
       
    54 #endif
       
    55 
       
    56 // MODULE DATA STRUCTURES
       
    57 // LOCAL FUNCTION PROTOTYPES
       
    58 // FORWARD DECLARATIONS
       
    59 
       
    60 // ============================= LOCAL FUNCTIONS ===============================
       
    61 
       
    62 // -----------------------------------------------------------------------------
       
    63 // From8To16
       
    64 //
       
    65 // -----------------------------------------------------------------------------
       
    66 //
       
    67 LOCAL_C TInt From8To16( const TDesC8& a8 , HBufC16*& a16 )
       
    68     {
       
    69     TInt err = KErrNone;
       
    70     a16 = HBufC::NewMax( a8.Length() );
       
    71     if ( a16 )
       
    72         {
       
    73         TPtr ptr( a16->Des() );
       
    74         ptr.SetLength( a8.Length() );
       
    75         for (TInt i = 0 ; i<a8.Length() ; i++ )
       
    76             {
       
    77             ptr[i] = ( unsigned char ) a8[i];
       
    78             }
       
    79         }
       
    80     else
       
    81         {
       
    82         err = KErrNoMemory;
       
    83         }
       
    84     return err;
       
    85     }
       
    86 
       
    87 // -----------------------------------------------------------------------------
       
    88 // From16To8
       
    89 //
       
    90 // -----------------------------------------------------------------------------
       
    91 //
       
    92 LOCAL_C TInt From16To8( const TDesC& a16 , HBufC8*& a8 )
       
    93     {
       
    94     TInt err = KErrNone;
       
    95     a8 = HBufC8::NewMax( a16.Length() );
       
    96     if ( a8 )
       
    97         {
       
    98         TPtr8 ptr( a8->Des() );
       
    99         ptr.SetLength(a16.Length());
       
   100         for (TInt i = 0 ; i<a16.Length() ; i++ )
       
   101             {
       
   102             ptr[i] = ( unsigned char ) a16[i];
       
   103             }
       
   104         }
       
   105     else
       
   106         {
       
   107         err = KErrNoMemory;
       
   108         }
       
   109     return err;
       
   110     }
       
   111 // ============================ MEMBER FUNCTIONS ===============================
       
   112 
       
   113 // -----------------------------------------------------------------------------
       
   114 // CDcfRep::CDcfRep
       
   115 // C++ default constructor can NOT contain any code, that
       
   116 // might leave.
       
   117 // -----------------------------------------------------------------------------
       
   118 //
       
   119 CDcfRep::CDcfRep()
       
   120     {
       
   121     }
       
   122 
       
   123 // -----------------------------------------------------------------------------
       
   124 // CDcfRep::ConstructL
       
   125 // Symbian 2nd phase constructor can leave.
       
   126 // -----------------------------------------------------------------------------
       
   127 //
       
   128 void CDcfRep::ConstructL()
       
   129     {
       
   130     User::LeaveIfError(iClient.Connect());
       
   131     OpenDatabaseL();
       
   132     }
       
   133 
       
   134 // -----------------------------------------------------------------------------
       
   135 // CDcfRep::NewL
       
   136 // Two-phased constructor.
       
   137 // -----------------------------------------------------------------------------
       
   138 //
       
   139 EXPORT_C CDcfRep* CDcfRep::NewL()
       
   140     {
       
   141     CDcfRep* self = new( ELeave ) CDcfRep;
       
   142 
       
   143     CleanupStack::PushL( self );
       
   144     self->ConstructL();
       
   145     CleanupStack::Pop(self);
       
   146     return self;
       
   147     }
       
   148 
       
   149 
       
   150 // Destructor
       
   151 EXPORT_C CDcfRep::~CDcfRep()
       
   152     {
       
   153     iClient.Close();
       
   154     iView.Close();
       
   155     iDb.Close();
       
   156     iDbs.Close();
       
   157     }
       
   158 
       
   159 // -----------------------------------------------------------------------------
       
   160 // CDcfRep::UpdateL
       
   161 // Add new entry to database
       
   162 // (other items were commented in a header).
       
   163 // -----------------------------------------------------------------------------
       
   164 //
       
   165 EXPORT_C void CDcfRep::UpdateL( const CDcfEntry* aEntry)
       
   166     {
       
   167     if ( !aEntry || ( aEntry->FileName().Length() <= 0 && aEntry->Cid().Length() <= 0 ) )
       
   168         {
       
   169         User::Leave(KErrArgument);
       
   170         }
       
   171     else if ( aEntry->FileName().Length() > 0)
       
   172         {
       
   173         // Filename is defined. If content ID is defined as well, we igore content ID
       
   174         TInt err = 0;
       
   175         HBufC8* buf8 = NULL;
       
   176         RPointerArray<HBufC8> list8;
       
   177         CleanupClosePushL(list8);
       
   178         User::LeaveIfError(iClient.AddFile(aEntry->FileName()));
       
   179         GetCidL(aEntry->FileName(),list8);
       
   180         for (TInt i = 0 ; i<list8.Count() && (!err) ; i++ )
       
   181             {
       
   182             TParse p;
       
   183             err = p.Set(aEntry->FileName(),NULL,NULL);
       
   184             if (!err)
       
   185                 {
       
   186                 buf8 = list8[i];
       
   187                 err = SetName(*buf8,p.NameAndExt());
       
   188                 }
       
   189             }
       
   190         // clean list first then leave if errors occured
       
   191         list8.ResetAndDestroy();
       
   192         User::LeaveIfError(err);
       
   193         CleanupStack::PopAndDestroy(&list8);
       
   194         }
       
   195     else
       
   196         {
       
   197         // only content ID is defined
       
   198         TInt err = 0;
       
   199         HBufC* buf16 = NULL;
       
   200         RPointerArray<HBufC> list16;
       
   201         CleanupClosePushL(list16);
       
   202         GetFilenameL(aEntry->Cid(),list16);
       
   203         for (TInt i = 0 ; i<list16.Count() && (!err) ; i++ )
       
   204             {
       
   205             if (i==0)
       
   206                 {
       
   207                 // set name with the first found file. the name is set only when there is no name set before
       
   208                 TParse p;
       
   209                 err = p.Set(*(list16[i]),NULL,NULL);
       
   210                 if (!err)
       
   211                     {
       
   212                     err = SetName(aEntry->Cid(),p.NameAndExt());
       
   213                     }
       
   214                 }
       
   215             buf16 = list16[i];
       
   216             if (!err)
       
   217                 {
       
   218                 err = iClient.AddFile(*buf16);
       
   219                 }
       
   220             }
       
   221         // clean list first then leave if errors occured
       
   222         list16.ResetAndDestroy();
       
   223         User::LeaveIfError(err);
       
   224         CleanupStack::PopAndDestroy(&list16);
       
   225         }
       
   226     }
       
   227 
       
   228 
       
   229 // -----------------------------------------------------------------------------
       
   230 // CDcfRep::GetTtid
       
   231 // Get transaction ID from database
       
   232 // (other items were commented in a header).
       
   233 // -----------------------------------------------------------------------------
       
   234 //
       
   235 EXPORT_C void CDcfRep::GetTtidL(RArray<TPair>& aList)
       
   236     {
       
   237     TInt i = 0;
       
   238     for (;i<aList.Count();i++)
       
   239         {
       
   240         if ( !(aList[i].iCid) )
       
   241             {
       
   242             User::Leave(KErrArgument);
       
   243             }
       
   244         GetTtidL( *(aList[i].iCid) , aList[i].iTtid);
       
   245         }
       
   246     }
       
   247 
       
   248 // -----------------------------------------------------------------------------
       
   249 // CDcfRep::GetTtidL
       
   250 // Get transaction ID from database
       
   251 // (other items were commented in a header).
       
   252 // -----------------------------------------------------------------------------
       
   253 //
       
   254 void CDcfRep::GetTtidL(const TDesC8& aCid , HBufC8*& aTtid)
       
   255     {
       
   256     TBool flag = ETrue;
       
   257     HBufC* temp = NULL;
       
   258     RDbView view;
       
   259     CleanupClosePushL(view);
       
   260     HBufC* buf = HBufC::NewLC(aCid.Length()+KDcfRepExtra);
       
   261     TPtr ptr(buf->Des());
       
   262     ptr.SetLength(0);
       
   263 
       
   264 
       
   265     User::LeaveIfError(From8To16(aCid,temp));
       
   266     CleanupStack::PushL(temp);
       
   267     ptr.Append(KSqlGetTtidStart);
       
   268     ptr.Append(*temp);
       
   269     ptr.Append(KSqlGetTtidEnd);
       
   270     CleanupStack::PopAndDestroy(temp); //temp
       
   271 
       
   272     User::LeaveIfError(view.Prepare(iDb,TDbQuery(ptr,EDbCompareNormal),TDbWindow::EUnlimited));
       
   273     User::LeaveIfError(view.EvaluateAll());
       
   274     CleanupStack::PopAndDestroy(buf); //buf
       
   275     flag = view.FirstL();
       
   276     if (!flag)
       
   277         {
       
   278         aTtid = NULL;
       
   279         }
       
   280     else
       
   281         {
       
   282         view.GetL();
       
   283         buf = HBufC::NewL(view.ColLength(1));
       
   284         *buf = view.ColDes(1);
       
   285         CleanupStack::PushL(buf);
       
   286         User::LeaveIfError(From16To8(*buf,aTtid));
       
   287         CleanupStack::PopAndDestroy(buf); //buf
       
   288         }
       
   289     CleanupStack::PopAndDestroy(&view);
       
   290     }
       
   291 
       
   292 // -----------------------------------------------------------------------------
       
   293 // CDcfRep::GetFileHandle
       
   294 // Get File Handle for a Dcf associated with a specific CID
       
   295 // (other items were commented in a header).
       
   296 // -----------------------------------------------------------------------------
       
   297 //
       
   298 EXPORT_C void CDcfRep::GetFileHandleL(
       
   299             const TDesC8& aCid ,
       
   300             RFile& aFile , RFs& aFs )
       
   301     {
       
   302     TInt error = KErrNone;
       
   303     TPtr8 data(NULL,0);
       
   304 
       
   305 
       
   306     // Try to find the file and get a handle to it with the given string
       
   307     TRAP(error, DoGetFileHandleL( aCid, aFile, aFs ));
       
   308 
       
   309 
       
   310     // If we can't find a filehandle and the contentid starts with "cid:"
       
   311     // We may have a FL + SD content, so change the "cid:" to flk and search
       
   312     // again
       
   313     if( error == KErrNotFound &&
       
   314         !(aCid.Left(KCidString().Length()).Compare(KCidString()) ) )
       
   315         {
       
   316         HBufC8* url( aCid.AllocLC() );
       
   317         data.Set( const_cast<TUint8*>(url->Ptr()), url->Length(), url->Length() );
       
   318         data.Replace( 0, KCidString().Length(), KFlkString );
       
   319 
       
   320         DoGetFileHandleL( data, aFile, aFs );
       
   321         CleanupStack::PopAndDestroy( url );
       
   322         }
       
   323     else
       
   324         {
       
   325         User::LeaveIfError( error );
       
   326         }
       
   327     }
       
   328 
       
   329 
       
   330 
       
   331 void CDcfRep::DoGetFileHandleL(
       
   332             const TDesC8& aCid ,
       
   333             RFile& aFile , RFs& aFs )
       
   334     {
       
   335     TBool flag = ETrue;
       
   336     HBufC* temp = NULL;
       
   337     RDbView view;
       
   338     CleanupClosePushL(view);
       
   339     HBufC* buf = HBufC::NewLC(aCid.Length()+KDcfRepExtra);
       
   340     TPtr ptr(buf->Des());
       
   341     ptr.SetLength(0);
       
   342 
       
   343 
       
   344     User::LeaveIfError(From8To16(aCid,temp));
       
   345     CleanupStack::PushL(temp);
       
   346     ptr.Append(KSqlGetFileStart);
       
   347     ptr.Append(*temp);
       
   348     ptr.Append(KSqlGetFileEnd);
       
   349     CleanupStack::PopAndDestroy(temp); //temp
       
   350     User::LeaveIfError(view.Prepare(iDb,TDbQuery(ptr,EDbCompareNormal),TDbWindow::EUnlimited));
       
   351     User::LeaveIfError(view.EvaluateAll());
       
   352     CleanupStack::PopAndDestroy(buf); //buf
       
   353     flag = view.FirstL();
       
   354     if (!flag)
       
   355         {
       
   356         User::Leave(KErrNotFound);
       
   357         }
       
   358     else
       
   359         {
       
   360         RDbColReadStream strm;
       
   361         TInt err = 0;
       
   362         TBool flag = ETrue;
       
   363         TUint len = 0;
       
   364         while (flag&&view.AtRow())
       
   365             {
       
   366             view.GetL();
       
   367             len = view.ColLength(1);
       
   368             temp = HBufC::NewLC(len);
       
   369             ptr.Set(temp->Des());
       
   370             strm.OpenLC(view,1);
       
   371             strm.ReadL(ptr,len);
       
   372             CleanupStack::PopAndDestroy(&strm);
       
   373             err = aFile.Open(aFs, ptr, EFileRead|EFileShareReadersOrWriters);
       
   374             CleanupStack::PopAndDestroy(temp); // temp
       
   375             if(err == KErrNotFound || err == KErrAccessDenied)
       
   376                 {
       
   377                 view.NextL();
       
   378                 }
       
   379             else
       
   380                 {
       
   381                 flag = EFalse;
       
   382                 }
       
   383             }
       
   384         User::LeaveIfError(err);
       
   385         }
       
   386     CleanupStack::PopAndDestroy(&view);
       
   387     }
       
   388 
       
   389 
       
   390 
       
   391 // -----------------------------------------------------------------------------
       
   392 // CDcfRep::NextL
       
   393 // Return entries as iteration.
       
   394 // (other items were commented in a header).
       
   395 // -----------------------------------------------------------------------------
       
   396 //
       
   397 EXPORT_C CDcfEntry* CDcfRep::NextL()
       
   398     {
       
   399     CDcfEntry* entry = NULL;
       
   400     HBufC16* buf = NULL;
       
   401     HBufC8* temp = NULL;
       
   402     if (iView.AtRow())
       
   403         {
       
   404         TInt len = 0;
       
   405         TUint position = 0;
       
   406         TPtr ptr(NULL,0,0);
       
   407         RDbColReadStream strm;
       
   408 
       
   409         entry = CDcfEntry::NewL();
       
   410         CleanupStack::PushL(entry);
       
   411         iView.GetL();
       
   412 
       
   413         //Set filename and postion
       
   414         len = iView.ColLength(KOrdFilename);
       
   415         buf = HBufC::NewLC(len);
       
   416         ptr.Set(buf->Des());
       
   417         strm.OpenLC(iView,KOrdFilename);
       
   418         strm.ReadL(ptr,len);
       
   419         position = iView.ColUint16(KOrdPosition);
       
   420         entry->SetLocationL(ptr,position);
       
   421         CleanupStack::PopAndDestroy(&strm);
       
   422         CleanupStack::PopAndDestroy(buf);
       
   423 
       
   424 
       
   425         // Set content ID
       
   426         len = iView.ColLength(KOrdCid);
       
   427         buf = HBufC::NewLC(len);
       
   428         ptr.Set(buf->Des());
       
   429         strm.OpenLC(iView,KOrdCid);
       
   430         strm.ReadL(ptr,len);
       
   431         CleanupStack::PopAndDestroy(&strm);
       
   432         User::LeaveIfError(From16To8(*buf,temp));
       
   433         CleanupStack::PopAndDestroy(buf); // buf
       
   434         CleanupStack::PushL(temp);
       
   435         entry->SetCidL(*temp);
       
   436         CleanupStack::PopAndDestroy(temp);
       
   437 
       
   438 
       
   439         //Set Group Id
       
   440         len = iView.ColLength(KOrdGroupId);
       
   441         buf = HBufC::NewLC(len);
       
   442         ptr.Set(buf->Des());
       
   443         if (len>0)
       
   444             {
       
   445             strm.OpenLC(iView,KOrdGroupId);
       
   446             strm.ReadL(ptr,len);
       
   447             CleanupStack::PopAndDestroy(&strm);
       
   448             }
       
   449         else
       
   450             {
       
   451             ptr.SetLength(0);
       
   452             }
       
   453         User::LeaveIfError(From16To8(*buf,temp));
       
   454         CleanupStack::PopAndDestroy(buf); // buf
       
   455         CleanupStack::PushL(temp);
       
   456         entry->SetGroupIdL(*temp);
       
   457         CleanupStack::PopAndDestroy(temp); // temp
       
   458 
       
   459         iView.NextL();
       
   460         CleanupStack::Pop(entry); //entry
       
   461         }
       
   462     else
       
   463         {
       
   464         iView.Reset();
       
   465         iView.Close();
       
   466         }
       
   467     return entry;
       
   468     }
       
   469 
       
   470 
       
   471 // -----------------------------------------------------------------------------
       
   472 // CDcfRep::OrderListL
       
   473 // Order all entries from DB.
       
   474 // (other items were commented in a header).
       
   475 // -----------------------------------------------------------------------------
       
   476 //
       
   477 EXPORT_C void  CDcfRep::OrderListL()
       
   478     {
       
   479     TBool flag = ETrue;
       
   480 
       
   481     iView.Close();
       
   482 
       
   483     User::LeaveIfError(iView.Prepare(
       
   484         iDb,TDbQuery(KSqlOrderList(),EDbCompareNormal),
       
   485         TDbWindow::EUnlimited));
       
   486     User::LeaveIfError(iView.EvaluateAll());
       
   487     flag = iView.FirstL();
       
   488     if (!flag)
       
   489         {
       
   490         iView.Reset();
       
   491         iView.Close();
       
   492         User::Leave(KErrNotFound);
       
   493         }
       
   494     }
       
   495 
       
   496 // -----------------------------------------------------------------------------
       
   497 // CDcfRep::OrderListL
       
   498 // Order all entries with specific CID from DB.
       
   499 // (other items were commented in a header).
       
   500 // -----------------------------------------------------------------------------
       
   501 //
       
   502 EXPORT_C void  CDcfRep::OrderListL(const TDesC8& aCid)
       
   503     {
       
   504     TBool flag = ETrue;
       
   505     HBufC* temp = NULL;
       
   506     HBufC* buf = NULL;
       
   507     TPtr ptr(NULL,0,0);
       
   508 
       
   509     iView.Close();
       
   510 
       
   511     User::LeaveIfError(From8To16(aCid,temp));
       
   512     CleanupStack::PushL(temp);
       
   513     buf = HBufC::NewLC(aCid.Length()+KDcfRepExtra);
       
   514     ptr.Set(buf->Des());
       
   515     ptr.SetLength(0);
       
   516     ptr.Append(KSqlOrderListStart);
       
   517     ptr.Append(*temp);
       
   518     ptr.Append(KSqlOrderListEnd);
       
   519     User::LeaveIfError(iView.Prepare(
       
   520         iDb,TDbQuery(ptr,EDbCompareNormal),
       
   521         TDbWindow::EUnlimited));
       
   522     User::LeaveIfError(iView.EvaluateAll());
       
   523     flag = iView.FirstL();
       
   524     if (!flag)
       
   525         {
       
   526         // try group id
       
   527         iView.Reset();
       
   528         iView.Close();
       
   529         CleanupStack::PopAndDestroy(buf);
       
   530         buf = HBufC::NewLC(aCid.Length()+KDcfRepExtra);
       
   531         ptr.Set(buf->Des());
       
   532         ptr.SetLength(0);
       
   533         ptr.Append(KSqlOrderListGroupStart);
       
   534         ptr.Append(*temp);
       
   535         ptr.Append(KSqlOrderListGroupEnd);
       
   536         User::LeaveIfError(iView.Prepare(
       
   537             iDb,TDbQuery(ptr,EDbCompareNormal),
       
   538             TDbWindow::EUnlimited));
       
   539         User::LeaveIfError(iView.EvaluateAll());
       
   540         flag = iView.FirstL();
       
   541         if (!flag)
       
   542             {
       
   543             // not group id
       
   544             iView.Reset();
       
   545             iView.Close();
       
   546             CleanupStack::PopAndDestroy( buf );
       
   547             CleanupStack::PopAndDestroy( temp );
       
   548             User::Leave(KErrNotFound);
       
   549             }
       
   550         }
       
   551     CleanupStack::PopAndDestroy( buf );
       
   552     CleanupStack::PopAndDestroy( temp );
       
   553     }
       
   554 
       
   555 // -----------------------------------------------------------------------------
       
   556 // CDcfRep::RemoveDcfFromDbL
       
   557 // Remove all the entries that have the filename in database.
       
   558 // (other items were commented in a header).
       
   559 // -----------------------------------------------------------------------------
       
   560 //
       
   561 EXPORT_C void CDcfRep::RemoveDcfFromDbL( const TDesC& aFileName )
       
   562     {
       
   563 
       
   564     TPtr ptr(NULL,0,0);
       
   565     HBufC* sql = NULL;
       
   566     sql= HBufC16::NewLC(KSqlDeleteStart().Length()+aFileName.Length()+KSqlDeleteEnd().Length());
       
   567     *sql = KNullDesC;
       
   568     ptr.Set(sql->Des());
       
   569     ptr.Append(KSqlDeleteStart);
       
   570     ptr.Append(aFileName);
       
   571     ptr.Append(KSqlDeleteEnd);
       
   572     TInt err =iDb.Execute(ptr);
       
   573     CleanupStack::PopAndDestroy(sql); // sql
       
   574     }
       
   575 
       
   576 // -----------------------------------------------------------------------------
       
   577 // CDcfRep::RefreshDcf
       
   578 // let server scan file system for Dcfs
       
   579 // (other items were commented in a header).
       
   580 // -----------------------------------------------------------------------------
       
   581 //
       
   582 EXPORT_C void CDcfRep::RefreshDcf( TRequestStatus& aStatus )
       
   583     {
       
   584     iClient.ScanDcf(aStatus);
       
   585     }
       
   586 
       
   587 // -----------------------------------------------------------------------------
       
   588 // CDcfRep::RefreshDcf
       
   589 // let server scan file system for Dcfs
       
   590 // (other items were commented in a header).
       
   591 // -----------------------------------------------------------------------------
       
   592 //
       
   593 EXPORT_C void CDcfRep::RefreshDcf( RPointerArray<HBufC8>& aList , TRequestStatus& aStatus )
       
   594     {
       
   595     iClient.ScanDcf( aList , aStatus );
       
   596     }
       
   597 
       
   598 // -----------------------------------------------------------------------------
       
   599 // CDcfRep::SetTtid
       
   600 // Set transaction ID to all Dcfs associated with a specific CID
       
   601 // (other items were commented in a header).
       
   602 // -----------------------------------------------------------------------------
       
   603 //
       
   604 EXPORT_C void CDcfRep::SetTtid(
       
   605             RArray<TPair>& aList ,
       
   606             TRequestStatus& aStatus,
       
   607             TBool aRefresh)
       
   608     {
       
   609     if (aRefresh)
       
   610         {
       
   611         iClient.SetTtid( aList , aStatus );
       
   612         }
       
   613     }
       
   614 
       
   615 
       
   616 // -----------------------------------------------------------------------------
       
   617 // CDcfRep::NotifyServerIdle
       
   618 // notify if server is in idle.
       
   619 // (other items were commented in a header).
       
   620 // -----------------------------------------------------------------------------
       
   621 //
       
   622 EXPORT_C void CDcfRep::NotifyServerIdle( TRequestStatus& aStatus )
       
   623     {
       
   624     iClient.NotifyServerIdle( aStatus );
       
   625     }
       
   626 
       
   627 
       
   628 // -----------------------------------------------------------------------------
       
   629 // CDcfRep::OpenDatabaseL
       
   630 // connect database server and open session for it
       
   631 // (other items were commented in a header).
       
   632 // -----------------------------------------------------------------------------
       
   633 //
       
   634 void CDcfRep::OpenDatabaseL()
       
   635     {
       
   636     User::LeaveIfError(iDbs.Connect());
       
   637 
       
   638 #ifndef RD_MULTIPLE_DRIVE
       
   639 
       
   640     User::LeaveIfError(iDb.Open(iDbs,KDbFileLocation()));
       
   641 
       
   642 #else //RD_MULTIPLE_DRIVE
       
   643 
       
   644     RFs fs;
       
   645     TInt driveNumber( -1 );
       
   646     TChar driveLetter;
       
   647     DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem, driveNumber );
       
   648 
       
   649     User::LeaveIfError( fs.Connect() );
       
   650     fs.DriveToChar( driveNumber, driveLetter );
       
   651     fs.Close();
       
   652 
       
   653     TFileName dbFile;
       
   654     dbFile.Format( KDbFileLoc, (TUint)driveLetter );
       
   655 
       
   656     User::LeaveIfError( iDb.Open( iDbs, dbFile ) );
       
   657 
       
   658 #endif
       
   659     }
       
   660 
       
   661 // -----------------------------------------------------------------------------
       
   662 // CDcfRep::SetName
       
   663 // set name of CID into rights DB
       
   664 // (other items were commented in a header).
       
   665 // -----------------------------------------------------------------------------
       
   666 //
       
   667 TInt CDcfRep::SetName(const TDesC8& aCid , const TDesC16& aName)
       
   668     {
       
   669     RDRMRightsClient r;
       
   670     TInt err = 0;
       
   671     err = r.Connect();
       
   672     if (!err)
       
   673         {
       
   674         HBufC* buf = NULL;
       
   675         err = r.GetName(aCid,buf);
       
   676         if ( !err && buf->Des().Length()==0 )
       
   677             {
       
   678             err = r.SetName(aCid,aName);
       
   679             }
       
   680         if (err == KErrNotFound)
       
   681             {
       
   682             err = KErrNone; // if there is no cid, then just ignore adding name to it.
       
   683             }
       
   684         delete buf;
       
   685         }
       
   686     r.Close();
       
   687     return err;
       
   688     }
       
   689 
       
   690 // -----------------------------------------------------------------------------
       
   691 // CDcfRep::GetCidL
       
   692 // get cid list for a filename from repository DB
       
   693 // (other items were commented in a header).
       
   694 // -----------------------------------------------------------------------------
       
   695 //
       
   696 void CDcfRep::GetCidL(const TDesC16& aName , RPointerArray<HBufC8>& aList)
       
   697     {
       
   698     TBool flag = EFalse;
       
   699     HBufC8* temp8 = NULL;
       
   700     HBufC* temp16 = NULL;
       
   701     RDbView view;
       
   702     TInt len = 0;
       
   703     CleanupClosePushL(view);
       
   704     HBufC* buf = HBufC::NewLC(aName.Length()+KDcfRepExtra);
       
   705     TPtr ptr(buf->Des());
       
   706     ptr.SetLength(0);
       
   707     ptr.Append(KSqlGetCidStart);
       
   708     ptr.Append(aName);
       
   709     ptr.Append(KSqlGetCidEnd);
       
   710     User::LeaveIfError(view.Prepare(iDb,TDbQuery(ptr,EDbCompareNormal),TDbWindow::EUnlimited));
       
   711     User::LeaveIfError(view.EvaluateAll());
       
   712     CleanupStack::PopAndDestroy(buf); //buf
       
   713     flag = view.FirstL();
       
   714     if (!flag)
       
   715         {
       
   716         User::Leave(KErrNotFound);
       
   717         }
       
   718     else
       
   719         {
       
   720         while (view.AtRow())
       
   721             {
       
   722             view.GetL();
       
   723             len = view.ColLength(1);
       
   724             temp16 = HBufC::NewLC(len);
       
   725             ptr.Set(temp16->Des());
       
   726 
       
   727             RDbColReadStream strm;
       
   728             strm.OpenLC(view,1);
       
   729             strm.ReadL(ptr,len);
       
   730             CleanupStack::PopAndDestroy(&strm);
       
   731 
       
   732             User::LeaveIfError(From16To8(*temp16,temp8));
       
   733             CleanupStack::PopAndDestroy(temp16); // temp16
       
   734             CleanupStack::PushL(temp8);
       
   735             User::LeaveIfError(aList.Append(temp8));
       
   736             CleanupStack::Pop(temp8); // temp8
       
   737             view.NextL();
       
   738             }
       
   739         }
       
   740     CleanupStack::PopAndDestroy(&view);
       
   741     }
       
   742 
       
   743 // -----------------------------------------------------------------------------
       
   744 // CDcfRep::GetFilenameL
       
   745 // get filename list for a cid from repository DB
       
   746 // (other items were commented in a header).
       
   747 // -----------------------------------------------------------------------------
       
   748 //
       
   749 void CDcfRep::GetFilenameL(const TDesC8& aCid , RPointerArray<HBufC>& aList)
       
   750     {
       
   751     TBool flag = EFalse;
       
   752     HBufC* temp = NULL;
       
   753     RDbView view;
       
   754     TInt len = 0;
       
   755     CleanupClosePushL(view);
       
   756     HBufC* buf = HBufC::NewLC(aCid.Length()+KDcfRepExtra);
       
   757     TPtr ptr(buf->Des());
       
   758     ptr.SetLength(0);
       
   759     User::LeaveIfError(From8To16(aCid,temp));
       
   760     CleanupStack::PushL(temp);
       
   761     ptr.Append(KSqlGetFileStart);
       
   762     ptr.Append(*temp);
       
   763     ptr.Append(KSqlGetFileEnd);
       
   764     CleanupStack::PopAndDestroy(temp); //temp
       
   765     User::LeaveIfError(view.Prepare(iDb,TDbQuery(ptr,EDbCompareNormal),TDbWindow::EUnlimited));
       
   766     User::LeaveIfError(view.EvaluateAll());
       
   767     CleanupStack::PopAndDestroy(buf); //buf
       
   768     flag = view.FirstL();
       
   769     if (!flag)
       
   770         {
       
   771         User::Leave(KErrNotFound);
       
   772         }
       
   773     else
       
   774         {
       
   775         while (view.AtRow())
       
   776             {
       
   777             RDbColReadStream strm;
       
   778             view.GetL();
       
   779             len = view.ColLength(1);
       
   780             temp = HBufC::NewLC(len);
       
   781             ptr.Set(temp->Des());
       
   782             strm.OpenLC(view,1);
       
   783             strm.ReadL(ptr,len);
       
   784             CleanupStack::PopAndDestroy(&strm);
       
   785             User::LeaveIfError(aList.Append(temp));
       
   786             CleanupStack::Pop(temp); // temp
       
   787             view.NextL();
       
   788             }
       
   789         }
       
   790     CleanupStack::PopAndDestroy(&view);
       
   791     }
       
   792 
       
   793 // ========================== OTHER EXPORTED FUNCTIONS =========================
       
   794 
       
   795 //  End of File
       
   796 
       
   797