diff -r 0ffb4e86fcc9 -r a179b74831c9 userlibandfileserver/fileserver/sfile/sf_drv.cpp --- a/userlibandfileserver/fileserver/sfile/sf_drv.cpp Thu Jul 15 20:11:42 2010 +0300 +++ b/userlibandfileserver/fileserver/sfile/sf_drv.cpp Thu Aug 19 11:14:22 2010 +0300 @@ -89,17 +89,13 @@ // Do not allow the entry type to be changed // { - const TUint KReadOnlySetAtts = KEntryAttVolume | - KEntryAttDir | - KEntryAttRemote; - - const TUint KReadOnlyClrAtts = KEntryAttVolume | - KEntryAttDir | - KEntryAttRemote | - KEntryAttModified; - - aSetAttMask &= ~KReadOnlySetAtts; - aClearAttMask &= ~KReadOnlyClrAtts; + const TUint KReadOnlyAtts = KEntryAttVolume | + KEntryAttDir | + KEntryAttRemote | + KEntryAttModified; + + aSetAttMask &= ~KReadOnlyAtts; + aClearAttMask &= ~KReadOnlyAtts; } void CheckForLeaveAfterOpenL(TInt leaveError, CFsRequest* aRequest, TInt aHandle) @@ -547,6 +543,19 @@ TRAP(r,CurrentMount().FinaliseMountL(aOperation, aParam1, aParam2)); TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECMountCBFinaliseMount2Ret, EF32TraceUidFileSys, r); + // Pass FinaliseDrive notification down to media driver + TInt driveNumber = DriveNumber(); + if (LocalDrives::IsValidDriveMapping(driveNumber) && !LocalDrives::IsProxyDrive(driveNumber)) + { + TBusLocalDrive& drv = LocalDrives::GetLocalDrive(driveNumber); + + TLocalDriveFinaliseInfoBuf finaliseBuf; + finaliseBuf().iMode = aOperation; + + // notify local drive, ignore the error + drv.QueryDevice(RLocalDrive::EQueryFinaliseDrive, finaliseBuf); + } + return r; } @@ -1235,6 +1244,31 @@ DriveNumber(), aName, I64LOW(aTime.Int64()), I64HIGH(aTime.Int64()), aSetAttMask, aClearAttMask); TRAP(r,CurrentMount().SetEntryL(entryName,aTime,aSetAttMask,aClearAttMask)) TRACERET1(UTF::EBorder, UTraceModuleFileSys::ECMountCBSetEntryLRet, EF32TraceUidFileSys, r); + // If the file is already open then write the file attributes directly to the file + TFileName foldedName; + TUint32 nameHash=0; + foldedName.CopyF(aName); + nameHash=CalcNameHash(foldedName); + + __CHECK_DRIVETHREAD(iDriveNumber); + TDblQueIter q(CurrentMount().iMountQ); + CMountCB* currentMount = &CurrentMount(); + CFileCB* file; + while ((file=q++)!=NULL) + { + if ((&file->Drive()==this) && + &file->Mount() == currentMount && + nameHash == file->NameHash() && + file->FileNameF().Match(foldedName)==KErrNone) + { + TUint att = file->Att(); + att |= aSetAttMask; + att &= ~aClearAttMask; + file->SetAtt(att | KEntryAttModified); + file->SetModified(aTime); + break; + } + } return(r); }