13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_URL_REQUEST_VIEW_CACHE_HELPER_H_
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_URL_REQUEST_VIEW_CACHE_HELPER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/completion_callback.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/io_buffer.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace disk_cache {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Backend;
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Entry;
173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}  // namespace disk_cache
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass URLRequestContext;
223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ViewCacheHelper {
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ViewCacheHelper();
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~ViewCacheHelper();
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Formats the cache information for |key| as HTML. Returns a net error code.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If this method returns ERR_IO_PENDING, |callback| will be notified when the
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // operation completes. |out| must remain valid until this operation completes
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // or the object is destroyed.
323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  int GetEntryInfoHTML(const std::string& key,
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       URLRequestContext* context,
343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                       std::string* out,
353f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                       CompletionCallback* callback);
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Formats the cache contents as HTML. Returns a net error code.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If this method returns ERR_IO_PENDING, |callback| will be notified when the
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // operation completes. |out| must remain valid until this operation completes
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // or the object is destroyed. |url_prefix| will be prepended to each entry
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // key as a link to the entry.
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int GetContentsHTML(URLRequestContext* context,
433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                      const std::string& url_prefix,
443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                      std::string* out,
453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                      CompletionCallback* callback);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum State {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_NONE,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_GET_BACKEND,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_GET_BACKEND_COMPLETE,
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_OPEN_NEXT_ENTRY,
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_OPEN_NEXT_ENTRY_COMPLETE,
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_OPEN_ENTRY,
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_OPEN_ENTRY_COMPLETE,
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_READ_RESPONSE,
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_READ_RESPONSE_COMPLETE,
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_READ_DATA,
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STATE_READ_DATA_COMPLETE
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implements GetEntryInfoHTML and GetContentsHTML.
633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  int GetInfoHTML(const std::string& key,
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                  URLRequestContext* context,
653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                  const std::string& url_prefix,
663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                  std::string* out,
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  CompletionCallback* callback);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is a helper function used to trigger a completion callback. It may
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // only be called if callback_ is non-null.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DoCallback(int rv);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This will trigger the completion callback if appropriate.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void HandleResult(int rv);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Runs the state transition loop.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoLoop(int result);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Each of these methods corresponds to a State value. If there is an
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // argument, the value corresponds to the return of the previous state or
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // corresponding callback.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoGetBackend();
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoGetBackendComplete(int result);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoOpenNextEntry();
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoOpenNextEntryComplete(int result);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoOpenEntry();
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoOpenEntryComplete(int result);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoReadResponse();
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoReadResponseComplete(int result);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoReadData();
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int DoReadDataComplete(int result);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to signal completion of asynchronous IO.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnIOComplete(int result);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<URLRequestContext> context_;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  disk_cache::Backend* disk_cache_;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  disk_cache::Entry* entry_;
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void* iter_;
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<IOBuffer> buf_;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int buf_len_;
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int index_;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string key_;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string url_prefix_;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string* data_;
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CompletionCallback* callback_;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  State next_state_;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CompletionCallbackImpl<ViewCacheHelper> cache_callback_;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<CancelableCompletionCallback<ViewCacheHelper> > entry_callback_;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ViewCacheHelper);
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace net.
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_URL_REQUEST_VIEW_CACHE_HELPER_H_
120