1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/component_updater/component_updater_paths.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/lazy_instance.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/path_service.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace component_updater {
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// This key gives the root directory of all the component installations.
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)static int g_components_root_key = -1;
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool PathProvider(int key, base::FilePath* result) {
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_GT(g_components_root_key, 0);
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Early exit here to prevent a potential infinite loop when we retrieve
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // the path for g_components_root_key.
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (key < PATH_START || key > PATH_END)
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return false;
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::FilePath cur;
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!PathService::Get(g_components_root_key, &cur))
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return false;
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (key) {
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case DIR_COMPONENT_CLD2:
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cur = cur.Append(FILE_PATH_LITERAL("CLD"));
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case DIR_RECOVERY_BASE:
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cur = cur.Append(FILE_PATH_LITERAL("recovery"));
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case DIR_SWIFT_SHADER:
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cur = cur.Append(FILE_PATH_LITERAL("SwiftShader"));
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case DIR_SW_REPORTER:
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cur = cur.Append(FILE_PATH_LITERAL("SwReporter"));
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case DIR_COMPONENT_EV_WHITELIST:
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      cur = cur.Append(FILE_PATH_LITERAL("EVWhitelist"));
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    default:
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return false;
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *result = cur;
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This cannot be done as a static initializer sadly since Visual Studio will
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// eliminate this object file if there is no direct entry point into it.
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RegisterPathProvider(int components_root_key) {
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_EQ(g_components_root_key, -1);
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_GT(components_root_key, 0);
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(components_root_key < PATH_START || components_root_key > PATH_END);
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  g_components_root_key = components_root_key;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PathService::RegisterProvider(PathProvider, PATH_START, PATH_END);
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace component_updater
67