1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_PATH_SERVICE_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_PATH_SERVICE_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/base_paths.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h" 11*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker namespace base { 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker class FilePath; 16*6777b538SAndroid Build Coastguard Worker class ScopedPathOverride; 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker // The path service is a global table mapping keys to file system paths. It is 19*6777b538SAndroid Build Coastguard Worker // OK to use this service from multiple threads. 20*6777b538SAndroid Build Coastguard Worker // 21*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT PathService { 22*6777b538SAndroid Build Coastguard Worker public: 23*6777b538SAndroid Build Coastguard Worker // Populates |path| with a special directory or file. Returns true on success, 24*6777b538SAndroid Build Coastguard Worker // in which case |path| is guaranteed to have a non-empty value. On failure, 25*6777b538SAndroid Build Coastguard Worker // |path| will not be changed. 26*6777b538SAndroid Build Coastguard Worker static bool Get(int key, FilePath* path); 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker // Returns the corresponding path; CHECKs that the operation succeeds. 29*6777b538SAndroid Build Coastguard Worker static FilePath CheckedGet(int key); 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker // Overrides the path to a special directory or file. This cannot be used to 32*6777b538SAndroid Build Coastguard Worker // change the value of DIR_CURRENT, but that should be obvious. Also, if the 33*6777b538SAndroid Build Coastguard Worker // path specifies a directory that does not exist, the directory will be 34*6777b538SAndroid Build Coastguard Worker // created by this method. This method returns true if successful. 35*6777b538SAndroid Build Coastguard Worker // 36*6777b538SAndroid Build Coastguard Worker // If the given path is relative, then it will be resolved against 37*6777b538SAndroid Build Coastguard Worker // DIR_CURRENT. 38*6777b538SAndroid Build Coastguard Worker // 39*6777b538SAndroid Build Coastguard Worker // WARNING: Consumers of PathService::Get may expect paths to be constant 40*6777b538SAndroid Build Coastguard Worker // over the lifetime of the app, so this method should be used with caution. 41*6777b538SAndroid Build Coastguard Worker // 42*6777b538SAndroid Build Coastguard Worker // Unit tests generally should use ScopedPathOverride instead. Overrides from 43*6777b538SAndroid Build Coastguard Worker // one test should not carry over to another. 44*6777b538SAndroid Build Coastguard Worker static bool Override(int key, const FilePath& path); 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker // This function does the same as PathService::Override but it takes extra 47*6777b538SAndroid Build Coastguard Worker // parameters: 48*6777b538SAndroid Build Coastguard Worker // - |is_absolute| indicates that |path| has already been expanded into an 49*6777b538SAndroid Build Coastguard Worker // absolute path, otherwise MakeAbsoluteFilePath() will be used. This is 50*6777b538SAndroid Build Coastguard Worker // useful to override paths that may not exist yet, since MakeAbsoluteFilePath 51*6777b538SAndroid Build Coastguard Worker // fails for those. Note that MakeAbsoluteFilePath also expands symbolic 52*6777b538SAndroid Build Coastguard Worker // links, even if path.IsAbsolute() is already true. 53*6777b538SAndroid Build Coastguard Worker // - |create| guides whether the directory to be overriden must 54*6777b538SAndroid Build Coastguard Worker // be created in case it doesn't exist already. 55*6777b538SAndroid Build Coastguard Worker static bool OverrideAndCreateIfNeeded(int key, 56*6777b538SAndroid Build Coastguard Worker const FilePath& path, 57*6777b538SAndroid Build Coastguard Worker bool is_absolute, 58*6777b538SAndroid Build Coastguard Worker bool create); 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker // Returns whether an override is present for a special directory or file. 61*6777b538SAndroid Build Coastguard Worker static bool IsOverriddenForTesting(int key); 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker // To extend the set of supported keys, you can register a path provider, 64*6777b538SAndroid Build Coastguard Worker // which is just a function mirroring PathService::Get. The ProviderFunc 65*6777b538SAndroid Build Coastguard Worker // returns false if it cannot provide a non-empty path for the given key. 66*6777b538SAndroid Build Coastguard Worker // Otherwise, true is returned. 67*6777b538SAndroid Build Coastguard Worker // 68*6777b538SAndroid Build Coastguard Worker // WARNING: This function could be called on any thread from which the 69*6777b538SAndroid Build Coastguard Worker // PathService is used, so a the ProviderFunc MUST BE THREADSAFE. 70*6777b538SAndroid Build Coastguard Worker // 71*6777b538SAndroid Build Coastguard Worker typedef bool (*ProviderFunc)(int, FilePath*); 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker // Call to register a path provider. You must specify the range "[key_start, 74*6777b538SAndroid Build Coastguard Worker // key_end)" of supported path keys. 75*6777b538SAndroid Build Coastguard Worker static void RegisterProvider(ProviderFunc provider, 76*6777b538SAndroid Build Coastguard Worker int key_start, 77*6777b538SAndroid Build Coastguard Worker int key_end); 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker // Disable internal cache. 80*6777b538SAndroid Build Coastguard Worker static void DisableCache(); 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker private: 83*6777b538SAndroid Build Coastguard Worker friend class ScopedPathOverride; 84*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(PathServiceTest, RemoveOverride); 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Worker // Removes an override for a special directory or file. Returns true if there 87*6777b538SAndroid Build Coastguard Worker // was an override to remove or false if none was present. 88*6777b538SAndroid Build Coastguard Worker static bool RemoveOverrideForTests(int key); 89*6777b538SAndroid Build Coastguard Worker }; 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker } // namespace base 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker #endif // BASE_PATH_SERVICE_H_ 94