Add parcel_read_ptr function 57/316457/2
authorjh9216.park <jh9216.park@samsung.com>
Thu, 22 Aug 2024 00:30:57 +0000 (20:30 -0400)
committerjh9216.park <jh9216.park@samsung.com>
Wed, 28 Aug 2024 00:27:05 +0000 (20:27 -0400)
Change-Id: I00edbce58d19c98854bc300d3ffa110a1c2835e5
Signed-off-by: jh9216.park <jh9216.park@samsung.com>
src/parcel/api/parcel.h
src/parcel/parcel.cc
src/parcel/parcel.hh
src/parcel/parcel_implementation.hh
src/parcel/stub.cc
tests/parcel_unittests/test_parcel.cc

index 10dbaba807e602103571de043645bddaed1a85c6..d16909c91f55306acb144faa9dc4f29a10d2a1c9 100644 (file)
@@ -127,6 +127,19 @@ int parcel_burst_write(parcel_h parcel, const void *buf, uint32_t size);
  */
 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
index ca54911ed12f309bae15bae0522187b8763ec698..76508329df6df36e7cc92209fe96c744d5814656 100644 (file)
@@ -144,6 +144,15 @@ int Parcel::Impl::Read(T* d) {
   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;
 }
@@ -299,6 +308,10 @@ int Parcel::Read(void* buf, uint32_t size) {
   return impl_->Read(buf, size);
 }
 
+void* Parcel::ReadPtr(uint32_t size) {
+  return impl_->ReadPtr(size);
+}
+
 void Parcel::WriteBool(bool val) {
   impl_->Write<bool>(val);
 }
index 7d94d00737cd3ccfe5c870645df472197cd2501f..965a2082fcae1e0f77b028d412fb06eae205559c 100644 (file)
@@ -126,6 +126,15 @@ class EXPORT Parcel final {
    */
   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
index d9a9c7d5817b4cf5caad4319e5047c71226c364a..d6951f109304c9298ab22f809072944c3300a1f8 100644 (file)
@@ -43,6 +43,7 @@ class Parcel::Impl {
   template <typename T>
   int Read(T* d);
 
+  void* ReadPtr(uint32_t size);
   void SetByteOrder(bool big_endian);
   bool IsBigEndian() const;
   uint8_t* GetData() const;
index 245e3acc4102f62a96e6e744225cd4974623573b..bf2a78c64bccd808e88d6cf107c82267ba67cf40 100644 (file)
@@ -93,6 +93,17 @@ extern "C" EXPORT int parcel_burst_read(parcel_h parcel, void *buf,
   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");
index a2bc1b8ee96634ce7e5fd1ee62e5851298d7fe25..28c049d14b8ddf4f0e80eda4d8276ae287b2cb35 100644 (file)
@@ -565,3 +565,15 @@ TEST_F(ParcelTest, parcel_set_data_capacity_N) {
   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);
+}