15ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen/*
25ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Copyright (C) 2008 Apple Inc. All Rights Reserved.
35ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *
45ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Redistribution and use in source and binary forms, with or without
55ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * modification, are permitted provided that the following conditions
65ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * are met:
75ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 1. Redistributions of source code must retain the above copyright
85ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *    notice, this list of conditions and the following disclaimer.
95ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright
105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *    notice, this list of conditions and the following disclaimer in the
115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *    documentation and/or other materials provided with the distribution.
125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *
135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen */
255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "config.h"
275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "File.h"
285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "FileSystem.h"
305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "MIMETypeRegistry.h"
31f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include <wtf/CurrentTime.h>
32f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include <wtf/text/WTFString.h>
335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsennamespace WebCore {
355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic PassOwnPtr<BlobData> createBlobDataForFile(const String& path)
375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    String type;
395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    int index = path.reverseFind('.');
405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (index != -1)
415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        type = MIMETypeRegistry::getMIMETypeForExtension(path.substring(index + 1));
425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    OwnPtr<BlobData> blobData = BlobData::create();
445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    blobData->setContentType(type);
455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    blobData->appendFile(path);
465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return blobData.release();
475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
4968513a70bcd92384395513322f1b801e7bf9c729Steve BlockFile::File(const String& path)
5068513a70bcd92384395513322f1b801e7bf9c729Steve Block    : Blob(createBlobDataForFile(path), -1)
515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_path(path)
525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_name(pathGetFileName(path))
535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
5668513a70bcd92384395513322f1b801e7bf9c729Steve BlockFile::File(const String& path, const KURL& url, const String& type)
5768513a70bcd92384395513322f1b801e7bf9c729Steve Block    : Blob(url, type, -1)
585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_path(path)
595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_name = pathGetFileName(path);
615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(DIRECTORY_UPLOAD)
6468513a70bcd92384395513322f1b801e7bf9c729Steve BlockFile::File(const String& relativePath, const String& path)
6568513a70bcd92384395513322f1b801e7bf9c729Steve Block    : Blob(createBlobDataForFile(path), -1)
665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_path(path)
675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_relativePath(relativePath)
685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_name = pathGetFileName(path);
705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochdouble File::lastModifiedDate() const
74f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
75f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    time_t modificationTime;
76f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!getFileModificationTime(m_path, modificationTime))
77f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return 0;
78f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
79f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Needs to return epoch time in milliseconds for Date.
80f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return modificationTime * 1000.0;
81f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenunsigned long long File::size() const
845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // FIXME: JavaScript cannot represent sizes as large as unsigned long long, we need to
865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // come up with an exception to throw if file size is not representable.
875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    long long size;
885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!getFileSize(m_path, size))
895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return 0;
905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return static_cast<unsigned long long>(size);
915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid File::captureSnapshot(long long& snapshotSize, double& snapshotModificationTime) const
945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // 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.
965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // If we fail to retrieve the size or modification time, probably due to that the file has been deleted, 0 size is returned.
975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // FIXME: Combine getFileSize and getFileModificationTime into one file system call.
985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    time_t modificationTime;
995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!getFileSize(m_path, snapshotSize) || !getFileModificationTime(m_path, modificationTime)) {
1005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        snapshotSize = 0;
1015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        snapshotModificationTime = 0;
1025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    } else
1035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        snapshotModificationTime = modificationTime;
1045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
1055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} // namespace WebCore
107