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