Index: chrome/browser/icon_url_data_manager.h |
diff --git a/chrome/browser/icon_url_data_manager.h b/chrome/browser/icon_url_data_manager.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b4fda1d693346429787d4aa6c8d6ef482fe41e37 |
--- /dev/null |
+++ b/chrome/browser/icon_url_data_manager.h |
@@ -0,0 +1,185 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_BROWSER_ICON_URL_DATA_MANAGER_H_ |
+#define CHROME_BROWSER_ICON_URL_DATA_MANAGER_H_ |
+ |
+#include <string> |
+#include <map> |
+ |
+#include "base/ref_counted_memory.h" |
+#include "base/scoped_ptr.h" |
+#include "base/singleton.h" |
+#include "base/task.h" |
+#include "chrome/browser/icon_loader.h" |
+#include "net/url_request/url_request_job.h" |
+ |
+class IconURLDataManager; |
+ |
+class URLRequestIconJob : public URLRequestJob { |
+ public: |
+ typedef int RequestID; |
+ |
+ explicit URLRequestIconJob(URLRequest* request); |
+ |
+ // URLRequestJob implementation. |
+ virtual void Start(); |
+ |
+ virtual void Kill(); |
+ |
+ virtual bool ReadRawData(net::IOBuffer* buf, int buf_size, int *bytes_read); |
+ |
+ virtual bool GetMimeType(std::string* mime_type) const; |
+ |
+ void SetMimeType(const std::string& mime_type); |
+ |
+ private: |
+ friend class IconURLDataManager; |
+ |
+ virtual ~URLRequestIconJob(); |
+ |
+ // Helper for Start(), to let us start asynchronously. |
+ // (This pattern is shared by most URLRequestJob implementations.) |
+ void StartAsync(); |
+ |
+ bool StartRequest(); |
+ |
+ void DataAvailable(RefCountedMemory* bytes); |
+ |
+ // Do the actual copy from data_ (the data we're serving) into |buf|. |
+ // Separate from ReadRawData so we can handle async I/O. |
+ void CompleteRead(net::IOBuffer* buf, int buf_size, int* bytes_read); |
+ |
+ // The actual data we're serving. NULL until it's been fetched. |
+ scoped_refptr<RefCountedMemory> data_; |
+ // The current offset into the data that we're handing off to our |
+ // callers via the Read interfaces. |
+ int data_offset_; |
+ |
+ // For async reads, we keep around a pointer to the buffer that |
+ // we're reading into. |
+ scoped_refptr<net::IOBuffer> pending_buf_; |
+ |
+ int pending_buf_size_; |
+ |
+ std::string mime_type_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(URLRequestIconJob); |
+}; |
+ |
+ |
+// IconURI represents a URI that can be used to resolve an icon URI as |
+// specified by http://tools.ietf.org/html/draft-lafayette-icon-uri-scheme-01. |
+// |
+// iconuri = "icon:" ( fextension / mediatype / "unknown" / |
+// "directory" / "parentdir" ) [ ";" size ] |
+// fextension = "." 1*token ; File extension |
+// mediatype = [ type ":" subtype ] ; Internet media type |
+// size = pixels / "small" / "medium" / "large" |
+// pixels = 1*digit ; Size of icon in square pixels |
+class IconURI { |
+ public: |
+ // Keyword identifiers for an icon. |
+ static const std::string DIRECTORY; |
+ static const std::string PARENT_DIRECTORY; |
+ static const std::string UNKNOWN; |
+ |
+ // Size identifiers for an icon. |
+ static const std::string SMALL_ID; |
+ static const std::string MEDIUM_ID; |
+ static const std::string LARGE_ID; |
+ |
+ enum IconSizes { |
+ SMALL = 16, |
+ MEDIUM = 32, |
+ LARGE = 64 |
+ }; |
+ |
+ IconURI(); |
+ |
+ ~IconURI(); |
+ |
+ bool ParseIconURI(const GURL& url); |
+ |
+ // Returns whether the provided URL is a valid icon URI. We return a default |
+ // icon image for icon URIs with unresolvable paths. |
+ bool IsValid(); |
+ |
+ std::string extension() const; |
+ |
+ // Returns the internet content type if specified by the URI. |
+ std::string media_type() const; |
+ |
+ std::string keyword() const; |
+ |
+ // For now IconLoader only can load 3 sizes. |
+ IconLoader::IconSize GetIconLoaderSize() const; |
+ |
+ // Returns the width/height of the icon. |
+ int size() const; |
+ |
+ private: |
+ void SetIdentifier(const std::string& identifier); |
+ |
+ void SetExtension(const std::string& ext); |
+ |
+ // Need to map media type to an extension for lookup. |
+ void SetMediaType(const std::string& media_type); |
+ |
+ // Different platforms support different icon sizes. Icons MUST be scaled to |
+ // the appropriate size if not available natively. |
+ void SetSize(const std::string& size_str); |
+ |
+ GURL url_; |
+ std::string extension_; |
+ std::string media_type_; |
+ std::string keyword_; |
+ int size_; |
+}; |
+ |
+ |
+class IconJobSource; |
+ |
+class IconURLDataManager { |
+ public: |
+ typedef int RequestID; |
+ |
+ IconURLDataManager(); |
+ |
+ ~IconURLDataManager(); |
+ |
+ static URLRequestJob* Factory(URLRequest* request, const std::string& scheme); |
+ |
+ void StartDataRequest(const IconURI& icon_uri, |
+ URLRequestIconJob* job); |
+ |
+ void DataAvailable(RequestID request_id, |
+ scoped_refptr<RefCountedMemory> bytes); |
+ |
+ void RemoveRequest(URLRequestIconJob* job); |
+ |
+ bool HasPendingJob(URLRequestIconJob* job) const; |
+ |
+ private: |
+ scoped_refptr<IconJobSource> data_source_; |
+ |
+ // The ID we'll use for the next request we receive. |
+ RequestID next_request_id_; |
+ |
+ // All pending URLRequestIconJobs, keyed by ID of the request. |
+ // URLRequestChromeJob calls into this object when it's constructed and |
+ // destructed to ensure that the pointers in this map remain valid. |
+ typedef std::map<RequestID, URLRequestIconJob*> PendingRequestMap; |
+ PendingRequestMap pending_requests_; |
+ |
+ friend struct DefaultSingletonTraits<IconURLDataManager>; |
+ DISALLOW_COPY_AND_ASSIGN(IconURLDataManager); |
+}; |
+ |
+DISABLE_RUNNABLE_METHOD_REFCOUNT(IconURLDataManager); |
+ |
+// Used to initialize the IconURLDataManager on the UI thread. |
+void RegisterURLRequestIconJob(); |
+ |
+#endif // CHROME_BROWSER_ICON_URL_DATA_MANAGER_H_ |