DiskImageCacheIOS.h [plain text]
#ifndef DiskImageCacheIOS_h
#define DiskImageCacheIOS_h
#if ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
#include "DiskImageCacheClientIOS.h"
#include "FileSystem.h"
#include "SharedBuffer.h"
#include <wtf/HashMap.h>
#include <wtf/Noncopyable.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
#include <wtf/Threading.h>
#include <wtf/text/WTFString.h>
typedef unsigned DiskImageCacheId;
namespace WebCore {
class DiskImageCache {
WTF_MAKE_NONCOPYABLE(DiskImageCache);
private:
class Entry : public RefCounted<Entry> {
private:
Entry(SharedBuffer*, DiskImageCacheId);
public:
static PassRefPtr<DiskImageCache::Entry> create(SharedBuffer* buffer, DiskImageCacheId id)
{
return adoptRef(new DiskImageCache::Entry(buffer, id));
}
~Entry();
void map(const String& path);
void unmap();
void removeFile();
void clearDataWithoutMapping();
DiskImageCacheId id() const { return m_id; }
unsigned size() const { return m_size; }
void* data() const { return m_mapping; }
bool isMapped() const { return m_mapping != nullptr; }
private:
bool mapInternal(const String& path);
int writeToFileInternal(PlatformFileHandle);
SharedBuffer* m_buffer;
DiskImageCacheId m_id;
unsigned m_size;
void* m_mapping;
String m_path;
};
public:
DiskImageCache();
friend DiskImageCache& diskImageCache();
static const DiskImageCacheId invalidDiskCacheId = 0;
DiskImageCacheId writeItem(PassRefPtr<SharedBuffer>);
void removeItem(DiskImageCacheId);
void* dataForItem(DiskImageCacheId);
void setClient(PassRefPtr<DiskImageCacheClient> client) { m_client = client; }
bool isEnabled() const { return m_enabled; }
void setEnabled(bool enabled) { m_enabled = enabled; }
unsigned maximumCacheSize() const { return m_maximumCacheSize; }
void setMaximumCacheSize(unsigned maximum) { m_maximumCacheSize = maximum; }
unsigned minimumImageSize() const { return m_minimumImageSize; }
void setMinimumImageSize(unsigned minimum) { m_minimumImageSize = minimum; }
const String& cacheDirectory() const { return m_cacheDirectory; }
unsigned size() const { return m_size; }
bool isFull() const { return m_size >= m_maximumCacheSize; }
private:
~DiskImageCache() { }
bool createDirectoryIfNeeded();
DiskImageCacheId nextAvailableId();
String temporaryDirectory();
String temporaryFile();
void updateSize(unsigned delta);
bool m_enabled;
unsigned m_size;
unsigned m_maximumCacheSize;
unsigned m_minimumImageSize;
DiskImageCacheId m_nextAvailableId;
String m_cacheDirectory;
RefPtr<DiskImageCacheClient> m_client;
HashMap<DiskImageCacheId, RefPtr<DiskImageCache::Entry>> m_table;
Mutex m_mutex;
};
DiskImageCache& diskImageCache();
}
#endif // ENABLE(DISK_IMAGE_CACHE) && PLATFORM(IOS)
#endif // DiskImageCacheIOS_h