1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "net/disk_cache/flash/internal_entry.h" 6 7#include "base/memory/ref_counted.h" 8#include "net/base/completion_callback.h" 9#include "net/base/io_buffer.h" 10#include "net/base/net_errors.h" 11#include "net/disk_cache/flash/log_store.h" 12#include "net/disk_cache/flash/log_store_entry.h" 13 14using net::IOBuffer; 15using net::StringIOBuffer; 16using net::CompletionCallback; 17 18namespace disk_cache { 19 20KeyAndStreamSizes::KeyAndStreamSizes() { 21} 22 23InternalEntry::InternalEntry(const std::string& key, LogStore* store) 24 : store_(store), 25 entry_(new LogStoreEntry(store_)) { 26 entry_->Init(); 27 WriteKey(entry_.get(), key); 28} 29 30InternalEntry::InternalEntry(int32 id, LogStore* store) 31 : store_(store), 32 entry_(new LogStoreEntry(store_, id)) { 33} 34 35InternalEntry::~InternalEntry() { 36} 37 38scoped_ptr<KeyAndStreamSizes> InternalEntry::Init() { 39 scoped_ptr<KeyAndStreamSizes> null; 40 if (entry_->IsNew()) 41 return null.Pass(); 42 if (!entry_->Init()) 43 return null.Pass(); 44 45 scoped_ptr<KeyAndStreamSizes> rv(new KeyAndStreamSizes); 46 if (!ReadKey(entry_.get(), &rv->key)) 47 return null.Pass(); 48 for (int i = 0; i < kFlashLogStoreEntryNumStreams; ++i) 49 rv->stream_sizes[i] = entry_->GetDataSize(i+1); 50 return rv.Pass(); 51} 52 53int32 InternalEntry::GetDataSize(int index) const { 54 return entry_->GetDataSize(++index); 55} 56 57int InternalEntry::ReadData(int index, int offset, IOBuffer* buf, int buf_len, 58 const CompletionCallback& callback) { 59 return entry_->ReadData(++index, offset, buf, buf_len); 60} 61 62int InternalEntry::WriteData(int index, int offset, IOBuffer* buf, int buf_len, 63 const CompletionCallback& callback) { 64 return entry_->WriteData(++index, offset, buf, buf_len); 65} 66 67void InternalEntry::Close() { 68 entry_->Close(); 69} 70 71bool InternalEntry::WriteKey(LogStoreEntry* entry, const std::string& key) { 72 int key_size = static_cast<int>(key.size()); 73 scoped_refptr<IOBuffer> key_buf(new StringIOBuffer(key)); 74 return entry->WriteData(0, 0, key_buf.get(), key_size) == key_size; 75} 76 77bool InternalEntry::ReadKey(LogStoreEntry* entry, std::string* key) { 78 int key_size = entry->GetDataSize(0); 79 scoped_refptr<net::IOBuffer> key_buf(new net::IOBuffer(key_size)); 80 if (entry->ReadData(0, 0, key_buf.get(), key_size) != key_size) 81 return false; 82 key->assign(key_buf->data(), key_size); 83 return true; 84} 85 86} // namespace disk_cache 87