int rpc_port_parcel_set_reader(rpc_port_parcel_h h, unsigned int reader_pos);
int rpc_port_parcel_read_fd(rpc_port_parcel_h h, int* fd);
int rpc_port_parcel_write_fd(rpc_port_parcel_h h, int fd);
+int rpc_port_parcel_clone(rpc_port_parcel_h* h, rpc_port_parcel_h origin);
#ifdef __cplusplus
}
constexpr const int MAX_NR_OF_DESCRIPTORS = 32;
+Parcel::Parcel(const Parcel& p) {
+ if (p.header_) header_.reset(new ParcelHeader(*p.header_));
+ parcelable_fds_ = p.parcelable_fds_;
+ handle_.reset(new tizen_base::Parcel(*p.handle_));
+}
+
+Parcel& Parcel::operator=(const Parcel& p) {
+ if (this != &p) {
+ if (p.header_) header_.reset(new ParcelHeader(*p.header_));
+ parcelable_fds_ = p.parcelable_fds_;
+ handle_.reset(new tizen_base::Parcel(*p.handle_));
+ }
+
+ return *this;
+}
+
Parcel::Parcel(bool without_header)
: header_(without_header ? nullptr : new ParcelHeader()) {
handle_.reset(new tizen_base::Parcel());
}
-Parcel::Parcel(bool without_header, tizen_base::Parcel* parcel)
+Parcel::Parcel(bool without_header, tizen_base::Parcel* parcel,
+ const Parcel& origin)
: header_(without_header ? nullptr : new ParcelHeader()) {
handle_.reset(parcel);
+ parcelable_fds_ = origin.parcelable_fds_;
}
Parcel::~Parcel() {}
tizen_base::Parcel* Parcel::GetRawParcel() const { return raw_parcel_.get(); }
+void Parcel::Dup() {
+ for (auto& i : parcelable_fds_) {
+ i = dup(i);
+ }
+}
+
int Parcel::GetParcelableFd(uint32_t idx) const {
if (idx >= parcelable_fds_.size()) {
return -1;
#include <parcel.h>
+#include <memory>
#include <parcel.hh>
#include <parcelable.hh>
-#include <memory>
-
#include "parcel-header-internal.hh"
namespace rpc_port {
class Parcel : public tizen_base::Parcelable {
public:
- Parcel(bool without_header = false);
- Parcel(bool without_header, tizen_base::Parcel* parcel);
- ~Parcel();
+ Parcel(bool without_header = false);
+ Parcel(bool without_header, tizen_base::Parcel* parcel, const Parcel& origin);
+ Parcel(const Parcel& p);
+ ~Parcel();
+
+ Parcel& operator=(const Parcel& p);
void WriteToParcel(tizen_base::Parcel* parcel) const override;
void ReadFromParcel(tizen_base::Parcel* parcel) override;
void PushBackParcelableFd(int fd);
void WriteParcelableFds(int socket_fd);
void ReadParcelableFds(int socket_fd, int cnt);
+ void Dup();
private:
bool DoWriteParcelableFds(int socket_fd, int start_idx, int cnt);
std::unique_ptr<ParcelHeader> header_;
std::unique_ptr<tizen_base::Parcel> handle_;
- std::unique_ptr<tizen_base::Parcel> raw_parcel_ { nullptr };
+ std::unique_ptr<tizen_base::Parcel> raw_parcel_{nullptr};
std::vector<int> parcelable_fds_;
};
return RPC_PORT_ERROR_NONE;
}
+RPC_API int rpc_port_parcel_clone(rpc_port_parcel_h* h,
+ rpc_port_parcel_h origin) {
+ if (h == nullptr || origin == nullptr)
+ return RPC_PORT_ERROR_INVALID_PARAMETER;
+
+ auto* parcel = static_cast<internal::Parcel*>(origin);
+ auto* new_parcel = new internal::Parcel(*parcel);
+
+ new_parcel->Dup();
+ *h = static_cast<rpc_port_parcel_h>(new_parcel);
+
+ return RPC_PORT_ERROR_NONE;
+}
+
RPC_API int rpc_port_parcel_create_from_raw(rpc_port_parcel_h* h,
const void* raw,
unsigned int size) {
try {
auto* new_parcel = new internal::Parcel(
- true, new tizen_base::Parcel(*ih, start_pos, size));
+ true, new tizen_base::Parcel(*ih, start_pos, size), *parcel);
*h = static_cast<rpc_port_parcel_h>(new_parcel);
} catch (...) {
return RPC_PORT_ERROR_OUT_OF_MEMORY;