#ifndef File_h
#define File_h
#include "Blob.h"
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
struct FileMetadata;
class KURL;
class File : public Blob {
public:
enum ContentTypeLookupPolicy {
WellKnownContentTypes,
AllContentTypes,
};
static PassRefPtr<File> create(const String& path, ContentTypeLookupPolicy policy = WellKnownContentTypes)
{
return adoptRef(new File(path, policy));
}
static PassRefPtr<File> create(const String& path, const KURL& srcURL, const String& type)
{
return adoptRef(new File(path, srcURL, type));
}
#if ENABLE(DIRECTORY_UPLOAD)
static PassRefPtr<File> createWithRelativePath(const String& path, const String& relativePath);
#endif
#if ENABLE(FILE_SYSTEM)
static PassRefPtr<File> createForFileSystemFile(const String& name, const FileMetadata& metadata)
{
return adoptRef(new File(name, metadata));
}
static PassRefPtr<File> createForFileSystemFile(const KURL& url, const FileMetadata& metadata)
{
return adoptRef(new File(url, metadata));
}
KURL fileSystemURL() const { return m_fileSystemURL; }
#endif
static PassRefPtr<File> createWithName(const String& path, const String& name, ContentTypeLookupPolicy policy = WellKnownContentTypes)
{
if (name.isEmpty())
return adoptRef(new File(path, policy));
return adoptRef(new File(path, name, policy));
}
virtual unsigned long long size() const;
virtual bool isFile() const { return true; }
const String& path() const { return m_path; }
const String& name() const { return m_name; }
double lastModifiedDate() const;
#if ENABLE(DIRECTORY_UPLOAD)
const String& webkitRelativePath() const { return m_relativePath; }
#endif
void captureSnapshot(long long& snapshotSize, double& snapshotModificationTime) const;
private:
File(const String& path, ContentTypeLookupPolicy);
File(const String& path, const KURL& srcURL, const String& type);
File(const String& path, const String& name, ContentTypeLookupPolicy);
# if ENABLE(FILE_SYSTEM)
File(const String& name, const FileMetadata&);
File(const KURL& fileSystemURL, const FileMetadata&);
bool hasValidSnapshotMetadata() const { return m_snapshotSize >= 0; }
#endif
String m_path;
String m_name;
#if ENABLE(FILE_SYSTEM)
KURL m_fileSystemURL;
const long long m_snapshotSize;
const double m_snapshotModificationTime;
#endif
#if ENABLE(DIRECTORY_UPLOAD)
String m_relativePath;
#endif
};
inline File* toFile(Blob* blob)
{
ASSERT_WITH_SECURITY_IMPLICATION(!blob || blob->isFile());
return static_cast<File*>(blob);
}
inline const File* toFile(const Blob* blob)
{
ASSERT_WITH_SECURITY_IMPLICATION(!blob || blob->isFile());
return static_cast<const File*>(blob);
}
}
#endif // File_h