diff -r 000000000000 -r 95b198f216e5 omadrm/drmengine/dcfrepository/client/src/DcfRep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadrm/drmengine/dcfrepository/client/src/DcfRep.cpp Thu Dec 17 08:52:27 2009 +0200 @@ -0,0 +1,797 @@ +/* +* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: API wrapper side implementation +* +*/ + + +// INCLUDE FILES +#include "DcfRep.h" +#include "DcfEntry.h" +#include "DcfRepCommon.h" +#include +#include +#include + +#ifdef RD_MULTIPLE_DRIVE +#include +#endif + +// EXTERNAL DATA STRUCTURES +// EXTERNAL FUNCTION PROTOTYPES +// CONSTANTS +_LIT(KSqlOrderList , "select filename,position,cid,group from dcf"); +_LIT(KSqlOrderListStart , "select filename,position,cid,group from dcf where cid = '"); +_LIT(KSqlOrderListEnd , "' order by filename"); +_LIT(KSqlOrderListGroupStart , "select filename,position,cid,group from dcf where group = '"); +_LIT(KSqlOrderListGroupEnd , "' order by filename"); +_LIT(KSqlGetTtidStart , "select ttid from dcf where cid = '"); +_LIT(KSqlGetTtidEnd , "' order by ttid"); +_LIT(KSqlGetFileStart , "select filename from dcf where cid = '"); +_LIT(KSqlGetFileEnd , "' order by filename"); +_LIT(KSqlGetCidStart , "select cid from dcf where filename = '"); +_LIT(KSqlGetCidEnd , "' order by cid"); +_LIT(KSqlDeleteStart , "delete from dcf where filename = '"); +_LIT(KSqlDeleteEnd , "'"); +_LIT8(KFlkString, "flk:"); +_LIT8(KCidString, "cid:"); +// MACROS +// LOCAL CONSTANTS AND MACROS +static const TInt KDcfRepExtra( 100 ); +#ifdef RD_MULTIPLE_DRIVE +_LIT( KDbFileLoc, "%c:\\system\\data\\DcfRepDb" ); +#endif + +// MODULE DATA STRUCTURES +// LOCAL FUNCTION PROTOTYPES +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// From8To16 +// +// ----------------------------------------------------------------------------- +// +LOCAL_C TInt From8To16( const TDesC8& a8 , HBufC16*& a16 ) + { + TInt err = KErrNone; + a16 = HBufC::NewMax( a8.Length() ); + if ( a16 ) + { + TPtr ptr( a16->Des() ); + ptr.SetLength( a8.Length() ); + for (TInt i = 0 ; iDes() ); + ptr.SetLength(a16.Length()); + for (TInt i = 0 ; iConstructL(); + CleanupStack::Pop(self); + return self; + } + + +// Destructor +EXPORT_C CDcfRep::~CDcfRep() + { + iClient.Close(); + iView.Close(); + iDb.Close(); + iDbs.Close(); + } + +// ----------------------------------------------------------------------------- +// CDcfRep::UpdateL +// Add new entry to database +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDcfRep::UpdateL( const CDcfEntry* aEntry) + { + if ( !aEntry || ( aEntry->FileName().Length() <= 0 && aEntry->Cid().Length() <= 0 ) ) + { + User::Leave(KErrArgument); + } + else if ( aEntry->FileName().Length() > 0) + { + // Filename is defined. If content ID is defined as well, we igore content ID + TInt err = 0; + HBufC8* buf8 = NULL; + RPointerArray list8; + CleanupClosePushL(list8); + User::LeaveIfError(iClient.AddFile(aEntry->FileName())); + GetCidL(aEntry->FileName(),list8); + for (TInt i = 0 ; iFileName(),NULL,NULL); + if (!err) + { + buf8 = list8[i]; + err = SetName(*buf8,p.NameAndExt()); + } + } + // clean list first then leave if errors occured + list8.ResetAndDestroy(); + User::LeaveIfError(err); + CleanupStack::PopAndDestroy(&list8); + } + else + { + // only content ID is defined + TInt err = 0; + HBufC* buf16 = NULL; + RPointerArray list16; + CleanupClosePushL(list16); + GetFilenameL(aEntry->Cid(),list16); + for (TInt i = 0 ; iCid(),p.NameAndExt()); + } + } + buf16 = list16[i]; + if (!err) + { + err = iClient.AddFile(*buf16); + } + } + // clean list first then leave if errors occured + list16.ResetAndDestroy(); + User::LeaveIfError(err); + CleanupStack::PopAndDestroy(&list16); + } + } + + +// ----------------------------------------------------------------------------- +// CDcfRep::GetTtid +// Get transaction ID from database +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDcfRep::GetTtidL(RArray& aList) + { + TInt i = 0; + for (;iDes()); + ptr.SetLength(0); + + + User::LeaveIfError(From8To16(aCid,temp)); + CleanupStack::PushL(temp); + ptr.Append(KSqlGetTtidStart); + ptr.Append(*temp); + ptr.Append(KSqlGetTtidEnd); + CleanupStack::PopAndDestroy(temp); //temp + + User::LeaveIfError(view.Prepare(iDb,TDbQuery(ptr,EDbCompareNormal),TDbWindow::EUnlimited)); + User::LeaveIfError(view.EvaluateAll()); + CleanupStack::PopAndDestroy(buf); //buf + flag = view.FirstL(); + if (!flag) + { + aTtid = NULL; + } + else + { + view.GetL(); + buf = HBufC::NewL(view.ColLength(1)); + *buf = view.ColDes(1); + CleanupStack::PushL(buf); + User::LeaveIfError(From16To8(*buf,aTtid)); + CleanupStack::PopAndDestroy(buf); //buf + } + CleanupStack::PopAndDestroy(&view); + } + +// ----------------------------------------------------------------------------- +// CDcfRep::GetFileHandle +// Get File Handle for a Dcf associated with a specific CID +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDcfRep::GetFileHandleL( + const TDesC8& aCid , + RFile& aFile , RFs& aFs ) + { + TInt error = KErrNone; + TPtr8 data(NULL,0); + + + // Try to find the file and get a handle to it with the given string + TRAP(error, DoGetFileHandleL( aCid, aFile, aFs )); + + + // If we can't find a filehandle and the contentid starts with "cid:" + // We may have a FL + SD content, so change the "cid:" to flk and search + // again + if( error == KErrNotFound && + !(aCid.Left(KCidString().Length()).Compare(KCidString()) ) ) + { + HBufC8* url( aCid.AllocLC() ); + data.Set( const_cast(url->Ptr()), url->Length(), url->Length() ); + data.Replace( 0, KCidString().Length(), KFlkString ); + + DoGetFileHandleL( data, aFile, aFs ); + CleanupStack::PopAndDestroy( url ); + } + else + { + User::LeaveIfError( error ); + } + } + + + +void CDcfRep::DoGetFileHandleL( + const TDesC8& aCid , + RFile& aFile , RFs& aFs ) + { + TBool flag = ETrue; + HBufC* temp = NULL; + RDbView view; + CleanupClosePushL(view); + HBufC* buf = HBufC::NewLC(aCid.Length()+KDcfRepExtra); + TPtr ptr(buf->Des()); + ptr.SetLength(0); + + + User::LeaveIfError(From8To16(aCid,temp)); + CleanupStack::PushL(temp); + ptr.Append(KSqlGetFileStart); + ptr.Append(*temp); + ptr.Append(KSqlGetFileEnd); + CleanupStack::PopAndDestroy(temp); //temp + User::LeaveIfError(view.Prepare(iDb,TDbQuery(ptr,EDbCompareNormal),TDbWindow::EUnlimited)); + User::LeaveIfError(view.EvaluateAll()); + CleanupStack::PopAndDestroy(buf); //buf + flag = view.FirstL(); + if (!flag) + { + User::Leave(KErrNotFound); + } + else + { + RDbColReadStream strm; + TInt err = 0; + TBool flag = ETrue; + TUint len = 0; + while (flag&&view.AtRow()) + { + view.GetL(); + len = view.ColLength(1); + temp = HBufC::NewLC(len); + ptr.Set(temp->Des()); + strm.OpenLC(view,1); + strm.ReadL(ptr,len); + CleanupStack::PopAndDestroy(&strm); + err = aFile.Open(aFs, ptr, EFileRead|EFileShareReadersOrWriters); + CleanupStack::PopAndDestroy(temp); // temp + if(err == KErrNotFound || err == KErrAccessDenied) + { + view.NextL(); + } + else + { + flag = EFalse; + } + } + User::LeaveIfError(err); + } + CleanupStack::PopAndDestroy(&view); + } + + + +// ----------------------------------------------------------------------------- +// CDcfRep::NextL +// Return entries as iteration. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CDcfEntry* CDcfRep::NextL() + { + CDcfEntry* entry = NULL; + HBufC16* buf = NULL; + HBufC8* temp = NULL; + if (iView.AtRow()) + { + TInt len = 0; + TUint position = 0; + TPtr ptr(NULL,0,0); + RDbColReadStream strm; + + entry = CDcfEntry::NewL(); + CleanupStack::PushL(entry); + iView.GetL(); + + //Set filename and postion + len = iView.ColLength(KOrdFilename); + buf = HBufC::NewLC(len); + ptr.Set(buf->Des()); + strm.OpenLC(iView,KOrdFilename); + strm.ReadL(ptr,len); + position = iView.ColUint16(KOrdPosition); + entry->SetLocationL(ptr,position); + CleanupStack::PopAndDestroy(&strm); + CleanupStack::PopAndDestroy(buf); + + + // Set content ID + len = iView.ColLength(KOrdCid); + buf = HBufC::NewLC(len); + ptr.Set(buf->Des()); + strm.OpenLC(iView,KOrdCid); + strm.ReadL(ptr,len); + CleanupStack::PopAndDestroy(&strm); + User::LeaveIfError(From16To8(*buf,temp)); + CleanupStack::PopAndDestroy(buf); // buf + CleanupStack::PushL(temp); + entry->SetCidL(*temp); + CleanupStack::PopAndDestroy(temp); + + + //Set Group Id + len = iView.ColLength(KOrdGroupId); + buf = HBufC::NewLC(len); + ptr.Set(buf->Des()); + if (len>0) + { + strm.OpenLC(iView,KOrdGroupId); + strm.ReadL(ptr,len); + CleanupStack::PopAndDestroy(&strm); + } + else + { + ptr.SetLength(0); + } + User::LeaveIfError(From16To8(*buf,temp)); + CleanupStack::PopAndDestroy(buf); // buf + CleanupStack::PushL(temp); + entry->SetGroupIdL(*temp); + CleanupStack::PopAndDestroy(temp); // temp + + iView.NextL(); + CleanupStack::Pop(entry); //entry + } + else + { + iView.Reset(); + iView.Close(); + } + return entry; + } + + +// ----------------------------------------------------------------------------- +// CDcfRep::OrderListL +// Order all entries from DB. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDcfRep::OrderListL() + { + TBool flag = ETrue; + + iView.Close(); + + User::LeaveIfError(iView.Prepare( + iDb,TDbQuery(KSqlOrderList(),EDbCompareNormal), + TDbWindow::EUnlimited)); + User::LeaveIfError(iView.EvaluateAll()); + flag = iView.FirstL(); + if (!flag) + { + iView.Reset(); + iView.Close(); + User::Leave(KErrNotFound); + } + } + +// ----------------------------------------------------------------------------- +// CDcfRep::OrderListL +// Order all entries with specific CID from DB. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDcfRep::OrderListL(const TDesC8& aCid) + { + TBool flag = ETrue; + HBufC* temp = NULL; + HBufC* buf = NULL; + TPtr ptr(NULL,0,0); + + iView.Close(); + + User::LeaveIfError(From8To16(aCid,temp)); + CleanupStack::PushL(temp); + buf = HBufC::NewLC(aCid.Length()+KDcfRepExtra); + ptr.Set(buf->Des()); + ptr.SetLength(0); + ptr.Append(KSqlOrderListStart); + ptr.Append(*temp); + ptr.Append(KSqlOrderListEnd); + User::LeaveIfError(iView.Prepare( + iDb,TDbQuery(ptr,EDbCompareNormal), + TDbWindow::EUnlimited)); + User::LeaveIfError(iView.EvaluateAll()); + flag = iView.FirstL(); + if (!flag) + { + // try group id + iView.Reset(); + iView.Close(); + CleanupStack::PopAndDestroy(buf); + buf = HBufC::NewLC(aCid.Length()+KDcfRepExtra); + ptr.Set(buf->Des()); + ptr.SetLength(0); + ptr.Append(KSqlOrderListGroupStart); + ptr.Append(*temp); + ptr.Append(KSqlOrderListGroupEnd); + User::LeaveIfError(iView.Prepare( + iDb,TDbQuery(ptr,EDbCompareNormal), + TDbWindow::EUnlimited)); + User::LeaveIfError(iView.EvaluateAll()); + flag = iView.FirstL(); + if (!flag) + { + // not group id + iView.Reset(); + iView.Close(); + CleanupStack::PopAndDestroy( buf ); + CleanupStack::PopAndDestroy( temp ); + User::Leave(KErrNotFound); + } + } + CleanupStack::PopAndDestroy( buf ); + CleanupStack::PopAndDestroy( temp ); + } + +// ----------------------------------------------------------------------------- +// CDcfRep::RemoveDcfFromDbL +// Remove all the entries that have the filename in database. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDcfRep::RemoveDcfFromDbL( const TDesC& aFileName ) + { + + TPtr ptr(NULL,0,0); + HBufC* sql = NULL; + sql= HBufC16::NewLC(KSqlDeleteStart().Length()+aFileName.Length()+KSqlDeleteEnd().Length()); + *sql = KNullDesC; + ptr.Set(sql->Des()); + ptr.Append(KSqlDeleteStart); + ptr.Append(aFileName); + ptr.Append(KSqlDeleteEnd); + TInt err =iDb.Execute(ptr); + CleanupStack::PopAndDestroy(sql); // sql + } + +// ----------------------------------------------------------------------------- +// CDcfRep::RefreshDcf +// let server scan file system for Dcfs +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDcfRep::RefreshDcf( TRequestStatus& aStatus ) + { + iClient.ScanDcf(aStatus); + } + +// ----------------------------------------------------------------------------- +// CDcfRep::RefreshDcf +// let server scan file system for Dcfs +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDcfRep::RefreshDcf( RPointerArray& aList , TRequestStatus& aStatus ) + { + iClient.ScanDcf( aList , aStatus ); + } + +// ----------------------------------------------------------------------------- +// CDcfRep::SetTtid +// Set transaction ID to all Dcfs associated with a specific CID +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDcfRep::SetTtid( + RArray& aList , + TRequestStatus& aStatus, + TBool aRefresh) + { + if (aRefresh) + { + iClient.SetTtid( aList , aStatus ); + } + } + + +// ----------------------------------------------------------------------------- +// CDcfRep::NotifyServerIdle +// notify if server is in idle. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDcfRep::NotifyServerIdle( TRequestStatus& aStatus ) + { + iClient.NotifyServerIdle( aStatus ); + } + + +// ----------------------------------------------------------------------------- +// CDcfRep::OpenDatabaseL +// connect database server and open session for it +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CDcfRep::OpenDatabaseL() + { + User::LeaveIfError(iDbs.Connect()); + +#ifndef RD_MULTIPLE_DRIVE + + User::LeaveIfError(iDb.Open(iDbs,KDbFileLocation())); + +#else //RD_MULTIPLE_DRIVE + + RFs fs; + TInt driveNumber( -1 ); + TChar driveLetter; + DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem, driveNumber ); + + User::LeaveIfError( fs.Connect() ); + fs.DriveToChar( driveNumber, driveLetter ); + fs.Close(); + + TFileName dbFile; + dbFile.Format( KDbFileLoc, (TUint)driveLetter ); + + User::LeaveIfError( iDb.Open( iDbs, dbFile ) ); + +#endif + } + +// ----------------------------------------------------------------------------- +// CDcfRep::SetName +// set name of CID into rights DB +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CDcfRep::SetName(const TDesC8& aCid , const TDesC16& aName) + { + RDRMRightsClient r; + TInt err = 0; + err = r.Connect(); + if (!err) + { + HBufC* buf = NULL; + err = r.GetName(aCid,buf); + if ( !err && buf->Des().Length()==0 ) + { + err = r.SetName(aCid,aName); + } + if (err == KErrNotFound) + { + err = KErrNone; // if there is no cid, then just ignore adding name to it. + } + delete buf; + } + r.Close(); + return err; + } + +// ----------------------------------------------------------------------------- +// CDcfRep::GetCidL +// get cid list for a filename from repository DB +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CDcfRep::GetCidL(const TDesC16& aName , RPointerArray& aList) + { + TBool flag = EFalse; + HBufC8* temp8 = NULL; + HBufC* temp16 = NULL; + RDbView view; + TInt len = 0; + CleanupClosePushL(view); + HBufC* buf = HBufC::NewLC(aName.Length()+KDcfRepExtra); + TPtr ptr(buf->Des()); + ptr.SetLength(0); + ptr.Append(KSqlGetCidStart); + ptr.Append(aName); + ptr.Append(KSqlGetCidEnd); + User::LeaveIfError(view.Prepare(iDb,TDbQuery(ptr,EDbCompareNormal),TDbWindow::EUnlimited)); + User::LeaveIfError(view.EvaluateAll()); + CleanupStack::PopAndDestroy(buf); //buf + flag = view.FirstL(); + if (!flag) + { + User::Leave(KErrNotFound); + } + else + { + while (view.AtRow()) + { + view.GetL(); + len = view.ColLength(1); + temp16 = HBufC::NewLC(len); + ptr.Set(temp16->Des()); + + RDbColReadStream strm; + strm.OpenLC(view,1); + strm.ReadL(ptr,len); + CleanupStack::PopAndDestroy(&strm); + + User::LeaveIfError(From16To8(*temp16,temp8)); + CleanupStack::PopAndDestroy(temp16); // temp16 + CleanupStack::PushL(temp8); + User::LeaveIfError(aList.Append(temp8)); + CleanupStack::Pop(temp8); // temp8 + view.NextL(); + } + } + CleanupStack::PopAndDestroy(&view); + } + +// ----------------------------------------------------------------------------- +// CDcfRep::GetFilenameL +// get filename list for a cid from repository DB +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CDcfRep::GetFilenameL(const TDesC8& aCid , RPointerArray& aList) + { + TBool flag = EFalse; + HBufC* temp = NULL; + RDbView view; + TInt len = 0; + CleanupClosePushL(view); + HBufC* buf = HBufC::NewLC(aCid.Length()+KDcfRepExtra); + TPtr ptr(buf->Des()); + ptr.SetLength(0); + User::LeaveIfError(From8To16(aCid,temp)); + CleanupStack::PushL(temp); + ptr.Append(KSqlGetFileStart); + ptr.Append(*temp); + ptr.Append(KSqlGetFileEnd); + CleanupStack::PopAndDestroy(temp); //temp + User::LeaveIfError(view.Prepare(iDb,TDbQuery(ptr,EDbCompareNormal),TDbWindow::EUnlimited)); + User::LeaveIfError(view.EvaluateAll()); + CleanupStack::PopAndDestroy(buf); //buf + flag = view.FirstL(); + if (!flag) + { + User::Leave(KErrNotFound); + } + else + { + while (view.AtRow()) + { + RDbColReadStream strm; + view.GetL(); + len = view.ColLength(1); + temp = HBufC::NewLC(len); + ptr.Set(temp->Des()); + strm.OpenLC(view,1); + strm.ReadL(ptr,len); + CleanupStack::PopAndDestroy(&strm); + User::LeaveIfError(aList.Append(temp)); + CleanupStack::Pop(temp); // temp + view.NextL(); + } + } + CleanupStack::PopAndDestroy(&view); + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File + +