1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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_SCOPED_NATIVE_LIBRARY_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_SCOPED_NATIVE_LIBRARY_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/native_library.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/scoped_generic.h" 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker namespace base { 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker class FilePath; 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT NativeLibraryTraits { 17*6777b538SAndroid Build Coastguard Worker // It's assumed that this is a fast inline function with little-to-no 18*6777b538SAndroid Build Coastguard Worker // penalty for duplicate calls. This must be a static function even 19*6777b538SAndroid Build Coastguard Worker // for stateful traits. InvalidValueNativeLibraryTraits20*6777b538SAndroid Build Coastguard Worker static NativeLibrary InvalidValue() { return nullptr; } 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker // This free function will not be called if library == InvalidValue()! 23*6777b538SAndroid Build Coastguard Worker static void Free(NativeLibrary library); 24*6777b538SAndroid Build Coastguard Worker }; 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker // A class which encapsulates a base::NativeLibrary object available only in a 27*6777b538SAndroid Build Coastguard Worker // scope. 28*6777b538SAndroid Build Coastguard Worker // This class automatically unloads the loaded library in its destructor. 29*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ScopedNativeLibrary 30*6777b538SAndroid Build Coastguard Worker : public ScopedGeneric<NativeLibrary, NativeLibraryTraits> { 31*6777b538SAndroid Build Coastguard Worker public: 32*6777b538SAndroid Build Coastguard Worker // Initializes with a NULL library. 33*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary(); 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // Takes ownership of the given library handle. 36*6777b538SAndroid Build Coastguard Worker explicit ScopedNativeLibrary(NativeLibrary library); 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker // Opens the given library and manages its lifetime. 39*6777b538SAndroid Build Coastguard Worker explicit ScopedNativeLibrary(const FilePath& library_path); 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker // Move constructor. Takes ownership of handle stored in |scoped_library| 42*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary(ScopedNativeLibrary&& scoped_library); 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker // Move assignment operator. Takes ownership of handle stored in 45*6777b538SAndroid Build Coastguard Worker // |scoped_library|. 46*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary& operator=(ScopedNativeLibrary&& scoped_library) = 47*6777b538SAndroid Build Coastguard Worker default; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary(const ScopedNativeLibrary&) = delete; 50*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary& operator=(const ScopedNativeLibrary&) = delete; 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker ~ScopedNativeLibrary() override; 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker void* GetFunctionPointer(const char* function_name) const; 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker const NativeLibraryLoadError* GetError() const; 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker private: 59*6777b538SAndroid Build Coastguard Worker NativeLibraryLoadError error_; 60*6777b538SAndroid Build Coastguard Worker }; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker } // namespace base 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker #endif // BASE_SCOPED_NATIVE_LIBRARY_H_ 65