1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef NVRAM_MESSAGES_BLOB_H_
18 #define NVRAM_MESSAGES_BLOB_H_
19 
20 extern "C" {
21 #include <stddef.h>
22 #include <stdint.h>
23 }
24 
25 #include <nvram/messages/compiler.h>
26 
27 namespace nvram {
28 
29 // A simple wrapper class holding binary data of fixed size.
30 //
31 // This is intended for use in restricted environments where there is no full
32 // C++ standard library available and/or memory allocation failure must be
33 // handled gracefully.
34 class NVRAM_EXPORT Blob {
35  public:
36   Blob();
37   ~Blob();
38 
39   // Blob is movable, but not copyable since the latter requires memory
40   // allocations, which can fail.
41   Blob(const Blob& other) = delete;
42   Blob& operator=(const Blob& other) = delete;
43   Blob(Blob&& other);
44   Blob& operator=(Blob&& other);
45   friend void swap(Blob& first, Blob& second);
46 
data()47   uint8_t* data() { return data_; }
data()48   const uint8_t* data() const { return data_; }
49 
size()50   size_t size() const { return size_; }
51 
52   // Reallocate the underlying buffer to hold |size| bytes and copy in |data|.
53   // Returns true on success, false if memory allocation fails. Blob size and
54   // contents remain unchanged upon failure.
55   bool Assign(const void* data, size_t size) NVRAM_WARN_UNUSED_RESULT;
56 
57   // Resize the blob to |size|. Existing data within the new |size| limit is
58   // retained. If |size| increases, new contents are unspecified. Returns true
59   // on success, false if memory allocation fails. Blob size and contents remain
60   // unchanged upon failure.
61   //
62   // Note that calling this function invalidates pointers to the memory block
63   // backing this |Blob|. You must call |data()| after |Resize()| returns to
64   // obtain fresh valid pointers.
65   bool Resize(size_t size) NVRAM_WARN_UNUSED_RESULT;
66 
67  private:
68   uint8_t* data_ = nullptr;
69   size_t size_ = 0;
70 };
71 
72 }  // namespace nvram
73 
74 #endif  // NVRAM_MESSAGES_BLOB_H_
75