userlibandfileserver/fileserver/sfile/sf_raw.cpp
changeset 0 a41df078684a
child 43 c1f20ce4abcf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/userlibandfileserver/fileserver/sfile/sf_raw.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,221 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// f32\sfile\sf_raw.cpp
+// 
+//
+
+#include "sf_std.h"
+#include "sf_file_cache.h"
+
+LOCAL_C CRawDiskCB* GetRawDiskFromHandle(TInt aHandle, CSessionFs* aSession)
+//
+// Get the rawdisk control block from aHandle
+//
+	{
+	return((CRawDiskCB*)(SessionObjectFromHandle(aHandle,RawDisks->UniqueID(),aSession)));
+	}
+
+LOCAL_C void DoFsRawDiskOpenL(TInt& aHandle,CRawDiskCB*& aRawDisk, CFsRequest* aRequest)
+//
+// Do the bits that can leave
+//
+	{
+
+	aRawDisk=new(ELeave) CRawDiskCB;
+	RawDisks->AddL(aRawDisk,ETrue);
+	aRawDisk->InitL(&aRequest->Drive()->CurrentMount(),aRequest->Drive()->IsWriteProtected());
+	// modify resource counter after initialisation to ensure correct cleanup in object destruction
+	AddDiskAccess(aRequest->Drive()->CurrentMount());
+	aHandle=aRequest->Session()->Handles().AddL(aRawDisk,ETrue);
+	}
+
+TInt TFsRawDiskOpen::DoRequestL(CFsRequest* aRequest)
+//
+// Open direct disk access channel
+//
+	{
+	__PRINT(_L("TFsRawDiskOpen::DoRequestL(CFsRequest* aRequest)"));
+		
+	TInt r=aRequest->Drive()->CheckMount();
+	if (r==KErrNone && aRequest->Drive()->CurrentMount().LockStatus()<0)
+		return(KErrInUse);
+	if (r!=KErrNone)
+		return(r);
+
+	__ASSERT_DEBUG( aRequest->Drive()->CurrentMount().LockStatus()==0,Fault(ESvrRawDiskOpenFailed));
+
+	TInt handle;
+	CRawDiskCB* rawDisk=NULL;
+	TRAPD(ret,DoFsRawDiskOpenL(handle,rawDisk,aRequest));
+	if (ret!=KErrNone)
+		{
+		if(rawDisk)
+			rawDisk->Close();
+		return(ret);
+		}
+
+	r = rawDisk->Drive().FlushCachedFileInfo();
+	if (r != KErrNone)
+		return(r);
+
+	// Empty the closed file container
+	TClosedFileUtils::Remove();
+
+	TPtrC8 pH((TUint8*)&handle,sizeof(TInt));
+	aRequest->WriteL(KMsgPtr3,pH);
+	aRequest->Session()->IncResourceCount();
+	return(KErrNone);
+	}
+
+TInt TFsRawDiskOpen::Initialise(CFsRequest* aRequest)
+//	
+//
+	{
+	if (!KCapFsRawDiskOpen.CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING("Raw Disk Open")))
+		return KErrPermissionDenied;
+	TInt driveNo=aRequest->Message().Int0();
+	return ValidateDriveDoSubst(driveNo,aRequest);
+	}
+
+
+TInt TFsRawDiskRead::DoRequestL(CFsRequest* aRequest)
+//
+// Do Raw Read
+//
+	{
+	__PRINT(_L("TFsRawDiskRead::DoRequestL(CFsRequest* aRequest)"));
+	
+	CRawDiskCB* rawDisk=(CRawDiskCB*)aRequest->ScratchValue();
+
+	TInt r=rawDisk->Drive().CheckMount();
+	if (r!=KErrNone && r!=KErrInUse)
+		return(r);
+	if (&rawDisk->Mount()!=&rawDisk->Drive().CurrentMount())
+		return(KErrDisMounted);
+	TInt64 pos;
+	TPtr8 tBuf((TUint8*)&pos,sizeof(TInt64));
+	aRequest->ReadL(KMsgPtr2,tBuf);
+	if ( pos < 0 )
+		return(KErrArgument);
+	TInt length=aRequest->Message().Int1();
+	const TAny* pDes=aRequest->Message().Ptr0();
+
+	TRACETHREADID(aRequest->Message());
+	TRACE7(UTF::EBorder, UTraceModuleFileSys::ECMountCBRawReadL, EF32TraceUidFileSys, 
+		aRequest->DriveNumber(), I64LOW(pos), I64HIGH(pos), length, pDes, 0, I64LOW(threadId));
+	TRAP(r,rawDisk->Mount().RawReadL(pos,length,pDes,0,aRequest->Message()));
+	TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECMountCBRawReadLRet, EF32TraceUidFileSys, r);
+
+	return(r);
+	}
+
+TInt TFsRawDiskRead::Initialise(CFsRequest* aRequest)
+//
+//
+//
+	{
+	if (!KCapFsRawDiskRead.CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING("Raw Disk Read")))
+		return KErrPermissionDenied;
+	CRawDiskCB* rawDisk=GetRawDiskFromHandle(aRequest->Message().Int3(),aRequest->Session());
+	if(!rawDisk)
+		return(KErrBadHandle);
+	aRequest->SetDrive(&rawDisk->Drive());
+	aRequest->SetScratchValue((TUint)rawDisk);
+	return KErrNone;
+	}
+
+
+TInt TFsRawDiskWrite::DoRequestL(CFsRequest* aRequest)
+//
+// Do Raw write
+//
+	{
+	__PRINT(_L("TFsRawDiskWrite::DoRequestL(CFsRequest* aRequest)"));
+	
+	CRawDiskCB* rawDisk=(CRawDiskCB*)aRequest->ScratchValue();
+	
+	TInt r=rawDisk->Drive().CheckMount();
+	if (r!=KErrNone && r!=KErrInUse)
+		return(r);
+	if (&rawDisk->Mount()!=&rawDisk->Drive().CurrentMount())
+		return(KErrDisMounted);
+	TInt64 pos;
+	TPtr8 tBuf((TUint8*)&pos,sizeof(TInt64));
+	aRequest->ReadL(KMsgPtr2,tBuf);
+	if ( pos < 0 )
+		return(KErrArgument);
+	TInt length=aRequest->Message().Int1();
+	const TAny* pDes=aRequest->Message().Ptr0();
+
+	TRACETHREADID(aRequest->Message());
+	TRACE7(UTF::EBorder, UTraceModuleFileSys::ECMountCBRawWriteL, EF32TraceUidFileSys, 
+		aRequest->DriveNumber(), I64LOW(pos), I64HIGH(pos), length, pDes, 0, I64LOW(threadId));
+	TRAP(r,rawDisk->Mount().RawWriteL(pos,length,pDes,0,aRequest->Message()));
+	TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECMountCBRawWriteLRet, EF32TraceUidFileSys, r);
+
+	rawDisk->SetChanged();
+	return(r);
+	}
+
+TInt TFsRawDiskWrite::Initialise(CFsRequest* aRequest)
+//
+//
+//
+	{
+	if (!KCapFsRawDiskWrite.CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING("Raw Disk Write")))
+		return KErrPermissionDenied;
+	CRawDiskCB* rawDisk=GetRawDiskFromHandle(aRequest->Message().Int3(),aRequest->Session());
+	if(!rawDisk)
+		return(KErrBadHandle);
+	if(rawDisk->IsWriteProtected())
+		return(KErrAccessDenied);
+	aRequest->SetDrive(&rawDisk->Drive());
+	aRequest->SetScratchValue((TUint)rawDisk);
+	return KErrNone;
+	}
+
+CRawDiskCB::CRawDiskCB()
+//
+// Constructor
+//
+	{
+	}
+
+CRawDiskCB::~CRawDiskCB()
+//
+// Destructor
+//
+	{
+	if(iMount)
+		{
+		__ASSERT_DEBUG(iMount->LockStatus()>0,Fault(ERawDiskBadAccessCount));
+		RemoveDiskAccess(*iMount);
+		if(IsChanged())
+			iMount->Drive().SetChanged(ETrue);
+		iMount->Close();
+		}
+	}
+
+void CRawDiskCB::InitL(CMountCB* aMount,TBool aIsWriteProtected)
+//
+// Initialise
+//
+	{
+	DoInitL(aMount->Drive().DriveNumber());
+	iMount=aMount;
+	if(aIsWriteProtected)
+		SetWriteProtected();
+	User::LeaveIfError(iMount->Open());
+	}
+