OLD | NEW |
| (Empty) |
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 #include "chrome/browser/history/history_publisher.h" | |
6 | |
7 #include <atlsafe.h> | |
8 #include <oleauto.h> | |
9 #include <wtypes.h> | |
10 | |
11 #include "base/strings/string_util.h" | |
12 #include "base/strings/utf_string_conversions.h" | |
13 #include "base/time/time.h" | |
14 #include "base/win/registry.h" | |
15 #include "base/win/scoped_bstr.h" | |
16 #include "base/win/scoped_comptr.h" | |
17 #include "base/win/scoped_variant.h" | |
18 #include "url/gurl.h" | |
19 | |
20 namespace { | |
21 | |
22 // Instantiates the registered indexers from the registry |root| + |path| key | |
23 // and adds them to the |indexers| list. | |
24 void AddRegisteredIndexers( | |
25 HKEY root, | |
26 const wchar_t* path, | |
27 std::vector< base::win::ScopedComPtr<IChromeHistoryIndexer> >* indexers) { | |
28 for (base::win::RegistryKeyIterator r_iter(root, path); r_iter.Valid(); | |
29 ++r_iter) { | |
30 CLSID clsid; | |
31 if (FAILED(CLSIDFromString(const_cast<wchar_t*>(r_iter.Name()), &clsid))) | |
32 continue; | |
33 base::win::ScopedComPtr<IChromeHistoryIndexer> indexer; | |
34 if (SUCCEEDED(indexer.CreateInstance(clsid, NULL, CLSCTX_INPROC))) { | |
35 indexers->push_back(indexer); | |
36 indexer.Release(); | |
37 } | |
38 } | |
39 } | |
40 | |
41 } // namespace | |
42 | |
43 namespace history { | |
44 | |
45 const wchar_t* const HistoryPublisher::kRegKeyRegisteredIndexersInfo = | |
46 L"Software\\Google\\Google Chrome\\IndexerPlugins"; | |
47 | |
48 // static | |
49 double HistoryPublisher::TimeToUTCVariantTime(const base::Time& time) { | |
50 double var_time = 0; | |
51 if (!time.is_null()) { | |
52 base::Time::Exploded exploded; | |
53 time.UTCExplode(&exploded); | |
54 | |
55 // Create the system time struct representing our exploded time. | |
56 SYSTEMTIME system_time; | |
57 system_time.wYear = exploded.year; | |
58 system_time.wMonth = exploded.month; | |
59 system_time.wDayOfWeek = exploded.day_of_week; | |
60 system_time.wDay = exploded.day_of_month; | |
61 system_time.wHour = exploded.hour; | |
62 system_time.wMinute = exploded.minute; | |
63 system_time.wSecond = exploded.second; | |
64 system_time.wMilliseconds = exploded.millisecond; | |
65 SystemTimeToVariantTime(&system_time, &var_time); | |
66 } | |
67 | |
68 return var_time; | |
69 } | |
70 | |
71 HistoryPublisher::HistoryPublisher() { | |
72 } | |
73 | |
74 HistoryPublisher::~HistoryPublisher() { | |
75 } | |
76 | |
77 bool HistoryPublisher::Init() { | |
78 return ReadRegisteredIndexersFromRegistry(); | |
79 } | |
80 | |
81 // Peruse the registry for Indexer to instantiate and store in |indexers_|. | |
82 // Return true if we found at least one indexer object. We look both in HKCU | |
83 // and HKLM. | |
84 bool HistoryPublisher::ReadRegisteredIndexersFromRegistry() { | |
85 AddRegisteredIndexers(HKEY_CURRENT_USER, | |
86 kRegKeyRegisteredIndexersInfo, &indexers_); | |
87 AddRegisteredIndexers(HKEY_LOCAL_MACHINE, | |
88 kRegKeyRegisteredIndexersInfo, &indexers_); | |
89 return !indexers_.empty(); | |
90 } | |
91 | |
92 void HistoryPublisher::PublishDataToIndexers(const PageData& page_data) | |
93 const { | |
94 double var_time = TimeToUTCVariantTime(page_data.time); | |
95 | |
96 // Send data to registered indexers. | |
97 base::win::ScopedVariant time(var_time, VT_DATE); | |
98 base::win::ScopedBstr url(ASCIIToWide(page_data.url.spec()).c_str()); | |
99 base::win::ScopedBstr html(page_data.html); | |
100 base::win::ScopedBstr title(page_data.title); | |
101 | |
102 // No clients send thumbnail data anymore, these are needed only to | |
103 // retain the interface. | |
104 base::win::ScopedBstr format(NULL); | |
105 CComSafeArray<unsigned char> thumbnail_arr; | |
106 base::win::ScopedVariant psa(thumbnail_arr.m_psa); | |
107 | |
108 for (size_t i = 0; i < indexers_.size(); ++i) { | |
109 indexers_[i]->SendPageData(time, url, html, title, format, psa); | |
110 } | |
111 } | |
112 | |
113 } // namespace history | |
OLD | NEW |