15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import os 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.core import util 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# TODO(dtu): Move these functions from core.util to here. 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GetBaseDir = util.GetBaseDir 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GetTelemetryDir = util.GetTelemetryDir 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GetUnittestDataDir = util.GetUnittestDataDir 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GetChromiumSrcDir = util.GetChromiumSrcDir 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)AddDirToPythonPath = util.AddDirToPythonPath 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GetBuildDirectories = util.GetBuildDirectories 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def IsExecutable(path): 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return os.path.isfile(path) and os.access(path, os.X_OK) 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def FindInstalledWindowsApplication(application_path): 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """Search common Windows installation directories for an application. 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Args: 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) application_path: Path to application relative from installation location. 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Returns: 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) A string representing the full path, or None if not found. 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) search_paths = [os.getenv('PROGRAMFILES(X86)'), 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) os.getenv('PROGRAMFILES'), 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) os.getenv('LOCALAPPDATA')] 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) search_paths += os.getenv('PATH', '').split(os.pathsep) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for search_path in search_paths: 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not search_path: 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) continue 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) path = os.path.join(search_path, application_path) 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if IsExecutable(path): 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return path 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return None 44