mtpdataproviders/mtpimagedp/src/cmtpimagedpsendobjectinfo.cpp
changeset 29 3ae5cb0b4c02
parent 18 1b39655331a3
child 31 a26669f87b46
--- a/mtpdataproviders/mtpimagedp/src/cmtpimagedpsendobjectinfo.cpp	Mon May 03 13:19:02 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpsendobjectinfo.cpp	Fri Jun 25 16:54:01 2010 +0800
@@ -20,6 +20,7 @@
 
 #include <f32file.h>
 #include <bautils.h>
+#include <e32const.h>
 
 #include <mtp/mmtpdataproviderframework.h>
 
@@ -322,7 +323,11 @@
             {
             iStorageId = iFramework.StorageMgr().DefaultStorageId();
             }
-             
+        
+        if(IsTooLarge(iObjectSize))
+            {
+            *ret = EMTPRespCodeObjectTooLarge;
+            }
         }
     
     __FLOG(_L8("CMTPImageDpSendObjectInfo::CheckObjectPropListParamsL - Exit"));
@@ -608,6 +613,11 @@
     if (result)
         {
         iObjectSize = iObjectInfo->Uint32L(CMTPTypeObjectInfo::EObjectCompressedSize);
+        if(IsTooLarge(iObjectSize))
+            {
+            SendResponseL(EMTPRespCodeObjectTooLarge);
+            result = EFalse;
+            }
         }
 
     if (result)
@@ -743,6 +753,9 @@
     {
     __FLOG(_L8("CMTPImageDpSendObjectInfo::DoHandleSendObjectCompleteL - Entry"));    
     TBool result(ETrue);
+
+    delete iFileReceived;
+    iFileReceived = NULL;  
     
 #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
     TInt64 objectsize = 0;
@@ -750,8 +763,10 @@
     TInt objectsize = 0;
 #endif
     
-    iFileReceived->File().Size(objectsize);    
-    
+    TEntry entry;
+    User::LeaveIfError(iFramework.Fs().Entry(iFullPath, entry));
+    objectsize = entry.FileSize();
+   
     if (objectsize != iObjectSize)
         {
         __FLOG_VA((_L8("object sizes differ %lu != %lu"), objectsize, iObjectSize));
@@ -780,34 +795,31 @@
         if (iProtectionStatus ==  EMTPProtectionNoProtection ||
             iProtectionStatus == EMTPProtectionReadOnly)
             {
-            TUint attValue = 0;
-            User::LeaveIfError(iFileReceived->File().Att(attValue));
-            attValue &= ~(KEntryAttNormal | KEntryAttReadOnly);
-            
+            entry.iAtt &= ~(KEntryAttNormal | KEntryAttReadOnly);
             if (iProtectionStatus == EMTPProtectionNoProtection)
                 {                        
-                attValue |= KEntryAttNormal;
+                entry.iAtt |= KEntryAttNormal;
                 }
             else
                 {
-                attValue |= KEntryAttReadOnly;
+                entry.iAtt |= KEntryAttReadOnly;
                 }
-            User::LeaveIfError(iFileReceived->File().SetAtt(attValue, ~attValue));
+            User::LeaveIfError(iFramework.Fs().SetAtt(iFullPath, entry.iAtt, ~entry.iAtt));
             }
+
         TTime modifiedTime;
         //update datemodified property.
         if(iDateMod != NULL && iDateMod->Length())
            {           
            iObjectPropertyMgr.ConvertMTPTimeStr2TTimeL(*iDateMod, modifiedTime);
-           User::LeaveIfError(iFileReceived->File().SetModified(modifiedTime));
            }
         else if(iDateCreated != NULL && iDateCreated->Length())
            {
            iObjectPropertyMgr.ConvertMTPTimeStr2TTimeL(*iDateCreated, modifiedTime);
-           User::LeaveIfError(iFileReceived->File().SetModified(modifiedTime));
            }
-                                   
-	     iFramework.RouteRequestUnregisterL(iExpectedSendObjectRequest, iConnection);
+        User::LeaveIfError(iFramework.Fs().SetModified(iFullPath, modifiedTime));
+
+        iFramework.RouteRequestUnregisterL(iExpectedSendObjectRequest, iConnection);
         
         //The MTP spec states that it is not mandatory for SendObjectInfo/SendObjectPropList
         //to be followed by a SendObject.  An object is reserved in the ObjectStore on 
@@ -818,10 +830,8 @@
 		
         CleanUndoList();
         SendResponseL(EMTPRespCodeOK);
-	    }        
+	    }
     
-    delete iFileReceived;
-    iFileReceived = NULL;  
     
     iSuccessful = result;
     __FLOG(_L8("CMTPImageDpSendObjectInfo::DoHandleSendObjectCompleteL - Exit"));
@@ -869,7 +879,7 @@
      */
     TRAP_IGNORE(
             iFramework.ObjectMgr().RemoveObjectL(iReceivedObject->Uint(CMTPObjectMetaData::EHandle));
-            iObjectPropertyMgr.ClearCacheL();            
+            iObjectPropertyMgr.ClearCache(iReceivedObject->Uint(CMTPObjectMetaData::EHandle));            
             );
     }
 
@@ -1277,3 +1287,40 @@
         
     return resp;
     }
+
+/**
+Check if the object is too large
+@return ETrue if yes, otherwise EFalse
+*/
+TBool CMTPImageDpSendObjectInfo::IsTooLarge(TUint64 aObjectSize) const
+    {
+    __FLOG(_L8("IsTooLarge - Entry"));
+    TBool ret(aObjectSize > KMaxTInt64);
+    
+    if(!ret)
+        {
+        TBuf<255> fsname;
+        TUint32 storageId = iStorageId;
+        if (storageId == KMTPStorageDefault)
+            {
+            storageId = iFramework.StorageMgr().DefaultStorageId();
+            }
+        TInt drive( iFramework.StorageMgr().DriveNumber(storageId) );
+        if(drive != KErrNotFound)
+            {
+            iFramework.Fs().FileSystemSubType(drive, fsname);        
+        
+            const TUint64 KMaxFatFileSize = 0xFFFFFFFF; //Maximal file size supported by all FAT filesystems (4GB-1)
+            _LIT(KFsFAT16, "FAT16");
+            _LIT(KFsFAT32, "FAT32");
+        
+            if((fsname.CompareF(KFsFAT16) == 0 || fsname.CompareF(KFsFAT32) == 0) && aObjectSize > KMaxFatFileSize)
+                {
+                ret = ETrue;
+                }
+            }
+        }
+    __FLOG_VA((_L8("Result = %d"), ret));
+    __FLOG(_L8("IsTooLarge - Exit"));
+    return ret;
+    }