OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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 // A library to manage RLZ information for access-points shared | |
6 // across different client applications. | |
7 // | |
8 // All functions return true on success and false on error. | |
9 // This implemenation is thread safe. | |
10 | |
11 | |
12 #ifndef RLZ_LIB_RLZ_LIB_H_ | |
13 #define RLZ_LIB_RLZ_LIB_H_ | |
14 | |
15 #include <stdio.h> | |
16 #include <string> | |
17 | |
18 #include "build/build_config.h" | |
19 | |
20 #include "rlz/lib/rlz_enums.h" | |
21 | |
22 #if defined(OS_WIN) | |
23 #define RLZ_LIB_API __cdecl | |
24 #else | |
25 #define RLZ_LIB_API | |
26 #endif | |
27 | |
28 // Define one of | |
29 // + RLZ_NETWORK_IMPLEMENTATION_WIN_INET: Uses win inet to send financial pings. | |
30 // + RLZ_NETWORK_IMPLEMENTATION_CHROME_NET: Uses chrome's network stack to send | |
31 // financial pings. rlz_lib::SetURLRequestContext() must be called before | |
32 // any calls to SendFinancialPing(). | |
33 #if defined(RLZ_NETWORK_IMPLEMENTATION_WIN_INET) && \ | |
34 defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET) | |
35 #error Exactly one of RLZ_NETWORK_IMPLEMENTATION_WIN_INET and \ | |
36 RLZ_NETWORK_IMPLEMENTATION_CHROME_NET should be defined. | |
37 #endif | |
38 #if !defined(RLZ_NETWORK_IMPLEMENTATION_WIN_INET) && \ | |
39 !defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET) | |
40 #if defined(OS_WIN) | |
41 #define RLZ_NETWORK_IMPLEMENTATION_WIN_INET | |
42 #else | |
43 #define RLZ_NETWORK_IMPLEMENTATION_CHROME_NET | |
44 #endif | |
45 #endif | |
46 | |
47 #if defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET) | |
48 namespace net { | |
49 class URLRequestContextGetter; | |
50 } // namespace net | |
51 #endif | |
52 | |
53 namespace rlz_lib { | |
54 | |
55 class ScopedRlzValueStoreLock; | |
56 | |
57 // The maximum length of an access points RLZ in bytes. | |
58 const int kMaxRlzLength = 64; | |
59 // The maximum length of an access points RLZ in bytes. | |
60 const int kMaxDccLength = 128; | |
61 // The maximum length of a CGI string in bytes. | |
62 const int kMaxCgiLength = 2048; | |
63 // The maximum length of a ping response we will parse in bytes. If the response | |
64 // is bigger, please break it up into separate calls. | |
65 const int kMaxPingResponseLength = 0x4000; // 16K | |
66 | |
67 #if defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET) | |
68 // Set the URLRequestContextGetter used by SendFinancialPing(). The IO message | |
69 // loop returned by this context will be used for the IO done by | |
70 // SendFinancialPing(). | |
71 bool RLZ_LIB_API SetURLRequestContext(net::URLRequestContextGetter* context); | |
72 #endif | |
73 | |
74 // RLZ storage functions. | |
75 | |
76 // Get all the events reported by this product as a CGI string to append to | |
77 // the daily ping. | |
78 // Access: HKCU read. | |
79 bool RLZ_LIB_API GetProductEventsAsCgi(Product product, char* unescaped_cgi, | |
80 size_t unescaped_cgi_size); | |
81 | |
82 // Records an RLZ event. | |
83 // Some events can be product-independent (e.g: First search from home page), | |
84 // and some can be access point independent (e.g. Pack installed). However, | |
85 // product independent events must still include the product which cares about | |
86 // that information being reported. | |
87 // Access: HKCU write. | |
88 bool RLZ_LIB_API RecordProductEvent(Product product, AccessPoint point, | |
89 Event event_id); | |
90 | |
91 // Clear an event reported by this product. This should be called after a | |
92 // successful ping to the RLZ server. | |
93 // Access: HKCU write. | |
94 bool RLZ_LIB_API ClearProductEvent(Product product, AccessPoint point, | |
95 Event event_id); | |
96 | |
97 // Clear all reported events and recorded stateful events of this product. | |
98 // This should be called on complete uninstallation of the product. | |
99 // Access: HKCU write. | |
100 bool RLZ_LIB_API ClearAllProductEvents(Product product); | |
101 | |
102 // Clears all product-specifc state from the RLZ registry. | |
103 // Should be called during product uninstallation. | |
104 // This removes outstanding product events, product financial ping times, | |
105 // the product RLS argument (if any), and any RLZ's for access points being | |
106 // uninstalled with the product. | |
107 // access_points is an array terminated with NO_ACCESS_POINT. | |
108 // IMPORTANT: These are the access_points the product is removing as part | |
109 // of the uninstallation, not necessarily all the access points passed to | |
110 // SendFinancialPing() and GetPingParams(). | |
111 // access_points can be NULL if no points are being uninstalled. | |
112 // No return value - this is best effort. Will assert in debug mode on | |
113 // failed attempts. | |
114 // Access: HKCU write. | |
115 void RLZ_LIB_API ClearProductState(Product product, | |
116 const AccessPoint* access_points); | |
117 | |
118 // Get the RLZ value of the access point. If the access point is not Google, the | |
119 // RLZ will be the empty string and the function will return false. | |
120 // Access: HKCU read. | |
121 bool RLZ_LIB_API GetAccessPointRlz(AccessPoint point, char* rlz, | |
122 size_t rlz_size); | |
123 | |
124 // Set the RLZ for the access-point. Fails and asserts if called when the access | |
125 // point is not set to Google. | |
126 // new_rlz should come from a server-response. Client applications should not | |
127 // create their own RLZ values. | |
128 // Access: HKCU write. | |
129 bool RLZ_LIB_API SetAccessPointRlz(AccessPoint point, const char* new_rlz); | |
130 | |
131 // Financial Server pinging functions. | |
132 // These functions deal with pinging the RLZ financial server and parsing and | |
133 // acting upon the response. Clients should SendFinancialPing() to avoid needing | |
134 // these functions. However, these functions allow clients to split the various | |
135 // parts of the pinging process up as needed (to avoid firewalls, etc). | |
136 | |
137 // Forms the HTTP request to send to the RLZ financial server. | |
138 // | |
139 // product : The product to ping for. | |
140 // access_points : The access points this product affects. Array must be | |
141 // terminated with NO_ACCESS_POINT. | |
142 // product_signature : The signature sent with daily pings (e.g. swg, ietb) | |
143 // product_brand : The brand of the pinging product, if any. | |
144 // product_id : The product-specific installation ID (can be NULL). | |
145 // product_lang : The language for the product (used to determine cohort). | |
146 // exclude_machine_id : Whether the Machine ID should be explicitly excluded | |
147 // based on the products privacy policy. | |
148 // request : The buffer where the function returns the HTTP request. | |
149 // request_buffer_size: The size of the request buffer in bytes. The buffer | |
150 // size (kMaxCgiLength+1) is guaranteed to be enough. | |
151 // | |
152 // Access: HKCU read. | |
153 bool RLZ_LIB_API FormFinancialPingRequest(Product product, | |
154 const AccessPoint* access_points, | |
155 const char* product_signature, | |
156 const char* product_brand, | |
157 const char* product_id, | |
158 const char* product_lang, | |
159 bool exclude_machine_id, | |
160 char* request, | |
161 size_t request_buffer_size); | |
162 | |
163 // Pings the financial server and returns the HTTP response. This will fail | |
164 // if it is too early to ping the server since the last ping. | |
165 // | |
166 // If RLZ_NETWORK_IMPLEMENTATION_CHROME_NET is set, SetURLRequestContext() needs | |
167 // to be called before calling this function. | |
168 // | |
169 // product : The product to ping for. | |
170 // request : The HTTP request (for example, returned by | |
171 // FormFinancialPingRequest). | |
172 // response : The buffer in which the HTTP response is returned. | |
173 // response_buffer_size : The size of the response buffer in bytes. The buffer | |
174 // size (kMaxPingResponseLength+1) is enough for all | |
175 // legitimate server responses (any response that is | |
176 // bigger should be considered the same way as a general | |
177 // network problem). | |
178 // | |
179 // Access: HKCU read. | |
180 bool RLZ_LIB_API PingFinancialServer(Product product, | |
181 const char* request, | |
182 char* response, | |
183 size_t response_buffer_size); | |
184 | |
185 // Checks if a ping response is valid - ie. it has a checksum line which | |
186 // is the CRC-32 checksum of the message uptil the checksum. If | |
187 // checksum_idx is not NULL, it will get the index of the checksum, i.e. - | |
188 // the effective end of the message. | |
189 // Access: No restrictions. | |
190 bool RLZ_LIB_API IsPingResponseValid(const char* response, | |
191 int* checksum_idx); | |
192 | |
193 | |
194 // Complex helpers built on top of other functions. | |
195 | |
196 // Parses the responses from the financial server and updates product state | |
197 // and access point RLZ's in registry. Like ParsePingResponse(), but also | |
198 // updates the last ping time. | |
199 // Access: HKCU write. | |
200 bool RLZ_LIB_API ParseFinancialPingResponse(Product product, | |
201 const char* response); | |
202 | |
203 // Send the ping with RLZs and events to the PSO server. | |
204 // This ping method should be called daily. (More frequent calls will fail). | |
205 // Also, if there are no events, the call will succeed only once a week. | |
206 // | |
207 // If RLZ_NETWORK_IMPLEMENTATION_CHROME_NET is set, SetURLRequestContext() needs | |
208 // to be called before calling this function. | |
209 // | |
210 // product : The product to ping for. | |
211 // access_points : The access points this product affects. Array must be | |
212 // terminated with NO_ACCESS_POINT. | |
213 // product_signature : The signature sent with daily pings (e.g. swg, ietb) | |
214 // product_brand : The brand of the pinging product, if any. | |
215 // product_id : The product-specific installation ID (can be NULL). | |
216 // product_lang : The language for the product (used to determine cohort). | |
217 // exclude_machine_id : Whether the Machine ID should be explicitly excluded | |
218 // based on the products privacy policy. | |
219 // | |
220 // Returns true on successful ping and response, false otherwise. | |
221 // Access: HKCU write. | |
222 bool RLZ_LIB_API SendFinancialPing(Product product, | |
223 const AccessPoint* access_points, | |
224 const char* product_signature, | |
225 const char* product_brand, | |
226 const char* product_id, | |
227 const char* product_lang, | |
228 bool exclude_machine_id); | |
229 | |
230 // An alternate implementations of SendFinancialPing with the same behavior, | |
231 // except the caller can optionally choose to skip the timing check. | |
232 bool RLZ_LIB_API SendFinancialPing(Product product, | |
233 const AccessPoint* access_points, | |
234 const char* product_signature, | |
235 const char* product_brand, | |
236 const char* product_id, | |
237 const char* product_lang, | |
238 bool exclude_machine_id, | |
239 const bool skip_time_check); | |
240 | |
241 // Parses RLZ related ping response information from the server. | |
242 // Updates stored RLZ values and clears stored events accordingly. | |
243 // Access: HKCU write. | |
244 bool RLZ_LIB_API ParsePingResponse(Product product, const char* response); | |
245 | |
246 | |
247 // Copies the events associated with the product and the RLZ's for each access | |
248 // point in access_points into cgi. This string can be directly appended | |
249 // to a ping (will need an & if not first paramter). | |
250 // access_points must be an array of AccessPoints terminated with | |
251 // NO_ACCESS_POINT. | |
252 // Access: HKCU read. | |
253 bool RLZ_LIB_API GetPingParams(Product product, | |
254 const AccessPoint* access_points, | |
255 char* unescaped_cgi, size_t unescaped_cgi_size); | |
256 | |
257 #if defined(OS_WIN) | |
258 // OEM Deal confirmation storage functions. OEM Deals are windows-only. | |
259 | |
260 // Makes the OEM Deal Confirmation code writable by all users on the machine. | |
261 // This should be called before calling SetMachineDealCode from a non-admin | |
262 // account. | |
263 // Access: HKLM write. | |
264 bool RLZ_LIB_API CreateMachineState(void); | |
265 | |
266 // Set the OEM Deal Confirmation Code (DCC). This information is used for RLZ | |
267 // initalization. | |
268 // Access: HKLM write, or | |
269 // HKCU read if rlz_lib::CreateMachineState() has been sucessfully called. | |
270 bool RLZ_LIB_API SetMachineDealCode(const char* dcc); | |
271 | |
272 // Get the DCC cgi argument string to append to a daily ping. | |
273 // Should be used only by OEM deal trackers. Applications should use the | |
274 // GetMachineDealCode method which has an AccessPoint paramter. | |
275 // Access: HKLM read. | |
276 bool RLZ_LIB_API GetMachineDealCodeAsCgi(char* cgi, size_t cgi_size); | |
277 | |
278 // Get the DCC value stored in registry. | |
279 // Should be used only by OEM deal trackers. Applications should use the | |
280 // GetMachineDealCode method which has an AccessPoint paramter. | |
281 // Access: HKLM read. | |
282 bool RLZ_LIB_API GetMachineDealCode(char* dcc, size_t dcc_size); | |
283 | |
284 // Parses a ping response, checks if it is valid and sets the machine DCC | |
285 // from the response. The ping must also contain the current DCC value in | |
286 // order to be considered valid. | |
287 // Access: HKLM write; | |
288 // HKCU write if CreateMachineState() has been successfully called. | |
289 bool RLZ_LIB_API SetMachineDealCodeFromPingResponse(const char* response); | |
290 | |
291 #endif | |
292 | |
293 // Segment RLZ persistence based on branding information. | |
294 // All information for a given product is persisted under keys with the either | |
295 // product's name or its access point's name. This assumes that only | |
296 // one instance of the product is installed on the machine, and that only one | |
297 // product brand is associated with it. | |
298 // | |
299 // In some cases, a given product may be using supplementary brands. The RLZ | |
300 // information must be kept separately for each of these brands. To achieve | |
301 // this segmentation, scope all RLZ library calls that deal with supplementary | |
302 // brands within the lifetime of an rlz_lib::ProductBranding instance. | |
303 // | |
304 // For example, to record events for a supplementary brand, do the following: | |
305 // | |
306 // { | |
307 // rlz_lib::SupplementaryBranding branding("AAAA"); | |
308 // // This call to RecordProductEvent is scoped to the AAAA brand. | |
309 // rlz_lib::RecordProductEvent(rlz_lib::DESKTOP, rlz_lib::GD_DESKBAND, | |
310 // rlz_lib::INSTALL); | |
311 // } | |
312 // | |
313 // // This call to RecordProductEvent is not scoped to any supplementary brand. | |
314 // rlz_lib::RecordProductEvent(rlz_lib::DESKTOP, rlz_lib::GD_DESKBAND, | |
315 // rlz_lib::INSTALL); | |
316 // | |
317 // In particular, this affects the recording of stateful events and the sending | |
318 // of financial pings. In the former case, a stateful event recorded while | |
319 // scoped to a supplementary brand will be recorded again when scoped to a | |
320 // different supplementary brand (or not scoped at all). In the latter case, | |
321 // the time skip check is specific to each supplementary brand. | |
322 class SupplementaryBranding { | |
323 public: | |
324 SupplementaryBranding(const char* brand); | |
325 ~SupplementaryBranding(); | |
326 | |
327 static const std::string& GetBrand(); | |
328 | |
329 private: | |
330 ScopedRlzValueStoreLock* lock_; | |
331 }; | |
332 | |
333 } // namespace rlz_lib | |
334 | |
335 #endif // RLZ_LIB_RLZ_LIB_H_ | |
OLD | NEW |