Cleanup: add a file system call which captures the file metadata at once.
authorkinuko@chromium.org <kinuko@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 May 2012 06:40:17 +0000 (06:40 +0000)
committerkinuko@chromium.org <kinuko@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 May 2012 06:40:17 +0000 (06:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=86995

Reviewed by David Levin.

Source/Platform:

* Platform.gypi: Added an entry for WebFileInfo.h.
* chromium/public/WebFileInfo.h: Renamed from Source/WebKit/chromium/public/WebFileInfo.h.
(WebKit::WebFileInfo::WebFileInfo):
* chromium/public/WebFileUtilities.h:
(WebKit):
(WebKit::WebFileUtilities::getFileInfo): Added.

Source/WebCore:

Current File.slice() (webkitSlice()) implementation calls two separate platform calls,
getFileSize() and getFileModificationTime() [both are defined in platform/FileSystem.h],
to capture the file metadata, but we should have a single file system call to get them at once
for two reasons: 1. save additional system call costs, and 2.  atomically obtain the file metadata.

No new tests: existing tests (http/tests/local/fileapi/* and fast/files/*) should pass.

* fileapi/File.cpp:
(WebCore::File::captureSnapshot):
* platform/FileMetadata.h:
* platform/FileSystem.h:
* platform/chromium/FileSystemChromium.cpp:
(WebCore::getFileMetadata): Added.
* platform/chromium/PlatformSupport.h:
(PlatformSupport):
* platform/gtk/FileSystemGtk.cpp:
(WebCore::getFileMetadata): Added.
* platform/posix/FileSystemPOSIX.cpp:
(WebCore::getFileMetadata): Added.
* platform/qt/FileSystemQt.cpp:
(WebCore::getFileMetadata): Added.
* platform/win/FileSystemWin.cpp:
(WebCore::getFileSizeFromFindData):
(WebCore::getFileModificationTimeFromFindData):
(WebCore::getFileSize):
(WebCore::getFileModificationTime):
(WebCore::getFileMetadata): Added.
* platform/wince/FileSystemWinCE.cpp:
(WebCore::getFileSizeFromFileInfo):
(WebCore::getFileModificationTimeFromFileInfo):
(WebCore::getFileSize):
(WebCore::getFileModificationTime):
(WebCore::getFileMetadata): Added.
* platform/wx/FileSystemWx.cpp:
(WebCore::getFileMetadata): Added.
(WebCore):

Source/WebKit/chromium:

* src/PlatformSupport.cpp:
(WebCore::PlatformSupport::getFileMetadata):
(WebCore):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@118481 268f45cc-cd09-0410-ab3c-d52691b4dbfc

20 files changed:
Source/Platform/ChangeLog
Source/Platform/Platform.gypi
Source/Platform/chromium/public/WebFileInfo.h [new file with mode: 0644]
Source/Platform/chromium/public/WebFileUtilities.h
Source/WebCore/ChangeLog
Source/WebCore/fileapi/File.cpp
Source/WebCore/platform/FileMetadata.h
Source/WebCore/platform/FileSystem.h
Source/WebCore/platform/chromium/FileSystemChromium.cpp
Source/WebCore/platform/chromium/PlatformSupport.h
Source/WebCore/platform/gtk/FileSystemGtk.cpp
Source/WebCore/platform/posix/FileSystemPOSIX.cpp
Source/WebCore/platform/qt/FileSystemQt.cpp
Source/WebCore/platform/win/FileSystemWin.cpp
Source/WebCore/platform/wince/FileSystemWinCE.cpp
Source/WebCore/platform/wx/FileSystemWx.cpp
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/WebKit.gyp
Source/WebKit/chromium/public/WebFileInfo.h
Source/WebKit/chromium/src/PlatformSupport.cpp

index 3c89a1e..f46aee5 100644 (file)
@@ -1,3 +1,17 @@
+2012-05-21  Kinuko Yasuda  <kinuko@chromium.org>
+
+        Cleanup: add a file system call which captures the file metadata at once.
+        https://bugs.webkit.org/show_bug.cgi?id=86995
+
+        Reviewed by David Levin.
+
+        * Platform.gypi: Added an entry for WebFileInfo.h.
+        * chromium/public/WebFileInfo.h: Renamed from Source/WebKit/chromium/public/WebFileInfo.h.
+        (WebKit::WebFileInfo::WebFileInfo):
+        * chromium/public/WebFileUtilities.h:
+        (WebKit):
+        (WebKit::WebFileUtilities::getFileInfo): Added.
+
 2012-05-24  Antoine Labour  <piman@chromium.org>
 
         [chromium] Add a setForceRenderSurface to WebLayer for test/bench purpose
index 5d702f0..9f89c02 100644 (file)
@@ -48,6 +48,7 @@
             'chromium/public/WebData.h',
             'chromium/public/WebDragData.h',
             'chromium/public/WebExternalTextureLayer.h',
+            'chromium/public/WebFileInfo.h',
             'chromium/public/WebFileSystem.h',
             'chromium/public/WebFileUtilities.h',
             'chromium/public/WebFilterOperation.h',
diff --git a/Source/Platform/chromium/public/WebFileInfo.h b/Source/Platform/chromium/public/WebFileInfo.h
new file mode 100644 (file)
index 0000000..d326e06
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebFileInfo_h
+#define WebFileInfo_h
+
+#include "WebString.h"
+
+namespace WebKit {
+
+struct WebFileInfo {
+    // The last modification time of the file, in seconds.
+    // The value 0.0 means that the time is not set.
+    double modificationTime;
+
+    // The length of the file in bytes.
+    // The value -1 means that the length is not set.
+    long long length;
+
+    enum Type {
+        TypeUnknown = 0,
+        TypeFile,
+        TypeDirectory
+    };
+
+    Type type;
+
+    WebString platformPath;
+
+    WebFileInfo() : modificationTime(0.0), length(-1), type(TypeUnknown) { }
+};
+
+} // namespace WebKit
+
+#endif
index 0e270d7..d9017f2 100644 (file)
@@ -41,6 +41,8 @@ typedef void *HANDLE;
 
 namespace WebKit {
 
+struct WebFileInfo;
+
 class WebFileUtilities {
 public:
 #ifdef WIN32
@@ -51,8 +53,10 @@ public:
     virtual bool fileExists(const WebString& path) { return false; }
     virtual bool deleteFile(const WebString& path) { return false; }
     virtual bool deleteEmptyDirectory(const WebString& path) { return false; }
+    // FIXME: Deprecate getFileSize and getFileModificationTime once getFileInfo is implemented.
     virtual bool getFileSize(const WebString& path, long long& result) { return false; }
     virtual bool getFileModificationTime(const WebString& path, double& result) { return false; }
+    virtual bool getFileInfo(const WebString& path, WebFileInfo& result) { return false; }
     virtual WebString directoryName(const WebString& path)  { return WebString(); }
     virtual WebString pathByAppendingComponent(const WebString& path, const WebString& component)  { return WebString(); }
     virtual bool makeAllDirectories(const WebString& path) { return false; }
index c23e76d..7b3b52e 100644 (file)
@@ -1,3 +1,47 @@
+2012-05-21  Kinuko Yasuda  <kinuko@chromium.org>
+
+        Cleanup: add a file system call which captures the file metadata at once.
+        https://bugs.webkit.org/show_bug.cgi?id=86995
+
+        Reviewed by David Levin.
+
+        Current File.slice() (webkitSlice()) implementation calls two separate platform calls,
+        getFileSize() and getFileModificationTime() [both are defined in platform/FileSystem.h],
+        to capture the file metadata, but we should have a single file system call to get them at once
+        for two reasons: 1. save additional system call costs, and 2.  atomically obtain the file metadata.
+
+        No new tests: existing tests (http/tests/local/fileapi/* and fast/files/*) should pass.
+
+        * fileapi/File.cpp:
+        (WebCore::File::captureSnapshot):
+        * platform/FileMetadata.h:
+        * platform/FileSystem.h:
+        * platform/chromium/FileSystemChromium.cpp:
+        (WebCore::getFileMetadata): Added.
+        * platform/chromium/PlatformSupport.h:
+        (PlatformSupport):
+        * platform/gtk/FileSystemGtk.cpp:
+        (WebCore::getFileMetadata): Added.
+        * platform/posix/FileSystemPOSIX.cpp:
+        (WebCore::getFileMetadata): Added.
+        * platform/qt/FileSystemQt.cpp:
+        (WebCore::getFileMetadata): Added.
+        * platform/win/FileSystemWin.cpp:
+        (WebCore::getFileSizeFromFindData):
+        (WebCore::getFileModificationTimeFromFindData):
+        (WebCore::getFileSize):
+        (WebCore::getFileModificationTime):
+        (WebCore::getFileMetadata): Added.
+        * platform/wince/FileSystemWinCE.cpp:
+        (WebCore::getFileSizeFromFileInfo):
+        (WebCore::getFileModificationTimeFromFileInfo):
+        (WebCore::getFileSize):
+        (WebCore::getFileModificationTime):
+        (WebCore::getFileMetadata): Added.
+        * platform/wx/FileSystemWx.cpp:
+        (WebCore::getFileMetadata): Added.
+        (WebCore):
+
 2012-05-24  Hironori Bono  <hbono@chromium.org>
 
         Enable grammar checking on Chromium when we paste text (Take 2)
index f2afa34..0980848 100644 (file)
@@ -169,13 +169,15 @@ void File::captureSnapshot(long long& snapshotSize, double& snapshotModification
 
     // Obtains a snapshot of the file by capturing its current size and modification time. This is used when we slice a file for the first time.
     // If we fail to retrieve the size or modification time, probably due to that the file has been deleted, 0 size is returned.
-    // FIXME: Combine getFileSize and getFileModificationTime into one file system call.
-    time_t modificationTime;
-    if (!getFileSize(m_path, snapshotSize) || !getFileModificationTime(m_path, modificationTime)) {
+    FileMetadata metadata;
+    if (!getFileMetadata(m_path, metadata)) {
         snapshotSize = 0;
         snapshotModificationTime = 0;
-    } else
-        snapshotModificationTime = modificationTime;
+        return;
+    }
+
+    snapshotSize = metadata.length;
+    snapshotModificationTime = metadata.modificationTime;
 }
 
 } // namespace WebCore
index 99fe2f3..04df92c 100644 (file)
@@ -33,8 +33,6 @@
 
 #include <wtf/text/WTFString.h>
 
-#if ENABLE(FILE_SYSTEM)
-
 namespace WebCore {
 
 struct FileMetadata {
@@ -54,13 +52,13 @@ struct FileMetadata {
 
     Type type;
 
+#if ENABLE(FILE_SYSTEM)
     String platformPath;
+#endif
 
     FileMetadata() : modificationTime(0.0), length(-1), type(TypeUnknown) { }
 };
 
 } // namespace WebCore
 
-#endif // ENABLE(FILE_SYSTEM)
-
 #endif // FileMetadata_h
index 42d7500..21ece11 100644 (file)
@@ -151,11 +151,14 @@ static const char PlatformFilePathSeparator = '\\';
 static const char PlatformFilePathSeparator = '/';
 #endif
 
+struct FileMetadata;
+
 bool fileExists(const String&);
 bool deleteFile(const String&);
 bool deleteEmptyDirectory(const String&);
 bool getFileSize(const String&, long long& result);
 bool getFileModificationTime(const String&, time_t& result);
+bool getFileMetadata(const String&, FileMetadata&);
 String pathByAppendingComponent(const String& path, const String& component);
 bool makeAllDirectories(const String& path);
 String homeDirectoryPath();
index a32515b..3c5a534 100644 (file)
@@ -31,6 +31,7 @@
 #include "config.h"
 #include "FileSystem.h"
 
+#include "FileMetadata.h"
 #include "NotImplemented.h"
 #include "PlatformString.h"
 #include "PlatformSupport.h"
@@ -57,6 +58,19 @@ bool getFileModificationTime(const String& path, time_t& result)
     return PlatformSupport::getFileModificationTime(path, result);
 }
 
+bool getFileMetadata(const String& path, FileMetadata& metadata)
+{
+    // FIXME: Call PlatformSupport::getFileMetadata once it is implemented.
+    // return PlatformSupport::getFileMetadata(path, metadata);
+    if (!PlatformSupport::getFileSize(path, metadata.length))
+        return false;
+    time_t modificationTime;
+    if (!PlatformSupport::getFileModificationTime(path, modificationTime))
+        return false;
+    metadata.modificationTime = modificationTime;
+    return true;
+}
+
 String directoryName(const String& path)
 {
     return PlatformSupport::directoryName(path);
index f29baf8..6398699 100644 (file)
@@ -128,6 +128,7 @@ public:
     static bool deleteEmptyDirectory(const String&);
     static bool getFileSize(const String&, long long& result);
     static bool getFileModificationTime(const String&, time_t& result);
+    static bool getFileMetadata(const String&, FileMetadata& result);
     static String directoryName(const String& path);
     static String pathByAppendingComponent(const String& path, const String& component);
     static bool makeAllDirectories(const String& path);
index a3b448d..4235dc4 100644 (file)
 #include "config.h"
 #include "FileSystem.h"
 
-#include <wtf/gobject/GOwnPtr.h>
+#include "FileMetadata.h"
 #include "PlatformString.h"
 #include "UUID.h"
 #include <gio/gio.h>
 #include <glib.h>
 #include <glib/gstdio.h>
-#include <wtf/gobject/GlibUtilities.h>
+#include <wtf/gobject/GOwnPtr.h>
 #include <wtf/gobject/GRefPtr.h>
+#include <wtf/gobject/GlibUtilities.h>
 #include <wtf/text/CString.h>
 
 namespace WebCore {
@@ -141,6 +142,24 @@ bool getFileModificationTime(const String& path, time_t& modifiedTime)
 
 }
 
+bool getFileMetadata(const String& path, FileMetadata& metadata)
+{
+    CString filename = fileSystemRepresentation(path);
+    if (filename.isNull())
+        return false;
+
+    struct stat statResult;
+    gint result = g_stat(filename.data(), &statResult);
+    if (result)
+        return false;
+
+    metadata.modificationTime = statResult.st_mtime;
+    metadata.length = statResult.st_size;
+    metadata.type = S_ISDIR(statResult.st_mode) ? FileMetadata::TypeDirectory : FileMetadata::TypeFile;
+    return true;
+
+}
+
 String pathByAppendingComponent(const String& path, const String& component)
 {
     if (path.endsWith(G_DIR_SEPARATOR_S))
index fda8126..37a45d1 100644 (file)
@@ -29,6 +29,7 @@
 #include "config.h"
 #include "FileSystem.h"
 
+#include "FileMetadata.h"
 #include "PlatformString.h"
 #include <dirent.h>
 #include <errno.h>
@@ -181,6 +182,23 @@ bool getFileModificationTime(const String& path, time_t& result)
     return true;
 }
 
+bool getFileMetadata(const String& path, FileMetadata& metadata)
+{
+    CString fsRep = fileSystemRepresentation(path);
+
+    if (!fsRep.data() || fsRep.data()[0] == '\0')
+        return false;
+
+    struct stat fileInfo;
+    if (stat(fsRep.data(), &fileInfo))
+        return false;
+
+    metadata.modificationTime = fileInfo.st_mtime;
+    metadata.length = fileInfo.st_size;
+    metadata.type = S_ISDIR(fileInfo.st_mode) ? FileMetadata::TypeDirectory : FileMetadata::TypeFile;
+    return true;
+}
+
 String pathByAppendingComponent(const String& path, const String& component)
 {
     if (path.endsWith('/'))
index 32644d1..9a80114 100644 (file)
@@ -33,6 +33,7 @@
 #include "config.h"
 #include "FileSystem.h"
 
+#include "FileMetadata.h"
 #include "PlatformString.h"
 #include <QDateTime>
 #include <QDir>
@@ -73,6 +74,17 @@ bool getFileModificationTime(const String& path, time_t& result)
     return info.exists();
 }
 
+bool getFileMetadata(const String& path, FileMetadata& result)
+{
+    QFileInfo info(path);
+    if (!info.exists())
+        return false;
+    result.modificationTime = info.lastModified().toTime_t();
+    result.length = info.size();
+    result.type = info.isDir() ? FileMetadata::TypeDirectory : FileMetadata::TypeFile;
+    return true;
+}
+
 bool makeAllDirectories(const String& path)
 {
     return QDir::root().mkpath(path);
index 4ce5187..ee0255e 100644 (file)
@@ -30,6 +30,7 @@
 #include "config.h"
 #include "FileSystem.h"
 
+#include "FileMetadata.h"
 #include "NotImplemented.h"
 #include "PathWalker.h"
 #include <wtf/CryptographicallyRandomNumber.h>
@@ -54,12 +55,8 @@ static bool getFindData(String path, WIN32_FIND_DATAW& findData)
     return true;
 }
 
-bool getFileSize(const String& path, long long& result)
+static bool getFileSizeFromFindData(const WIN32_FIND_DATAW& findData, long long& size)
 {
-    WIN32_FIND_DATAW findData;
-    if (!getFindData(path, findData))
-        return false;
-
     ULARGE_INTEGER fileSize;
     fileSize.HighPart = findData.nFileSizeHigh;
     fileSize.LowPart = findData.nFileSizeLow;
@@ -67,22 +64,54 @@ bool getFileSize(const String& path, long long& result)
     if (fileSize.QuadPart > static_cast<ULONGLONG>(std::numeric_limits<long long>::max()))
         return false;
 
-    result = fileSize.QuadPart;
+    size = fileSize.QuadPart;
     return true;
 }
 
-bool getFileModificationTime(const String& path, time_t& result)
+static void getFileModificationTimeFromFindData(const WIN32_FIND_DATAW& findData, time_t& time)
+{
+    ULARGE_INTEGER fileTime;
+    fileTime.HighPart = findData.ftLastWriteTime.dwHighDateTime;
+    fileTime.LowPart = findData.ftLastWriteTime.dwLowDateTime;
+
+    // Information about converting time_t to FileTime is available at http://msdn.microsoft.com/en-us/library/ms724228%28v=vs.85%29.aspx
+    time = fileTime.QuadPart / 10000000 - kSecondsFromFileTimeToTimet;
+}
+
+bool getFileSize(const String& path, long long& size)
 {
     WIN32_FIND_DATAW findData;
     if (!getFindData(path, findData))
         return false;
 
-    ULARGE_INTEGER fileSize;
-    fileSize.HighPart = findData.ftLastWriteTime.dwHighDateTime;
-    fileSize.LowPart = findData.ftLastWriteTime.dwLowDateTime;
+    return getFileSizeFromFindData(findData, size);
+}
+
+bool getFileModificationTime(const String& path, time_t& time)
+{
+    WIN32_FIND_DATAW findData;
+    if (!getFindData(path, findData))
+        return false;
+
+    getFileModificationTimeFromFindData(findData, time);
+    return true;
+}
+
+bool getFileMetadata(const String& path, FileMetadata& metadata)
+{
+    WIN32_FIND_DATAW findData;
+    if (!getFindData(path, findData))
+        return false;
+
+    if (!getFileSizeFromFindData(findData, metadata.length))
+        return false;
+
+    time_t modificationTime;
+    getFileModificationTimeFromFindData(findData, modificationTime);
+    metadata.modificationTime = modificationTime;
+
+    metadata.type = (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? FileMetadata::TypeDirectory : FileMetadata::TypeFile;
 
-    // Information about converting time_t to FileTime is available at http://msdn.microsoft.com/en-us/library/ms724228%28v=vs.85%29.aspx
-    result = fileSize.QuadPart / 10000000 - kSecondsFromFileTimeToTimet;
     return true;
 }
 
index 4c7a1df..fb507c0 100644 (file)
@@ -31,6 +31,7 @@
 #include "config.h"
 #include "FileSystem.h"
 
+#include "FileMetadata.h"
 #include "NotImplemented.h"
 #include <wincrypt.h>
 #include <windows.h>
@@ -68,31 +69,54 @@ static bool getFileInfo(const String& path, BY_HANDLE_FILE_INFORMATION& fileInfo
     return rtn;
 }
 
-bool getFileSize(const String& path, long long& result)
+static void getFileSizeFromFileInfo(const BY_HANDLE_FILE_INFORMATION& fileInfo, long long& size)
+{
+    ULARGE_INTEGER fileSize;
+    fileSize.LowPart = fileInfo.nFileSizeLow;
+    fileSize.HighPart = fileInfo.nFileSizeHigh;
+    size = fileSize.QuadPart;
+}
+
+static void getFileModificationTimeFromFileInfo(const BY_HANDLE_FILE_INFORMATION& fileInfo, time_t& time)
+{
+    ULARGE_INTEGER t;
+    memcpy(&t, &fileInfo.ftLastWriteTime, sizeof(t));
+    time = t.QuadPart * 0.0000001 - 11644473600.0;
+}
+
+bool getFileSize(const String& path, long long& size)
 {
     BY_HANDLE_FILE_INFORMATION fileInformation;
     if (!getFileInfo(path, fileInformation))
         return false;
 
-    ULARGE_INTEGER fileSize;
-    fileSize.LowPart = fileInformation.nFileSizeLow;
-    fileSize.HighPart = fileInformation.nFileSizeHigh;
+    getFileSizeFromFileInfo(fileInformation, size);
+    return true;
+}
 
-    result = fileSize.QuadPart;
+bool getFileModificationTime(const String& path, time_t& time)
+{
+    BY_HANDLE_FILE_INFORMATION fileInformation;
+    if (!getFileInfo(path, fileInformation))
+        return false;
 
+    getFileModificationTimeFromFileInfo(fileInformation, time);
     return true;
 }
 
-bool getFileModificationTime(const String& path, time_t& result)
+bool getFileMetadata(const String& path, FileMetadata& metadata)
 {
     BY_HANDLE_FILE_INFORMATION fileInformation;
     if (!getFileInfo(path, fileInformation))
         return false;
 
-    ULARGE_INTEGER t;
-    memcpy(&t, &fileInformation.ftLastWriteTime, sizeof(t));
-    
-    result = t.QuadPart * 0.0000001 - 11644473600.0;
+    getFileSizeFromFileInfo(fileInformation, metadata.length);
+
+    time_t modificationTime;
+    getFileModificationTimeFromFileInfo(fileInformation, modificationTime);
+    metadata.modificationTime = modificationTime;
+
+    metadata.type = (fileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? FileMetadata::TypeDirectory : FileMetadata::TypeFile;
 
     return true;
 }
index bbec9fe..1a2edd5 100644 (file)
@@ -30,6 +30,7 @@
 #include "config.h"
 #include "FileSystem.h"
 
+#include "FileMetadata.h"
 #include <wx/wx.h>
 #include <wx/datetime.h>
 #include <wx/dir.h>
@@ -85,6 +86,17 @@ bool getFileModificationTime(const String& path, time_t& t)
     return false;
 }
 
+bool getFileMetadata(const String& path, FileMetadata& metadata)
+{
+    if (!wxFileExists(path))
+        return false;
+    wxFileName fileName(path);
+    metadata.length = fileName.GetSize();
+    metadata.modificationTime = fileName.GetModificationTime().GetTicks();
+    metadata.type = fileName.IsDir() ? FileMetadata::TypeDirectory : FileMetadata::TypeFile;
+    return true;
+}
+
 bool makeAllDirectories(const String& path)
 {
     return wxFileName::Mkdir(path, 0777, wxPATH_MKDIR_FULL);
index a872fe3..2470114 100644 (file)
@@ -1,3 +1,14 @@
+2012-05-21  Kinuko Yasuda  <kinuko@chromium.org>
+
+        Cleanup: add a file system call which captures the file metadata at once.
+        https://bugs.webkit.org/show_bug.cgi?id=86995
+
+        Reviewed by David Levin.
+
+        * src/PlatformSupport.cpp:
+        (WebCore::PlatformSupport::getFileMetadata):
+        (WebCore):
+
 2012-05-24  Hironori Bono  <hbono@chromium.org>
 
         Enable grammar checking on Chromium when we paste text  (Take 2)
index 28591f5..b657c25 100644 (file)
                 'public/WebFileChooserCompletion.h',
                 'public/WebFileChooserParams.h',
                 'public/WebFileError.h',
-                'public/WebFileInfo.h',
                 'public/WebFileSystemCallbacks.h',
                 'public/WebFileSystemEntry.h',
                 'public/WebFileWriter.h',
index bf152fe..a8c1bba 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2012 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WebFileInfo_h
-#define WebFileInfo_h
-
-#include "platform/WebString.h"
-
-namespace WebKit {
-
-struct WebFileInfo {
-    // The last modification time of the file, in seconds.
-    // The value 0.0 means that the time is not set.
-    double modificationTime;
-
-    // The length of the file in bytes.
-    // The value -1 means that the length is not set.
-    long long length;
-
-    enum Type {
-        TypeUnknown = 0,
-        TypeFile,
-        TypeDirectory
-    };
-
-    Type type;
-
-    WebString platformPath;
-
-    WebFileInfo() : modificationTime(0.0), length(-1), type(TypeUnknown) { }
-};
-
-} // namespace WebKit
-
-#endif
+#include "../../../Platform/chromium/public/WebFileInfo.h"
index 98c43ad..fb06ccd 100644 (file)
@@ -35,7 +35,9 @@
 
 #include "Chrome.h"
 #include "ChromeClientImpl.h"
+#include "FileMetadata.h"
 #include "Page.h"
+#include "WebFileInfo.h"
 #include "WebFileUtilities.h"
 #include "WebFrameClient.h"
 #include "WebFrameImpl.h"
@@ -329,6 +331,17 @@ bool PlatformSupport::getFileModificationTime(const String& path, time_t& result
     return true;
 }
 
+bool PlatformSupport::getFileMetadata(const String& path, FileMetadata& result)
+{
+    WebFileInfo webFileInfo;
+    if (!webKitPlatformSupport()->fileUtilities()->getFileInfo(path, webFileInfo))
+        return false;
+    result.modificationTime = webFileInfo.modificationTime;
+    result.length = webFileInfo.length;
+    result.type = static_cast<FileMetadata::Type>(webFileInfo.type);
+    return true;
+}
+
 String PlatformSupport::directoryName(const String& path)
 {
     return WebKit::Platform::current()->fileUtilities()->directoryName(path);