xref: /aosp_15_r20/external/cronet/base/scoped_native_library.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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