1// Copyright (c) 2011 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#ifndef NET_URL_REQUEST_VIEW_CACHE_HELPER_H_
6#define NET_URL_REQUEST_VIEW_CACHE_HELPER_H_
7#pragma once
8
9#include <string>
10
11#include "net/base/completion_callback.h"
12#include "net/base/io_buffer.h"
13
14namespace disk_cache {
15class Backend;
16class Entry;
17}  // namespace disk_cache
18
19namespace net {
20
21class URLRequestContext;
22
23class ViewCacheHelper {
24 public:
25  ViewCacheHelper();
26  ~ViewCacheHelper();
27
28  // Formats the cache information for |key| as HTML. Returns a net error code.
29  // If this method returns ERR_IO_PENDING, |callback| will be notified when the
30  // operation completes. |out| must remain valid until this operation completes
31  // or the object is destroyed.
32  int GetEntryInfoHTML(const std::string& key,
33                       URLRequestContext* context,
34                       std::string* out,
35                       CompletionCallback* callback);
36
37  // Formats the cache contents as HTML. Returns a net error code.
38  // If this method returns ERR_IO_PENDING, |callback| will be notified when the
39  // operation completes. |out| must remain valid until this operation completes
40  // or the object is destroyed. |url_prefix| will be prepended to each entry
41  // key as a link to the entry.
42  int GetContentsHTML(URLRequestContext* context,
43                      const std::string& url_prefix,
44                      std::string* out,
45                      CompletionCallback* callback);
46
47 private:
48  enum State {
49    STATE_NONE,
50    STATE_GET_BACKEND,
51    STATE_GET_BACKEND_COMPLETE,
52    STATE_OPEN_NEXT_ENTRY,
53    STATE_OPEN_NEXT_ENTRY_COMPLETE,
54    STATE_OPEN_ENTRY,
55    STATE_OPEN_ENTRY_COMPLETE,
56    STATE_READ_RESPONSE,
57    STATE_READ_RESPONSE_COMPLETE,
58    STATE_READ_DATA,
59    STATE_READ_DATA_COMPLETE
60  };
61
62  // Implements GetEntryInfoHTML and GetContentsHTML.
63  int GetInfoHTML(const std::string& key,
64                  URLRequestContext* context,
65                  const std::string& url_prefix,
66                  std::string* out,
67                  CompletionCallback* callback);
68
69  // This is a helper function used to trigger a completion callback. It may
70  // only be called if callback_ is non-null.
71  void DoCallback(int rv);
72
73  // This will trigger the completion callback if appropriate.
74  void HandleResult(int rv);
75
76  // Runs the state transition loop.
77  int DoLoop(int result);
78
79  // Each of these methods corresponds to a State value. If there is an
80  // argument, the value corresponds to the return of the previous state or
81  // corresponding callback.
82  int DoGetBackend();
83  int DoGetBackendComplete(int result);
84  int DoOpenNextEntry();
85  int DoOpenNextEntryComplete(int result);
86  int DoOpenEntry();
87  int DoOpenEntryComplete(int result);
88  int DoReadResponse();
89  int DoReadResponseComplete(int result);
90  int DoReadData();
91  int DoReadDataComplete(int result);
92
93  // Called to signal completion of asynchronous IO.
94  void OnIOComplete(int result);
95
96  scoped_refptr<URLRequestContext> context_;
97  disk_cache::Backend* disk_cache_;
98  disk_cache::Entry* entry_;
99  void* iter_;
100  scoped_refptr<IOBuffer> buf_;
101  int buf_len_;
102  int index_;
103
104  std::string key_;
105  std::string url_prefix_;
106  std::string* data_;
107  CompletionCallback* callback_;
108
109  State next_state_;
110
111  CompletionCallbackImpl<ViewCacheHelper> cache_callback_;
112  scoped_refptr<CancelableCompletionCallback<ViewCacheHelper> > entry_callback_;
113
114  DISALLOW_COPY_AND_ASSIGN(ViewCacheHelper);
115};
116
117}  // namespace net.
118
119#endif  // NET_URL_REQUEST_VIEW_CACHE_HELPER_H_
120