diff options
-rw-r--r-- | Android.bp | 7 | ||||
-rw-r--r-- | gatekeeper.cpp | 2 | ||||
-rw-r--r-- | include/gatekeeper/UniquePtr.h | 137 | ||||
-rw-r--r-- | include/gatekeeper/gatekeeper.h | 2 | ||||
-rw-r--r-- | include/gatekeeper/gatekeeper_messages.h | 2 |
5 files changed, 147 insertions, 3 deletions
@@ -16,6 +16,10 @@ // GoogleGateKeeper implementation, e.g. one running in TrustZone. cc_library_shared { name: "libgatekeeper", + vendor_available: true, + vndk: { + enabled: true, + }, srcs: [ "gatekeeper_messages.cpp", "gatekeeper.cpp", @@ -25,6 +29,9 @@ cc_library_shared { "-Werror", "-g", ], + header_libs: [ + "libhardware_headers", + ], export_include_dirs: ["include"], diff --git a/gatekeeper.cpp b/gatekeeper.cpp index cfd878f..83e84fe 100644 --- a/gatekeeper.cpp +++ b/gatekeeper.cpp @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include <UniquePtr.h> +#include <gatekeeper/UniquePtr.h> #include <gatekeeper/gatekeeper.h> #include <endian.h> diff --git a/include/gatekeeper/UniquePtr.h b/include/gatekeeper/UniquePtr.h new file mode 100644 index 0000000..77ff99f --- /dev/null +++ b/include/gatekeeper/UniquePtr.h @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GATEKEEPER_UNIQUE_PTR_H_included +#define GATEKEEPER_UNIQUE_PTR_H_included + +#include <stdlib.h> // For NULL. + +namespace gatekeeper { + +// Default deleter for pointer types. +template <typename T> +struct DefaultDelete { + enum { type_must_be_complete = sizeof(T) }; + DefaultDelete() {} + void operator()(T* p) const { + delete p; + } +}; + +// Default deleter for array types. +template <typename T> +struct DefaultDelete<T[]> { + enum { type_must_be_complete = sizeof(T) }; + void operator()(T* p) const { + delete[] p; + } +}; + +// A smart pointer that deletes the given pointer on destruction. +// Equivalent to C++0x's std::unique_ptr (a combination of boost::scoped_ptr +// and boost::scoped_array). +// Named to be in keeping with Android style but also to avoid +// collision with any other implementation, until we can switch over +// to unique_ptr. +// Use thus: +// UniquePtr<C> c(new C); +template <typename T, typename D = DefaultDelete<T> > +class UniquePtr { +public: + // Construct a new UniquePtr, taking ownership of the given raw pointer. + explicit UniquePtr(T* ptr = NULL) : mPtr(ptr) { + } + + ~UniquePtr() { + reset(); + } + + // Accessors. + T& operator*() const { return *mPtr; } + T* operator->() const { return mPtr; } + T* get() const { return mPtr; } + + // Returns the raw pointer and hands over ownership to the caller. + // The pointer will not be deleted by UniquePtr. + T* release() __attribute__((warn_unused_result)) { + T* result = mPtr; + mPtr = NULL; + return result; + } + + // Takes ownership of the given raw pointer. + // If this smart pointer previously owned a different raw pointer, that + // raw pointer will be freed. + void reset(T* ptr = NULL) { + if (ptr != mPtr) { + D()(mPtr); + mPtr = ptr; + } + } + +private: + // The raw pointer. + T* mPtr; + + // Comparing unique pointers is probably a mistake, since they're unique. + template <typename T2> bool operator==(const UniquePtr<T2>& p) const; + template <typename T2> bool operator!=(const UniquePtr<T2>& p) const; + + // Disallow copy and assignment. + UniquePtr(const UniquePtr&); + void operator=(const UniquePtr&); +}; + +// Partial specialization for array types. Like std::unique_ptr, this removes +// operator* and operator-> but adds operator[]. +template <typename T, typename D> +class UniquePtr<T[], D> { +public: + explicit UniquePtr(T* ptr = NULL) : mPtr(ptr) { + } + + ~UniquePtr() { + reset(); + } + + T& operator[](size_t i) const { + return mPtr[i]; + } + T* get() const { return mPtr; } + + T* release() __attribute__((warn_unused_result)) { + T* result = mPtr; + mPtr = NULL; + return result; + } + + void reset(T* ptr = NULL) { + if (ptr != mPtr) { + D()(mPtr); + mPtr = ptr; + } + } + +private: + T* mPtr; + + // Disallow copy and assignment. + UniquePtr(const UniquePtr&); + void operator=(const UniquePtr&); +}; + +} //namespace gatekeeper +#endif // GATEKEEPER_UNIQUE_PTR_H_included diff --git a/include/gatekeeper/gatekeeper.h b/include/gatekeeper/gatekeeper.h index 7e1421f..c5cd5dd 100644 --- a/include/gatekeeper/gatekeeper.h +++ b/include/gatekeeper/gatekeeper.h @@ -18,7 +18,7 @@ #define GATEKEEPER_H_ #include <stdint.h> -#include <UniquePtr.h> +#include <gatekeeper/UniquePtr.h> #include <hardware/hw_auth_token.h> #include "gatekeeper_messages.h" diff --git a/include/gatekeeper/gatekeeper_messages.h b/include/gatekeeper/gatekeeper_messages.h index 1ec1e18..3cbd817 100644 --- a/include/gatekeeper/gatekeeper_messages.h +++ b/include/gatekeeper/gatekeeper_messages.h @@ -17,7 +17,7 @@ #define GATEKEEPER_MESSAGES_H_ #include <stdint.h> -#include <UniquePtr.h> +#include <gatekeeper/UniquePtr.h> #include "gatekeeper_utils.h" |