1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_rlz_module.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
83f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread_restrictions.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/values.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "rlz/win/lib/lib_values.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool GetProductFromName(const std::string& product_name,
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        rlz_lib::Product* product) {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool success = true;
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (product_name[0]) {
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 'B':
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *product = rlz_lib::FF_TOOLBAR;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 'C':
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *product = rlz_lib::CHROME;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 'D':
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *product = rlz_lib::DESKTOP;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 'K':
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *product = rlz_lib::QSB_WIN;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 'N':
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *product = rlz_lib::PINYIN_IME;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 'P':
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *product = rlz_lib::TOOLBAR_NOTIFIER;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 'T':
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *product = rlz_lib::IE_TOOLBAR;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 'U':
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *product = rlz_lib::PACK;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 'W':
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *product = rlz_lib::WEBAPPS;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      success = false;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return success;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool GetEventFromName(const std::string& event_name,
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      rlz_lib::Event* event_id) {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *event_id = rlz_lib::INVALID_EVENT;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (event_name == "install") {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *event_id = rlz_lib::INSTALL;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (event_name == "set-to-google") {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *event_id = rlz_lib::SET_TO_GOOGLE;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (event_name == "first-search") {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *event_id = rlz_lib::FIRST_SEARCH;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (event_name == "activate") {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *event_id = rlz_lib::ACTIVATE;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return *event_id != rlz_lib::INVALID_EVENT;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RlzRecordProductEventFunction::RunImpl() {
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This can be slow if registry access goes to disk. Should preferably
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // perform registry operations on the File thread.
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //   http://code.google.com/p/chromium/issues/detail?id=62098
77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::ThreadRestrictions::ScopedAllowIO allow_io;
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string product_name;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &product_name));
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::Product product;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(GetProductFromName(product_name, &product));
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string ap_name;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &ap_name));
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::AccessPoint access_point;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(rlz_lib::GetAccessPointFromName(ap_name.c_str(),
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                              &access_point));
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string event_name;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &event_name));
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::Event event_id;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(GetEventFromName(event_name, &event_id));
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return rlz_lib::RecordProductEvent(product, access_point, event_id);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RlzGetAccessPointRlzFunction::RunImpl() {
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This can be slow if registry access goes to disk. Should preferably
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // perform registry operations on the File thread.
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //   http://code.google.com/p/chromium/issues/detail?id=62098
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::ThreadRestrictions::ScopedAllowIO allow_io;
103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string ap_name;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &ap_name));
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::AccessPoint access_point;
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(rlz_lib::GetAccessPointFromName(ap_name.c_str(),
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                              &access_point));
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char rlz[rlz_lib::kMaxRlzLength + 1];
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::GetAccessPointRlz(access_point, rlz, rlz_lib::kMaxRlzLength);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result_.reset(Value::CreateStringValue(rlz));
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RlzSendFinancialPingFunction::RunImpl() {
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This can be slow if registry access goes to disk. Should preferably
118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // perform registry operations on the File thread.
119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //   http://code.google.com/p/chromium/issues/detail?id=62098
120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::ThreadRestrictions::ScopedAllowIO allow_io;
121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string product_name;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &product_name));
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::Product product;
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(GetProductFromName(product_name, &product));
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ListValue* access_points_list;
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetList(1, &access_points_list));
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (access_points_list->GetSize() < 1) {
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXTENSION_FUNCTION_ERROR("Access point array should not be empty.");
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Allocate an access point array to pass to ClearProductState().  The array
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // must be termindated with the value rlz_lib::NO_ACCESS_POINT, hence + 1
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when allocating the array.
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_array<rlz_lib::AccessPoint> access_points(
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new rlz_lib::AccessPoint[access_points_list->GetSize() + 1]);
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t i;
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (i = 0; i < access_points_list->GetSize(); ++i) {
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string ap_name;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXTENSION_FUNCTION_VALIDATE(access_points_list->GetString(i, &ap_name));
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXTENSION_FUNCTION_VALIDATE(rlz_lib::GetAccessPointFromName(
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ap_name.c_str(), &access_points[i]));
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  access_points[i] = rlz_lib::NO_ACCESS_POINT;
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string signature;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &signature));
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string brand;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(3, &brand));
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string id;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &id));
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string lang;
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(5, &lang));
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool exclude_machine_id;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(6, &exclude_machine_id));
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // rlz_lib::SendFinancialPing() will not send a ping more often than once in
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // any 24-hour period.  Calling it more often has no effect.  If a ping is
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // not sent false is returned, but this is not an error, so we should not
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // use the return value of rlz_lib::SendFinancialPing() as the return value
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // of this function.  Callers interested in the return value can register
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // an optional callback function.
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool sent = rlz_lib::SendFinancialPing(product, access_points.get(),
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                         signature.c_str(), brand.c_str(),
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                         id.c_str(), lang.c_str(),
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                         exclude_machine_id);
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  result_.reset(Value::CreateBooleanValue(sent));
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return true;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RlzClearProductStateFunction::RunImpl() {
178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This can be slow if registry access goes to disk. Should preferably
179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // perform registry operations on the File thread.
180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //   http://code.google.com/p/chromium/issues/detail?id=62098
181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::ThreadRestrictions::ScopedAllowIO allow_io;
182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string product_name;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &product_name));
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::Product product;
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(GetProductFromName(product_name, &product));
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ListValue* access_points_list;
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetList(1, &access_points_list));
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (access_points_list->GetSize() < 1) {
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXTENSION_FUNCTION_ERROR("Access point array should not be empty.");
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Allocate an access point array to pass to ClearProductState().  The array
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // must be termindated with the value rlz_lib::NO_ACCESS_POINT, hence + 1
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when allocating the array.
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_array<rlz_lib::AccessPoint> access_points(
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new rlz_lib::AccessPoint[access_points_list->GetSize() + 1]);
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t i;
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (i = 0; i < access_points_list->GetSize(); ++i) {
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string ap_name;
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXTENSION_FUNCTION_VALIDATE(access_points_list->GetString(i, &ap_name));
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXTENSION_FUNCTION_VALIDATE(rlz_lib::GetAccessPointFromName(
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ap_name.c_str(), &access_points[i]));
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  access_points[i] = rlz_lib::NO_ACCESS_POINT;
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rlz_lib::ClearProductState(product, access_points.get());
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
212