diff -r f5050f1da672 -r 04becd199f91 javacommons/jvms/nativeportlayer/src.s60/javafile.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/jvms/nativeportlayer/src.s60/javafile.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,422 @@ +/* +* Copyright (c) 2008 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: CJavaFile +* +*/ + +#include "logger.h" +#include "mjavafile.h" +#include "javafile.h" + +using namespace javaruntime; + +//***************************************************************************** +MJavaFile* CJavaFile::NewL() +{ + JELOG2(EJVM); + CJavaFile* self = new(ELeave) CJavaFile(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; +} + +//***************************************************************************** +CJavaFile::CJavaFile(): iJavaFileMode(EJavaFileClosed) +{ + JELOG2(EJVM); +} + +//***************************************************************************** +void CJavaFile::ConstructL() +{ + JELOG2(EJVM); +} + +//***************************************************************************** +CJavaFile::~CJavaFile() +{ + JELOG2(EJVM); + Close(); +} + +//***************************************************************************** +void CJavaFile::OpenCafL(const TDesC& aFileName) +{ + JELOG2(EJVM); + if (NULL == iCafContent) + { + iCafContent = ContentAccess::CContent::NewL(aFileName); + } + iCafData = iCafContent->OpenContentL(ContentAccess::EPeek); + User::LeaveIfError(iCafData->ExecuteIntent(ContentAccess::EPeek)); +} + +//***************************************************************************** +TInt CJavaFile::Open(RFs& aFs,const TDesC& aFileName, TUint aFileMode) +{ + JELOG2(EJVM); + if (iJavaFileMode != EJavaFileClosed) + { + // Not allowed if some file is already opened and not properly closed. + return KErrInUse; + } + mFileName.assign((wchar_t*)aFileName.Ptr(), aFileName.Length()); + TInt status; + if (isDrmFile(aFileName)) + { + LOG1(EJVM, EInfo,"Opening file %S using CAF", mFileName.c_str()); + iJavaFileMode = EJavaFileOpenForCaf; //This is set before opening + //in order to allow proper + //cleanup if something fails. + TRAP(status, OpenCafL(aFileName)); + if (status != KErrNone) + { + // Clean up and set the class ready for opening another file. + Close(); + } + } + else + { + // Using RFile + LOG1(EJVM, EInfo,"Opening file %S using RFile", mFileName.c_str()); + status = iNormalFile.Open(aFs, aFileName, aFileMode); + if (status == KErrNone) + { + iJavaFileMode = EJavaFileOpenForNormalFile; + } + // No need for cleaning. + } + return status; +} + +//***************************************************************************** +void CJavaFile::Close() +{ + JELOG2(EJVM); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + LOG1(EJVM, EInfo,"Closing file %S using CAF", mFileName.c_str()); + delete iCafData; + iCafData = NULL; + delete iCafContent; + iCafContent = NULL; + } + if (iJavaFileMode == EJavaFileOpenForNormalFile) + { + LOG1(EJVM, EInfo,"Closing file %S using RFile", mFileName.c_str()); + iNormalFile.Close(); + } + iJavaFileMode = EJavaFileClosed; +} + +//***************************************************************************** +TInt CJavaFile::Size(TInt& aSize) const +{ + JELOG2(EJVM); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Using CAF + TInt status = KErrNone; + TRAP(status, iCafData->DataSizeL(aSize)); + return status; + } + else + { + //Using RFile + return iNormalFile.Size(aSize); + } +} + +//***************************************************************************** +TInt CJavaFile::SetSize(TInt aSize) +{ + JELOG2(EJVM); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Not supported for files accessed via CAF. + return KErrNotSupported; + } + else + { + //Using RFile + return iNormalFile.SetSize(aSize); + } +} + +//***************************************************************************** +TInt CJavaFile::Create(RFs& aFs,const TDesC& aName,TUint aFileMode) +{ + JELOG2(EJVM); + if (iJavaFileMode != EJavaFileClosed) + { + //Not allowed if some file is already opened and not properly closed. + return KErrInUse; + } + //Using RFile + TInt status = iNormalFile.Create(aFs, aName, aFileMode); + if (status == KErrNone) + { + iJavaFileMode = EJavaFileOpenForNormalFile; + } + return status; +} + +//***************************************************************************** +TInt CJavaFile::Read(TDes8& aDes) const +{ + //JELOG4(EJVM, EEntry & EInfoHeavyLoad); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Using CAF + return iCafData->Read(aDes); + } + else + { + //Using RFile + return iNormalFile.Read(aDes); + } +} + +//***************************************************************************** +TInt CJavaFile::Read(TDes8& aDes, TInt aLength) const +{ + //JELOG4(EJVM, EEntry & EInfoHeavyLoad); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Using CAF + return iCafData->Read(aDes, aLength); + } + else + { + //Using RFile + return iNormalFile.Read(aDes, aLength); + } +} + +//***************************************************************************** +TInt CJavaFile::Replace(RFs& aFs,const TDesC& aName,TUint aFileMode) +{ + JELOG2(EJVM); + //Using RFile + TInt status = iNormalFile.Replace(aFs, aName, aFileMode); + if (status == KErrNone) + { + iJavaFileMode = EJavaFileOpenForNormalFile; + } + else + { + //Clean the environment just in case. + Close(); + } + return status; +} + + + +//***************************************************************************** +TInt CJavaFile::Write(const TDesC8& aDes) +{ + JELOG2(EJVM); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Not supported for files accessed via CAF. + return KErrNotSupported; + } + else + { + //Using RFile + return iNormalFile.Write(aDes); + } +} + +//***************************************************************************** +TInt CJavaFile::Write(const TDesC8& aDes,TInt aLength) +{ + JELOG2(EJVM); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Not supported for files accessed via CAF. + return KErrNotSupported; + } + else + { + //Using RFile + return iNormalFile.Write(aDes, aLength); + } +} + +//***************************************************************************** +TInt CJavaFile::Write(TInt aPos,const TDesC8& aDes) +{ + JELOG2(EJVM); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Not supported for files accessed via CAF. + return KErrNotSupported; + } + else + { + //Using RFile + return iNormalFile.Write(aPos, aDes); + } +} + +//***************************************************************************** +TInt CJavaFile::Write(TInt aPos,const TDesC8& aDes,TInt aLength) +{ + JELOG2(EJVM); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Not supported for files accessed via CAF. + return KErrNotSupported; + } + else + { + //Using RFile + return iNormalFile.Write(aPos, aDes, aLength); + } +} + +//***************************************************************************** +TInt CJavaFile::Lock(TInt aPos, TInt aLength) const +{ + JELOG2(EJVM); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Not supported for files accessed via CAF. + return KErrNotSupported; + } + else + { + //Using RFile + return iNormalFile.Lock(aPos, aLength); + } +} + +//***************************************************************************** +TInt CJavaFile::UnLock(TInt aPos, TInt aLength) const +{ + JELOG2(EJVM); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Not supported for files accessed via CAF. + return KErrNotSupported; + } + else + { + //Using RFile + return iNormalFile.UnLock(aPos, aLength); + } +} + +//***************************************************************************** +TInt CJavaFile::Seek(TSeek aMode,TInt& aPos) const +{ +// JELOG4(EJVM, EEntry & EInfoHeavyLoad); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Using CAF + return iCafData->Seek(aMode, aPos); + } + else + { + //Using RFile + return iNormalFile.Seek(aMode, aPos); + } +} + +//***************************************************************************** +TInt CJavaFile::Flush() +{ + JELOG2(EJVM); + if (iJavaFileMode == EJavaFileOpenForCaf) + { + //Not supported for files accessed via CAF. + return KErrNotSupported; + } + else + { + //Using RFile + return iNormalFile.Flush(); + } +} + +//***************************************************************************** +TBool CJavaFile::isDrmFile(const TDesC& aFileName) +{ + TParse filename; + filename.Set(aFileName, NULL, NULL); + TPtrC filenameExt = filename.Ext(); + + if (filenameExt.CompareF(_L(".dm")) == 0 || + filenameExt.CompareF(_L(".dcf")) == 0) + { + // Filename extension indicates this is a DRM protected file. + return ETrue; + } + + if (filenameExt.CompareF(_L(".jar")) != 0) + { + // Filename extension indicates this is not a jar file, + // assume it is not DRM protected. + return EFalse; + } + + RProcess thisProcess; + TName thisProcessName = thisProcess.Name(); + if (KErrNotFound == thisProcessName.FindF(_L("Installer"))) + { + // We are not running in JavaInstaller process, + // do not check if file is DRM protected from CAF + // but assume that file is not DRM protected. + return EFalse; + } + + // Check from CAF if file is DRM protected. + TBool drmFile = EFalse; + if (NULL == iCafContent) + { + TRAP_IGNORE(iCafContent = ContentAccess::CContent::NewL(aFileName)); + if (NULL != iCafContent) + { + TInt value = 0; + TInt err = iCafContent->GetAttribute( + ContentAccess::EIsProtected, value); + if (KErrNone == err && value) + { + // This is a DRM file. + drmFile = ETrue; + } + else + { + // Not a DRM file, delete iCafContent instance. + delete iCafContent; + iCafContent = NULL; + } + } + } + return drmFile; +} + + +EXPORT_C void Dummy1() {} +EXPORT_C void Dummy2() {} +EXPORT_C void Dummy3() {} +EXPORT_C void Dummy4() {} +EXPORT_C void Dummy5() {} +EXPORT_C void Dummy6() {} +EXPORT_C void Dummy7() {} +EXPORT_C void Dummy8() {} +EXPORT_C void Dummy9() {}