userlibandfileserver/fileserver/sfile/sf_request.cpp
changeset 273 6a75fa55495f
parent 243 c7a0ce20c48c
child 286 48e57fb1237e
--- a/userlibandfileserver/fileserver/sfile/sf_request.cpp	Wed Sep 22 10:53:45 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_request.cpp	Mon Sep 27 10:52:00 2010 +0100
@@ -369,7 +369,9 @@
 //
 //
 //
-	{}
+	{
+	Close();
+	}
 
 void CFsRequest::Set(const TOperation& aOperation,CSessionFs* aSession)
 //
@@ -380,16 +382,7 @@
 	SetState(EReqStateInitialise);
 
 	iOperation     = const_cast<TOperation*>(&aOperation);
-	iSession       = aSession;
-	iIsCompleted   = aOperation.IsCompleted();
-	iError         = KErrNone;
-	iDriveNumber   = KDriveInvalid;
-	iCurrentPlugin = NULL;
-	iOwnerPlugin   = NULL;
-	iDirectToDrive = EFalse;
-	iClientThreadId= 0;
-	iFlags &= ~(EFreeChanged | EPostInterceptEnabled | EPostOperation | EFsObjectOpen);
-	iScratchValue = 0;
+	Set(aSession);
 	}
 
 void CFsRequest::Set(CSessionFs* aSession)
@@ -401,7 +394,6 @@
 
 	SetState(EReqStateInitialise);
 
-	iSession       = aSession;
 	iIsCompleted   = iOperation->IsCompleted();
 	iError         = KErrNone;
 	iDriveNumber   = KDriveInvalid;
@@ -409,8 +401,11 @@
 	iOwnerPlugin   = NULL;
 	iDirectToDrive = EFalse;
 	iClientThreadId= 0;
-	iFlags &= ~(EFreeChanged | EPostInterceptEnabled | EPostOperation | EFsObjectOpen);
+	iFlags &= ~(EFreeChanged | EPostInterceptEnabled | EPostOperation | EFsDspObjOpen);
+
 	iScratchValue = 0;
+
+	OpenSession(aSession);
 	}
 
 
@@ -643,21 +638,50 @@
 	return KErrNotSupported;
 	}
 
-void CFsRequest::SetAndOpenScratchValue(const TInt64& aValue)
+void CFsRequest::OpenDispatchObject(const TInt64& aValue)
 	{
-	if (IsFsObjectOpen())
+	CloseDispatchObject();
+
+	iScratchValue = aValue;
+
+	if (I64LOW(iScratchValue) && iOperation && (iOperation->iFlags & EFsDspObj))
+		{
+		((CFsDispatchObject*) I64LOW(iScratchValue))->Open();
+		iFlags |= EFsDspObjOpen;
+		}
+	}
+
+void CFsRequest::CloseDispatchObject()
+	{
+	if (iFlags & EFsDspObjOpen)
 		{
 		((CFsDispatchObject*) I64LOW(iScratchValue))->Close();
-		SetFsObjectOpen(EFalse);
+		iFlags &= ~EFsDspObjOpen;
 		}
-	if (I64LOW(aValue) && iOperation && (iOperation->iFlags & EFileShare))
-		{
-		((CFsDispatchObject*) I64LOW(aValue))->Open();
-		SetFsObjectOpen(ETrue);
-		}
-	iScratchValue = aValue;
+	}
+
+void CFsRequest::OpenSession(CSessionFs* aSession)
+	{
+	CloseSession();
+	iSession = aSession;
+	if (iSession)
+		iSession->Open();
 	}
 
+void CFsRequest::CloseSession()
+	{
+	if (iSession)
+		{
+		iSession->Close();
+		iSession = NULL;
+		}
+	}
+
+void CFsRequest::Close()
+	{
+	SetScratchValue(0);	// this should close the CFsObject
+	CloseSession();
+	}
 
 TInt CFsRequest::Read(TFsPluginRequest::TF32ArgType aType, TDes8& aDes, TInt aOffset)
 	{
@@ -1358,7 +1382,7 @@
 	{
 	__THRD_PRINT1(_L("CFsMessageRequest::Free() isAllocated=%d"), IsAllocated());
 
-	SetScratchValue(0);	// this should close the CFsObject
+	Close();
 
 	if(!IsAllocated())
 		delete(this);
@@ -1962,7 +1986,8 @@
 		iPoolDest = 0;
 		}
 
-	SetScratchValue(0);	// this should close the CFsObject
+	Close();
+
 	iOperation = NULL;
 	RequestAllocator::FreeRequest(this);
 	}
@@ -2170,16 +2195,7 @@
 	{
 	__PRINT1(_L("CFsInternalRequest::Complete() with %d"),aError);
 	TInt func = Operation()->Function();
-	if(func==KCancelSession || func==KCancelPlugin || func==KFlushDirtyData)
-		{
-		__ASSERT_DEBUG(ThreadHandle()!=0 && !FsThreadManager::IsDisconnectThread(),Fault(EInternalRequestComplete1));
-		RThread t;
-		t.SetHandle(ThreadHandle());
-		TRequestStatus* s=&Status();
-		t.RequestComplete(s,aError);
-		Free();
-		}
-	else if(func == KDispatchObjectClose)
+	if(func == KDispatchObjectClose)
 		{
 		TFsCloseObject::Complete(this);
 		Free();
@@ -2208,30 +2224,21 @@
 	__THRD_PRINT(_L("CFsInternalRequest::Dispatch()"));
 	__ASSERT_ALWAYS(Initialise()==KErrNone,Fault(EInternalRequestDispatch1));
 
-	if(iCurrentPlugin && Operation()->Function() == KCancelPlugin)
-		{
-		TFsPluginRequest request(this);
-		TInt r = iCurrentPlugin->Deliver(request);
-		__ASSERT_ALWAYS(r == KErrNone, Fault(EInternalRequestDispatchCancelPlugin));
-		}
+	TInt drivenumber = DriveNumber();
+	FsThreadManager::LockDrive(drivenumber);
+	// shouldn't dispath if no drive available
+	__ASSERT_ALWAYS(FsThreadManager::IsDriveAvailable(drivenumber,EFalse) && !FsThreadManager::IsDriveSync(drivenumber,EFalse),Fault(EInternalRequestDispatch2));
+	CDriveThread* dT=NULL;
+	TInt r=FsThreadManager::GetDriveThread(drivenumber,&dT);
+	__THRD_PRINT2(_L("deliver to thread 0x%x, drive number %d"),dT,drivenumber);
+	__ASSERT_ALWAYS(r==KErrNone && dT,Fault(EInternalRequestDispatch3));
+	CRequestThread* pT = (CRequestThread*)dT;
+	TInt func = Operation()->Function();
+	if(func == KDispatchObjectClose || func == KFileShareClose || func == KFlushDirtyData)
+		pT->DeliverBack(this);
 	else
-		{
-		TInt drivenumber = DriveNumber();
-		FsThreadManager::LockDrive(drivenumber);
-		// shouldn't dispath if no drive available
-		__ASSERT_ALWAYS(FsThreadManager::IsDriveAvailable(drivenumber,EFalse) && !FsThreadManager::IsDriveSync(drivenumber,EFalse),Fault(EInternalRequestDispatch2));
-		CDriveThread* dT=NULL;
-		TInt r=FsThreadManager::GetDriveThread(drivenumber,&dT);
-		__THRD_PRINT2(_L("deliver to thread 0x%x, drive number %d"),dT,drivenumber);
-		__ASSERT_ALWAYS(r==KErrNone && dT,Fault(EInternalRequestDispatch3));
-		CRequestThread* pT = (CRequestThread*)dT;
-		TInt func = Operation()->Function();
-		if(func == KDispatchObjectClose || func == KFileShareClose || func == KFlushDirtyData)
-			pT->DeliverBack(this);
-		else
-			pT->DeliverFront(this);
-		FsThreadManager::UnlockDrive(drivenumber);
-		}
+		pT->DeliverFront(this);
+	FsThreadManager::UnlockDrive(drivenumber);
 	}
 
 void CFsInternalRequest::Free()
@@ -2241,58 +2248,12 @@
 	{
 	__THRD_PRINT1(_L("CFsInternalRequest::Free() isAllocated=%d"),IsAllocated());
 
-	SetScratchValue(0);	// this should close the CFsObject
+	Close();
 
 	if(!IsAllocated())
 		delete(this);
 	}
 
-void CFsDisconnectRequest::Dispatch()
-//
-//
-//
-	{
-	__THRD_PRINT(_L("CFsDisconnectRequest::Dispatch()"));
-	// no need to lock
-	TInt r=Initialise();
-	__ASSERT_ALWAYS(r==KErrNone,Fault(EDisconnectRequestDispatch1));
-	CRequestThread* pT=FsThreadManager::GetDisconnectThread();
-	__ASSERT_ALWAYS(pT,Fault(EDisconnectRequestDispatch2));
-	pT->DeliverBack(this);
-	}
-
-void CFsDisconnectRequest::Process()
-//
-//
-//
-	{
-	__THRD_PRINT(_L("CFsDisconnectRequest::Process()"));
-	TInt r=KErrNone;
-	TRAPD(leaveValue,r=iOperation->DoRequestL(this));
-	leaveValue=leaveValue; // just to make compiler happy
-	__ASSERT_DEBUG(leaveValue==KErrNone && r==KErrNone,Fault(EDisonncectRequestProcess));
-	Complete(r);
-	}
-
-void CFsDisconnectRequest::Complete(TInt aError)
-//
-//
-//
-	{
-	__PRINT1(_L("CFsDisconnectRequest::Complete() with %d"),aError);
-	__ASSERT_ALWAYS(aError==KErrNone,Fault(EDisconnectRequestComplete));
-	// set session disconnect reqeust to NULL
-	// will be freed in CFsMessageRequest::Free()
-	Session()->iDisconnectRequest=NULL;
-	// now delete session
-	TheFileServer->SessionQueueLockWait();
-	delete(Session());
-	TheFileServer->SessionQueueLockSignal();
-	// NB Must complete the message AFTER the session has been deleted...
-	Message().Complete(aError);
-	delete(this);	
-	}
-
 
 /**
 Create a new synchronous message scheduler
@@ -2410,24 +2371,3 @@
 	}
 
 
-/**
-Complete outstanding requests for the specified session
-*/
-void CFsSyncMessageScheduler::CompleteSessionRequests(CSessionFs* aSession, TInt aValue)
-	{
-	__PRINT2(_L("FsPluginManager::CompleteSessionRequests(%08x, %d)"), aSession, aValue);
-	
-	iLock.Wait();
-	TDblQueIter<CFsRequest> q(iList);
-	CFsRequest* pR;
-	while((pR=q++)!=NULL)
-		{
-		if(pR->Session()==aSession)
-			{
-			pR->iLink.Deque();
-			pR->Complete(aValue);
-			}
-		}
-	iLock.Signal();
-	}
-