userlibandfileserver/fileserver/sfile/sf_file.cpp
branchRCL_3
changeset 294 039a3e647356
parent 257 3e88ff8f41d5
equal deleted inserted replaced
268:345b1ca54e88 294:039a3e647356
   697 		else
   697 		else
   698 			{
   698 			{
   699 			// Current operation points to a local buffer
   699 			// Current operation points to a local buffer
   700 			// The request originated from the file server (e.g. file cache) with a local message handle (KLocalMessageHandle)
   700 			// The request originated from the file server (e.g. file cache) with a local message handle (KLocalMessageHandle)
   701 			TPtr8 dataDesc((TUint8*) currentOperation.iReadWriteArgs.iData + currentOperation.iReadWriteArgs.iOffset, len, len);
   701 			TPtr8 dataDesc((TUint8*) currentOperation.iReadWriteArgs.iData + currentOperation.iReadWriteArgs.iOffset, len, len);
   702 
   702 			const RLocalMessage msg;
   703 			// save the client's RMessage2
   703 			TRAP(r,file->ReadL(pos, len, &dataDesc, msg, 0));
   704 			const RMessage2 msgClient = aRequest->Message();
       
   705 			
       
   706 			// overwrite RMessage2 in CFsMessageRequest with RLocalMessage 
       
   707 			const RLocalMessage msgLocal;					
       
   708 			const_cast<RMessage2&> (aRequest->Message()) = msgLocal;
       
   709 
       
   710 			TRAP(r,file->ReadL(pos, len, &dataDesc, aRequest->Message(), 0));
       
   711 							
       
   712 			// restore the client's RMessage2
       
   713 			const_cast<RMessage2&> (aRequest->Message()) = msgClient;
       
   714 			}
   704 			}
   715 		}
   705 		}
   716 
   706 
   717 
   707 
   718 #if defined(_DEBUG) || defined(_DEBUG_RELEASE)
   708 #if defined(_DEBUG) || defined(_DEBUG_RELEASE)
   965 
   955 
   966     ASSERT(aFsOp == EFsFileWrite || aFsOp == EFsFileWriteDirty);
   956     ASSERT(aFsOp == EFsFileWrite || aFsOp == EFsFileWriteDirty);
   967     if(aFsOp == EFsFileWrite)
   957     if(aFsOp == EFsFileWrite)
   968         {//-- this call is originated from explicit file write operation. Set 'Archive' attribute and new file time.
   958         {//-- this call is originated from explicit file write operation. Set 'Archive' attribute and new file time.
   969         aFile->SetArchiveAttribute(); //-- it will also set KEntryAttModified
   959         aFile->SetArchiveAttribute(); //-- it will also set KEntryAttModified
       
   960         }
       
   961     else
       
   962         {//-- don't touch data and attributes if it is cache flushing dirty data
       
   963         aFile->iAtt |= KEntryAttModified;
   970         }
   964         }
   971 
   965 
   972 
   966 
   973 	return KErrNone;
   967 	return KErrNone;
   974 	}
   968 	}
  1098 			TRAP(r,file->WriteL(pos, len, (const TPtrC8*) aRequest->Message().Ptr0(), aRequest->Message(), currentOperation.iReadWriteArgs.iOffset))
  1092 			TRAP(r,file->WriteL(pos, len, (const TPtrC8*) aRequest->Message().Ptr0(), aRequest->Message(), currentOperation.iReadWriteArgs.iOffset))
  1099 			}
  1093 			}
  1100 		else
  1094 		else
  1101 			{
  1095 			{
  1102 			TPtr8 dataDesc((TUint8*) currentOperation.iReadWriteArgs.iData + currentOperation.iReadWriteArgs.iOffset, len, len);
  1096 			TPtr8 dataDesc((TUint8*) currentOperation.iReadWriteArgs.iData + currentOperation.iReadWriteArgs.iOffset, len, len);
  1103 
  1097 			const RLocalMessage msg;
  1104 			// save the client's RMessage2
  1098 			TRAP(r,file->WriteL(pos, len, &dataDesc, msg, 0));
  1105 			const RMessage2 msgClient = aRequest->Message();
       
  1106 			
       
  1107 			// overwrite RMessage2 in CFsMessageRequest with RLocalMessage 
       
  1108 			const RLocalMessage msgLocal;					
       
  1109 			const_cast<RMessage2&> (aRequest->Message()) = msgLocal;
       
  1110 
       
  1111 			TRAP(r,file->WriteL(pos, len, &dataDesc, aRequest->Message(), 0));
       
  1112 							
       
  1113 			// restore the client's RMessage2
       
  1114 			const_cast<RMessage2&> (aRequest->Message()) = msgClient;
       
  1115 			}
  1099 			}
  1116 		}
  1100 		}
  1117 
  1101 
  1118 //RDebug::Print(_L("WriteR: req %08X pos %ld\t len %d file %08X\n"), aRequest, pos, len, file);
  1102 //RDebug::Print(_L("WriteR: req %08X pos %ld\t len %d file %08X\n"), aRequest, pos, len, file);
  1119 
  1103 
  1581 	if((!(share->IsFileModeBig())) && ((TUint64)size > KMaxLegacyFileSize))
  1565 	if((!(share->IsFileModeBig())) && ((TUint64)size > KMaxLegacyFileSize))
  1582 		return (KErrTooBig);
  1566 		return (KErrTooBig);
  1583 	
  1567 	
  1584 	CFileCB& file=share->File();
  1568 	CFileCB& file=share->File();
  1585 
  1569 
       
  1570 	// flush the write cache
       
  1571 	CFileCache* fileCache = share->File().FileCache();
       
  1572 	if (fileCache && (r = fileCache->FlushDirty(aRequest)) != CFsRequest::EReqActionComplete)
       
  1573 		return r;
       
  1574 	
  1586 	if (size==file.Size64())
  1575 	if (size==file.Size64())
  1587 		{
       
  1588 		file.SetCachedSize64(size);	// Ensure the cache size doesn't exceeed the physical size
       
  1589 		return(KErrNone);
  1576 		return(KErrNone);
  1590 		}
       
  1591 	
  1577 	
  1592 	TBool fileHasGrown = size > file.Size64();
  1578 	TBool fileHasGrown = size > file.Size64();
  1593 	if (fileHasGrown)
  1579 	if (fileHasGrown)
  1594 		{
  1580 		{
  1595 		r = CheckDiskSpace(size - file.Size64(), aRequest);
  1581 		r = CheckDiskSpace(size - file.Size64(), aRequest);
  1639 	__PRINT(_L("TFsFileAtt::DoRequestL(CFsRequest* aRequest)"));
  1625 	__PRINT(_L("TFsFileAtt::DoRequestL(CFsRequest* aRequest)"));
  1640 
  1626 
  1641 	CFileShare* share=(CFileShare*)aRequest->ScratchValue();
  1627 	CFileShare* share=(CFileShare*)aRequest->ScratchValue();
  1642 //	TInt att=(TInt)aRequest->FileShare()->File().Att()&KEntryAttMaskSupported;
  1628 //	TInt att=(TInt)aRequest->FileShare()->File().Att()&KEntryAttMaskSupported;
  1643 	TInt att=(TInt)share->File().Att();	// DRM: let ROM XIP attribute through
  1629 	TInt att=(TInt)share->File().Att();	// DRM: let ROM XIP attribute through
  1644 	att&= ~KEntryAttModified;	// this is an internal attribute and should not be returned to the client
       
  1645 	TPtrC8 pA((TUint8*)&att,sizeof(TInt));
  1630 	TPtrC8 pA((TUint8*)&att,sizeof(TInt));
  1646 	aRequest->WriteL(KMsgPtr0,pA);
  1631 	aRequest->WriteL(KMsgPtr0,pA);
  1647 	
  1632 	
  1648     return(KErrNone);
  1633     return(KErrNone);
  1649 	}
  1634 	}
  1679     TUint setAttMask=(TUint)(aRequest->Message().Int0());
  1664     TUint setAttMask=(TUint)(aRequest->Message().Int0());
  1680 	TUint clearAttMask=(TUint)aRequest->Message().Int1();
  1665 	TUint clearAttMask=(TUint)aRequest->Message().Int1();
  1681 	ValidateAtts(setAttMask,clearAttMask);
  1666 	ValidateAtts(setAttMask,clearAttMask);
  1682 
  1667 
  1683 	TRACE5(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryL, EF32TraceUidFileSys, &share->File(), 0, 0, setAttMask,clearAttMask);
  1668 	TRACE5(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryL, EF32TraceUidFileSys, &share->File(), 0, 0, setAttMask,clearAttMask);
  1684 	TRAP(r,share->File().SetEntryL(share->File().Modified(),setAttMask,clearAttMask))
  1669 	TRAP(r,share->File().SetEntryL(TTime(0),setAttMask,clearAttMask))
  1685 	TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryLRet, EF32TraceUidFileSys, r);
  1670 	TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryLRet, EF32TraceUidFileSys, r);
  1686 
  1671 
  1687 	return(r);
  1672 	return(r);
  1688 	}
  1673 	}
  1689 
  1674 
  1788 		}
  1773 		}
  1789 	
  1774 	
  1790     TTime time;
  1775     TTime time;
  1791 	TPtr8 t((TUint8*)&time,sizeof(TTime));
  1776 	TPtr8 t((TUint8*)&time,sizeof(TTime));
  1792 	aRequest->ReadL(KMsgPtr0,t);
  1777 	aRequest->ReadL(KMsgPtr0,t);
  1793 	TUint setAttMask=(TUint)(aRequest->Message().Int1());
  1778 	TUint setAttMask=(TUint)(aRequest->Message().Int1()|KEntryAttModified);
  1794 	TUint clearAttMask=(TUint)aRequest->Message().Int2();
  1779 	TUint clearAttMask=(TUint)aRequest->Message().Int2();
  1795 	ValidateAtts(setAttMask,clearAttMask);//	Validate attributes
  1780 	ValidateAtts(setAttMask,clearAttMask);//	Validate attributes
  1796 
  1781 
  1797 	TRACE5(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryL, EF32TraceUidFileSys, &share->File(), 0, 0, setAttMask,clearAttMask);
  1782 	TRACE5(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryL, EF32TraceUidFileSys, &share->File(), 0, 0, setAttMask,clearAttMask);
  1798 	TRAP(r,share->File().SetEntryL(time,setAttMask|KEntryAttModified,clearAttMask))
  1783 	TRAP(r,share->File().SetEntryL(time,setAttMask,clearAttMask))
  1799 	TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryLRet, EF32TraceUidFileSys, r);
  1784 	TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryLRet, EF32TraceUidFileSys, r);
  1800 
  1785 
  1801 	return(r);
  1786 	return(r);
  1802 	}
  1787 	}
  1803 
  1788 
  3637 
  3622 
  3638 
  3623 
  3639 
  3624 
  3640 
  3625 
  3641 
  3626 
  3642 EXPORT_C TBool CFileCB::DirectIOMode(const RMessagePtr2& aMessage)
  3627 
  3643 	{
  3628 
  3644 	CFsMessageRequest* msgRequest = CFsMessageRequest::RequestFromMessage(aMessage);
  3629 
  3645 
  3630 
  3646 	TInt func = msgRequest->Operation()->Function();
  3631 
  3647 	ASSERT(func == EFsFileRead || func == EFsFileWrite || func == EFsFileWriteDirty  || func == EFsReadFileSection);
  3632 
  3648 
  3633 
  3649 	CFileShare* share;
  3634 
  3650 	CFileCB* file;
  3635 
  3651 	GetFileFromScratch(msgRequest, share, file);
  3636 
  3652 	if (share == NULL)		// no share indicates this is a request originating from the file cache
       
  3653 		return EFalse;
       
  3654 
       
  3655 	return func == EFsFileRead ? share->iMode & EFileReadDirectIO : share->iMode & EFileWriteDirectIO; 
       
  3656 	}
       
  3657 
       
  3658 
       
  3659 
       
  3660 
       
  3661 
       
  3662 
       
  3663