// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROMEOS_BINDER_WRITABLE_TRANSACTION_DATA_H_ #define CHROMEOS_BINDER_WRITABLE_TRANSACTION_DATA_H_ #include #include #include #include "base/files/scoped_file.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/strings/string16.h" #include "chromeos/binder/transaction_data.h" #include "chromeos/chromeos_export.h" namespace binder { class Object; // Use this class to construct TransactionData (as parameters and replies) to // transact with remote objects. // GetSenderPID() and GetSenderEUID() return 0. // // Note: Unlike D-Bus, the binder driver doesn't care about the validity of // contents being communicated. Packed data is treated simply as a blob, so it // doesn't provide any string encoding check, endian conversion, nor type // information about the packed data. It's developers' responsibility to ensure // that the sending process and the receiving process are handling the // transaction data in the same manner. class CHROMEOS_EXPORT WritableTransactionData : public TransactionData { public: WritableTransactionData(); ~WritableTransactionData() override; // TransactionData override: uintptr_t GetCookie() const override; uint32_t GetCode() const override; pid_t GetSenderPID() const override; uid_t GetSenderEUID() const override; bool IsOneWay() const override; bool HasStatus() const override; Status GetStatus() const override; const void* GetData() const override; size_t GetDataSize() const override; const binder_uintptr_t* GetObjectOffsets() const override; size_t GetNumObjectOffsets() const override; // Expands the capacity of the internal buffer. void Reserve(size_t n); // Sets the transaction code returned by GetCode(). void SetCode(uint32_t code) { code_ = code; } // Sets the value returned by IsOneWay(). void SetIsOneWay(bool is_one_way) { is_one_way_ = is_one_way; } // Appends the specified data with appropriate padding. void WriteData(const void* data, size_t n); // Appends an int32_t value. void WriteInt32(int32_t value); // Appends a uint32_t value. void WriteUint32(uint32_t value); // Appends an int64_t vlaue. void WriteInt64(int64_t value); // Appends a uint64_t value. void WriteUint64(uint64_t value); // Appends a float value. void WriteFloat(float value); // Appends a double value. void WriteDouble(double value); // Appends a null-terminated C string. void WriteCString(const char* value); // Appends a string. void WriteString(const std::string& value); // Appends a UTF-16 string. void WriteString16(const base::string16& value); // Appends an RPC header. // |interface| is the interface which must be implemented by the receiving // process (e.g. android.os.IServiceManager). // |strict_mode_policy| is the current thread's strict mode policy. // (see http://developer.android.com/reference/android/os/StrictMode.html) void WriteInterfaceToken(const base::string16& interface, int32_t strict_mode_policy); // Appends an object. void WriteObject(scoped_refptr object); // Appends a file descriptor. void WriteFileDescriptor(base::ScopedFD fd); private: uint32_t code_ = 0; bool is_one_way_ = false; std::vector data_; std::vector object_offsets_; std::vector> objects_; std::vector files_; DISALLOW_COPY_AND_ASSIGN(WritableTransactionData); }; } // namespace binder #endif // CHROMEOS_BINDER_WRITABLE_TRANSACTION_DATA_H_