userlibandfileserver/fileserver/sfile/sf_file.cpp
branchRCL_3
changeset 42 a179b74831c9
parent 41 0ffb4e86fcc9
child 43 c1f20ce4abcf
equal deleted inserted replaced
41:0ffb4e86fcc9 42:a179b74831c9
   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 			const RLocalMessage msg;
   702 
   703 			TRAP(r,file->ReadL(pos, len, &dataDesc, msg, 0));
   703 			// save the client's RMessage2
       
   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;
   704 			}
   714 			}
   705 		}
   715 		}
   706 
   716 
   707 
   717 
   708 #if defined(_DEBUG) || defined(_DEBUG_RELEASE)
   718 #if defined(_DEBUG) || defined(_DEBUG_RELEASE)
   955 
   965 
   956     ASSERT(aFsOp == EFsFileWrite || aFsOp == EFsFileWriteDirty);
   966     ASSERT(aFsOp == EFsFileWrite || aFsOp == EFsFileWriteDirty);
   957     if(aFsOp == EFsFileWrite)
   967     if(aFsOp == EFsFileWrite)
   958         {//-- this call is originated from explicit file write operation. Set 'Archive' attribute and new file time.
   968         {//-- this call is originated from explicit file write operation. Set 'Archive' attribute and new file time.
   959         aFile->SetArchiveAttribute(); //-- it will also set KEntryAttModified
   969         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;
       
   964         }
   970         }
   965 
   971 
   966 
   972 
   967 	return KErrNone;
   973 	return KErrNone;
   968 	}
   974 	}
  1092 			TRAP(r,file->WriteL(pos, len, (const TPtrC8*) aRequest->Message().Ptr0(), aRequest->Message(), currentOperation.iReadWriteArgs.iOffset))
  1098 			TRAP(r,file->WriteL(pos, len, (const TPtrC8*) aRequest->Message().Ptr0(), aRequest->Message(), currentOperation.iReadWriteArgs.iOffset))
  1093 			}
  1099 			}
  1094 		else
  1100 		else
  1095 			{
  1101 			{
  1096 			TPtr8 dataDesc((TUint8*) currentOperation.iReadWriteArgs.iData + currentOperation.iReadWriteArgs.iOffset, len, len);
  1102 			TPtr8 dataDesc((TUint8*) currentOperation.iReadWriteArgs.iData + currentOperation.iReadWriteArgs.iOffset, len, len);
  1097 			const RLocalMessage msg;
  1103 
  1098 			TRAP(r,file->WriteL(pos, len, &dataDesc, msg, 0));
  1104 			// save the client's RMessage2
       
  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;
  1099 			}
  1115 			}
  1100 		}
  1116 		}
  1101 
  1117 
  1102 //RDebug::Print(_L("WriteR: req %08X pos %ld\t len %d file %08X\n"), aRequest, pos, len, file);
  1118 //RDebug::Print(_L("WriteR: req %08X pos %ld\t len %d file %08X\n"), aRequest, pos, len, file);
  1103 
  1119 
  1565 	if((!(share->IsFileModeBig())) && ((TUint64)size > KMaxLegacyFileSize))
  1581 	if((!(share->IsFileModeBig())) && ((TUint64)size > KMaxLegacyFileSize))
  1566 		return (KErrTooBig);
  1582 		return (KErrTooBig);
  1567 	
  1583 	
  1568 	CFileCB& file=share->File();
  1584 	CFileCB& file=share->File();
  1569 
  1585 
  1570 	// flush the write cache
       
  1571 	CFileCache* fileCache = share->File().FileCache();
       
  1572 	if (fileCache && (r = fileCache->FlushDirty(aRequest)) != CFsRequest::EReqActionComplete)
       
  1573 		return r;
       
  1574 	
       
  1575 	if (size==file.Size64())
  1586 	if (size==file.Size64())
       
  1587 		{
       
  1588 		file.SetCachedSize64(size);	// Ensure the cache size doesn't exceeed the physical size
  1576 		return(KErrNone);
  1589 		return(KErrNone);
       
  1590 		}
  1577 	
  1591 	
  1578 	TBool fileHasGrown = size > file.Size64();
  1592 	TBool fileHasGrown = size > file.Size64();
  1579 	if (fileHasGrown)
  1593 	if (fileHasGrown)
  1580 		{
  1594 		{
  1581 		r = CheckDiskSpace(size - file.Size64(), aRequest);
  1595 		r = CheckDiskSpace(size - file.Size64(), aRequest);
  1625 	__PRINT(_L("TFsFileAtt::DoRequestL(CFsRequest* aRequest)"));
  1639 	__PRINT(_L("TFsFileAtt::DoRequestL(CFsRequest* aRequest)"));
  1626 
  1640 
  1627 	CFileShare* share=(CFileShare*)aRequest->ScratchValue();
  1641 	CFileShare* share=(CFileShare*)aRequest->ScratchValue();
  1628 //	TInt att=(TInt)aRequest->FileShare()->File().Att()&KEntryAttMaskSupported;
  1642 //	TInt att=(TInt)aRequest->FileShare()->File().Att()&KEntryAttMaskSupported;
  1629 	TInt att=(TInt)share->File().Att();	// DRM: let ROM XIP attribute through
  1643 	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
  1630 	TPtrC8 pA((TUint8*)&att,sizeof(TInt));
  1645 	TPtrC8 pA((TUint8*)&att,sizeof(TInt));
  1631 	aRequest->WriteL(KMsgPtr0,pA);
  1646 	aRequest->WriteL(KMsgPtr0,pA);
  1632 	
  1647 	
  1633     return(KErrNone);
  1648     return(KErrNone);
  1634 	}
  1649 	}
  1664     TUint setAttMask=(TUint)(aRequest->Message().Int0());
  1679     TUint setAttMask=(TUint)(aRequest->Message().Int0());
  1665 	TUint clearAttMask=(TUint)aRequest->Message().Int1();
  1680 	TUint clearAttMask=(TUint)aRequest->Message().Int1();
  1666 	ValidateAtts(setAttMask,clearAttMask);
  1681 	ValidateAtts(setAttMask,clearAttMask);
  1667 
  1682 
  1668 	TRACE5(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryL, EF32TraceUidFileSys, &share->File(), 0, 0, setAttMask,clearAttMask);
  1683 	TRACE5(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryL, EF32TraceUidFileSys, &share->File(), 0, 0, setAttMask,clearAttMask);
  1669 	TRAP(r,share->File().SetEntryL(TTime(0),setAttMask,clearAttMask))
  1684 	TRAP(r,share->File().SetEntryL(share->File().Modified(),setAttMask,clearAttMask))
  1670 	TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryLRet, EF32TraceUidFileSys, r);
  1685 	TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryLRet, EF32TraceUidFileSys, r);
  1671 
  1686 
  1672 	return(r);
  1687 	return(r);
  1673 	}
  1688 	}
  1674 
  1689 
  1773 		}
  1788 		}
  1774 	
  1789 	
  1775     TTime time;
  1790     TTime time;
  1776 	TPtr8 t((TUint8*)&time,sizeof(TTime));
  1791 	TPtr8 t((TUint8*)&time,sizeof(TTime));
  1777 	aRequest->ReadL(KMsgPtr0,t);
  1792 	aRequest->ReadL(KMsgPtr0,t);
  1778 	TUint setAttMask=(TUint)(aRequest->Message().Int1()|KEntryAttModified);
  1793 	TUint setAttMask=(TUint)(aRequest->Message().Int1());
  1779 	TUint clearAttMask=(TUint)aRequest->Message().Int2();
  1794 	TUint clearAttMask=(TUint)aRequest->Message().Int2();
  1780 	ValidateAtts(setAttMask,clearAttMask);//	Validate attributes
  1795 	ValidateAtts(setAttMask,clearAttMask);//	Validate attributes
  1781 
  1796 
  1782 	TRACE5(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryL, EF32TraceUidFileSys, &share->File(), 0, 0, setAttMask,clearAttMask);
  1797 	TRACE5(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryL, EF32TraceUidFileSys, &share->File(), 0, 0, setAttMask,clearAttMask);
  1783 	TRAP(r,share->File().SetEntryL(time,setAttMask,clearAttMask))
  1798 	TRAP(r,share->File().SetEntryL(time,setAttMask|KEntryAttModified,clearAttMask))
  1784 	TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryLRet, EF32TraceUidFileSys, r);
  1799 	TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECFileCBSetEntryLRet, EF32TraceUidFileSys, r);
  1785 
  1800 
  1786 	return(r);
  1801 	return(r);
  1787 	}
  1802 	}
  1788 
  1803 
  3622 
  3637 
  3623 
  3638 
  3624 
  3639 
  3625 
  3640 
  3626 
  3641 
  3627 
  3642 EXPORT_C TBool CFileCB::DirectIOMode(const RMessagePtr2& aMessage)
  3628 
  3643 	{
  3629 
  3644 	CFsMessageRequest* msgRequest = CFsMessageRequest::RequestFromMessage(aMessage);
  3630 
  3645 
  3631 
  3646 	TInt func = msgRequest->Operation()->Function();
  3632 
  3647 	ASSERT(func == EFsFileRead || func == EFsFileWrite || func == EFsFileWriteDirty  || func == EFsReadFileSection);
  3633 
  3648 
  3634 
  3649 	CFileShare* share;
  3635 
  3650 	CFileCB* file;
  3636 
  3651 	GetFileFromScratch(msgRequest, share, file);
       
  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