DataTransferItemFileSystemChromium.cpp [plain text]
#include "config.h"
#include "DataTransferItemFileSystem.h"
#if ENABLE(FILE_SYSTEM)
#include "AsyncFileSystem.h"
#include "AsyncFileSystemCallbacks.h"
#include "ChromiumDataObject.h"
#include "ClipboardChromium.h"
#include "DOMFilePath.h"
#include "DOMFileSystem.h"
#include "DirectoryEntry.h"
#include "DraggedIsolatedFileSystem.h"
#include "Entry.h"
#include "EntryCallback.h"
#include "File.h"
#include "FileEntry.h"
#include "FileMetadata.h"
#include "ScriptExecutionContext.h"
namespace WebCore {
namespace {
class GetAsEntryCallbacks : public AsyncFileSystemCallbacks {
WTF_MAKE_NONCOPYABLE(GetAsEntryCallbacks);
public:
static PassOwnPtr<GetAsEntryCallbacks> create(PassRefPtr<DOMFileSystem> filesystem, const String& virtualPath, PassRefPtr<EntryCallback> callback)
{
return adoptPtr(new GetAsEntryCallbacks(filesystem, virtualPath, callback));
}
virtual ~GetAsEntryCallbacks()
{
}
virtual void didReadMetadata(const FileMetadata& metadata)
{
if (metadata.type == FileMetadata::TypeDirectory)
m_callback->handleEvent(DirectoryEntry::create(m_filesystem, m_virtualPath).get());
else
m_callback->handleEvent(FileEntry::create(m_filesystem, m_virtualPath).get());
}
virtual void didFail(int error)
{
m_callback->handleEvent(0);
}
private:
GetAsEntryCallbacks(PassRefPtr<DOMFileSystem> filesystem, const String& virtualPath, PassRefPtr<EntryCallback> callback)
: m_filesystem(filesystem)
, m_virtualPath(virtualPath)
, m_callback(callback)
{
}
RefPtr<DOMFileSystem> m_filesystem;
String m_virtualPath;
RefPtr<EntryCallback> m_callback;
};
}
void DataTransferItemFileSystem::webkitGetAsEntry(DataTransferItem* item, ScriptExecutionContext* scriptExecutionContext, PassRefPtr<EntryCallback> callback)
{
DataTransferItemPolicyWrapper* itemPolicyWrapper = static_cast<DataTransferItemPolicyWrapper*>(item);
if (!callback || !itemPolicyWrapper->dataObjectItem()->isFilename())
return;
Blob* file = itemPolicyWrapper->getAsFile().get();
if (!file)
return;
ASSERT(file->isFile());
DraggedIsolatedFileSystem* filesystem = DraggedIsolatedFileSystem::from(itemPolicyWrapper->clipboard()->dataObject().get());
DOMFileSystem* domFileSystem = filesystem ? filesystem->getDOMFileSystem(scriptExecutionContext) : 0;
if (!filesystem) {
DOMFileSystem::scheduleCallback(scriptExecutionContext, callback, adoptRef(static_cast<Entry*>(0)));
return;
}
ASSERT(domFileSystem);
String virtualPath = DOMFilePath::append("/", static_cast<File*>(file)->name());
domFileSystem->asyncFileSystem()->readMetadata(virtualPath, GetAsEntryCallbacks::create(domFileSystem, virtualPath, callback));
}
}
#endif // ENABLE(FILE_SYSTEM)