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 |