*/
int parcel_burst_read(parcel_h parcel, void *buf, uint32_t size);
+/**
+ * @brief Gets a pointer to read bytes from the parcel handle.
+ * @since_tizen 9.0
+ * @param[in] parcel The parcel handle
+ * @param[in] size The size of bytes to read
+ * @param[out] ptr The pointer to read bytes
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ * @retval #PARCEL_ERROR_NONE Successful
+ * @retval #PARCEL_ERROR_INVALID_PARAMETER Invalid parameter
+ */
+int parcel_read_ptr(parcel_h parcel, void** ptr, uint32_t size);
+
/**
* @brief Writes a boolean value into the parcel handle.
* @since_tizen 6.5
return TIZEN_ERROR_NONE;
}
+void* Parcel::Impl::ReadPtr(uint32_t size) {
+ if (reader_ + size > data_size_)
+ return nullptr;
+ auto* ptr = data_ + reader_;
+ reader_ += size;
+
+ return ptr;
+}
+
void Parcel::Impl::SetByteOrder(bool big_endian) {
big_endian_ = big_endian;
}
return impl_->Read(buf, size);
}
+void* Parcel::ReadPtr(uint32_t size) {
+ return impl_->ReadPtr(size);
+}
+
void Parcel::WriteBool(bool val) {
impl_->Write<bool>(val);
}
*/
int Read(void* buf, uint32_t size);
+
+ /**
+ * @brief Gets a pointer to read bytes from the parcel.
+ * @since_tizen 9.0
+ * @param[in] size The size of bytes to read
+ * @return A pointer to read bytes
+ */
+ void* ReadPtr(uint32_t size);
+
/**
* @brief Writes a boolean value into the parcel.
* @since_tizen 6.5
template <typename T>
int Read(T* d);
+ void* ReadPtr(uint32_t size);
void SetByteOrder(bool big_endian);
bool IsBigEndian() const;
uint8_t* GetData() const;
return PARCEL_ERROR_NONE;
}
+extern "C" int parcel_read_ptr(parcel_h parcel, void** ptr, uint32_t size) {
+ if (parcel == nullptr || size == 0) {
+ _E("Invalid parameter");
+ return PARCEL_ERROR_INVALID_PARAMETER;
+ }
+
+ auto* h = static_cast<Parcel*>(parcel);
+ *ptr = h->ReadPtr(size);
+ return PARCEL_ERROR_NONE;
+}
+
extern "C" EXPORT int parcel_write_bool(parcel_h parcel, bool val) {
if (parcel == nullptr) {
_E("Invalid parameter");
int ret = parcel_set_data_capacity(nullptr, 0);
ASSERT_EQ(ret, PARCEL_ERROR_INVALID_PARAMETER);
}
+
+TEST_F(ParcelTest, parcel_read_ptr_P) {
+ char buf[1024] = { 1, 2, 3, };
+ int ret = parcel_burst_write(GetHandle(), buf, sizeof(buf));
+ ASSERT_EQ(ret, PARCEL_ERROR_NONE);
+ char* ptr = nullptr;
+ ret = parcel_read_ptr(GetHandle(), reinterpret_cast<void**>(&ptr), sizeof(buf));
+ ASSERT_NE(ptr, nullptr);
+ EXPECT_EQ(ptr[0], 1);
+ EXPECT_EQ(ptr[1], 2);
+ EXPECT_EQ(ptr[2], 3);
+}