blob: c09b94e7e7143a6f27058047dbf44b5cf765cfd6 [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// Copyright (c) 2006-2008 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.
initial.commit09911bf2008-07-26 23:55:294//
5// Class for finding and caching Windows explorer icons. The IconManager
6// lives on the UI thread but performs icon extraction work on the file thread
7// to avoid blocking the UI thread with potentially expensive COM and disk
8// operations.
9//
10// Terminology
11//
12// Windows files have icons associated with them that can be of two types:
13// 1. "Per class": the icon used for this file is used for all files with the
14// same file extension or class. Examples are PDF or MP3 files, which use
15// the same icon for all files of that type.
16// 2. "Per instance": the icon used for this file is embedded in the file
17// itself and is unique. Executable files are typically "per instance".
18//
19// Files that end in the following extensions are considered "per instance":
20// .exe
21// .dll
22// .ico
23// The IconManager will do explicit icon loads on the full path of these files
24// and cache the results per file. All other file types will be looked up by
25// file extension and the results will be cached per extension. That way, all
26// .mp3 files will share one icon, but all .exe files will have their own icon.
27//
[email protected]0f38ceae2009-05-08 19:01:0228// POSIX files don't have associated icons. We query the OS by the file's
29// mime type.
30//
initial.commit09911bf2008-07-26 23:55:2931// The IconManager can be queried in two ways:
32// 1. A quick, synchronous check of its caches which does not touch the disk:
33// IconManager::LookupIcon()
34// 2. An asynchronous icon load from a file on the file thread:
35// IconManager::LoadIcon()
36//
37// When using the second (asychronous) method, callers must supply a callback
38// which will be run once the icon has been extracted. The icon manager will
39// cache the results of the icon extraction so that subsequent lookups will be
40// fast.
41//
42// Icon bitmaps returned should be treated as const since they may be referenced
43// by other clients. Make a copy of the icon if you need to modify it.
44
[email protected]7ced67af2009-04-14 23:25:1645#ifndef CHROME_BROWSER_ICON_MANAGER_H_
46#define CHROME_BROWSER_ICON_MANAGER_H_
initial.commit09911bf2008-07-26 23:55:2947
initial.commit09911bf2008-07-26 23:55:2948#include <map>
49#include <set>
50#include <string>
51
[email protected]23144032008-09-08 20:51:3052#include "base/hash_tables.h"
initial.commit09911bf2008-07-26 23:55:2953#include "chrome/browser/cancelable_request.h"
[email protected]0f38ceae2009-05-08 19:01:0254#include "chrome/browser/icon_loader.h"
initial.commit09911bf2008-07-26 23:55:2955
[email protected]0f38ceae2009-05-08 19:01:0256class FilePath;
initial.commit09911bf2008-07-26 23:55:2957class SkBitmap;
58
59class IconManager : public IconLoader::Delegate,
60 public CancelableRequestProvider {
[email protected]0f38ceae2009-05-08 19:01:0261 public:
initial.commit09911bf2008-07-26 23:55:2962 IconManager();
63 ~IconManager();
64
65 // Synchronous call to examine the internal caches for the icon. Returns the
66 // icon if we have already loaded it, NULL if we don't have it and must load
67 // it via 'LoadIcon'. The returned bitmap is owned by the IconManager and must
68 // not be free'd by the caller. If the caller needs to modify the icon, it
69 // must make a copy and modify the copy.
[email protected]7ced67af2009-04-14 23:25:1670 SkBitmap* LookupIcon(const FilePath& file_name,
initial.commit09911bf2008-07-26 23:55:2971 IconLoader::IconSize size);
72
initial.commit09911bf2008-07-26 23:55:2973 typedef CancelableRequestProvider::Handle Handle;
74 typedef Callback2<Handle, SkBitmap*>::Type IconRequestCallback;
75
[email protected]4118ab92009-06-17 00:43:4376 // Asynchronous call to lookup and return the icon associated with file. The
77 // work is done on the file thread, with the callbacks running on the UI
78 // thread. The return value is the 'request_id' that will be passed to the
79 // client in the callback. Note: this does *not* check the cache.
80 //
81 // WATCH OUT: The returned bitmap pointer may be NULL if decoding failed.
[email protected]7ced67af2009-04-14 23:25:1682 Handle LoadIcon(const FilePath& file_name,
initial.commit09911bf2008-07-26 23:55:2983 IconLoader::IconSize size,
84 CancelableRequestConsumerBase* consumer,
85 IconRequestCallback* callback);
86
87 // IconLoader::Delegate interface.
[email protected]46728b1f2009-05-07 20:42:2488 virtual bool OnBitmapLoaded(IconLoader* source, SkBitmap* result);
initial.commit09911bf2008-07-26 23:55:2989
[email protected]0f38ceae2009-05-08 19:01:0290 // Get the identifying string for the given file. The implementation
91 // is in icon_manager_[platform].cc.
92 static IconGroupID GetGroupIDFromFilepath(const FilePath& path);
93
94 private:
initial.commit09911bf2008-07-26 23:55:2995 struct CacheKey {
[email protected]0f38ceae2009-05-08 19:01:0296 CacheKey(const IconGroupID& group, IconLoader::IconSize size);
initial.commit09911bf2008-07-26 23:55:2997
98 // Used as a key in the map below, so we need this comparator.
99 bool operator<(const CacheKey &other) const;
100
[email protected]0f38ceae2009-05-08 19:01:02101 IconGroupID group;
initial.commit09911bf2008-07-26 23:55:29102 IconLoader::IconSize size;
103 };
104
105 typedef std::map<CacheKey, SkBitmap*> IconMap;
106 IconMap icon_cache_;
107
108 typedef CancelableRequest<IconRequestCallback> IconRequest;
109 typedef struct {
110 scoped_refptr<IconRequest> request;
[email protected]0f38ceae2009-05-08 19:01:02111 IconGroupID group;
initial.commit09911bf2008-07-26 23:55:29112 IconLoader::IconSize size;
113 } ClientRequest;
114
115 // Asynchronous requests that have not yet been completed.
[email protected]0f38ceae2009-05-08 19:01:02116 typedef std::map<IconLoader*, ClientRequest> ClientRequests;
initial.commit09911bf2008-07-26 23:55:29117 ClientRequests requests_;
118
[email protected]7ced67af2009-04-14 23:25:16119 DISALLOW_COPY_AND_ASSIGN(IconManager);
initial.commit09911bf2008-07-26 23:55:29120};
121
[email protected]11f4857282009-11-13 19:56:17122#endif // CHROME_BROWSER_ICON_MANAGER_H_