javacommons/jvms/nativeportlayer/src.s60/javafile.cpp
branchRCL_3
changeset 19 04becd199f91
child 80 d6dafc5d983f
--- /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() {}