From ea965b5579f38ba748a285a2c616038864244d26 Mon Sep 17 00:00:00 2001 From: Taehyub Kim Date: Thu, 9 Nov 2023 19:26:59 +0900 Subject: [PATCH] DragAndDrop : The write function has been modified to be performed repeatedly until data transmission is complete Change-Id: Id801c90022322c8494b51c510d172bc69222eee4 --- .../tizen-wayland/drag-and-drop-impl-ecore-wl2.cpp | 56 +++++++++++++++------- .../tizen-wayland/drag-and-drop-impl-ecore-wl2.h | 6 +++ 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.cpp b/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.cpp index b3c3123..0d48113 100644 --- a/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.cpp +++ b/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.cpp @@ -363,6 +363,39 @@ void DragAndDropEcoreWl::ResetDropTargets() } } +static Eina_Bool WriteDelayedDataTofd(void *data, Ecore_Fd_Handler *fd_handler) +{ + int fd; + size_t len; + DelayedWritingData *slice = (DelayedWritingData*)data; + + fd = ecore_main_fd_handler_fd_get(fd_handler); + if(fd < 0) + { + ecore_main_fd_handler_del(fd_handler); + free(slice->slice.mem); + free(slice); + return EINA_FALSE; + } + + len = write(fd, (char*)slice->slice.mem + slice->writtenBytes, + slice->slice.len - slice->writtenBytes); + + slice->writtenBytes += len; + if(slice->writtenBytes != slice->slice.len) + { + return EINA_TRUE; + } + else + { + ecore_main_fd_handler_del(fd_handler); + free(slice->slice.mem); + free(slice); + if (fd > -1) close(fd); + return EINA_FALSE; + } +} + void DragAndDropEcoreWl::SendData(void* event) { Ecore_Wl2_Event_Data_Source_Send* ev = reinterpret_cast(event); @@ -380,24 +413,13 @@ void DragAndDropEcoreWl::SendData(void* event) bufferSize += 1; } - char* buffer = new char[bufferSize]; - if(!buffer) - { - return; - } - - memcpy(buffer, mData.c_str(), dataLength); - buffer[dataLength] = '\0'; - - auto ret = write(ev->fd, buffer, bufferSize); - if(DALI_UNLIKELY(ret != bufferSize)) - { - DALI_LOG_ERROR("write(ev->fd) return %d! Pleacse check it\n", static_cast(ret)); - } - - close(ev->fd); + DelayedWritingData *data = (DelayedWritingData*)calloc(1, sizeof(DelayedWritingData)); + data->slice.mem = new char[bufferSize]; + data->slice.len = bufferSize; + memcpy(data->slice.mem, mData.c_str(), dataLength); + ((char*)data->slice.mem)[dataLength] = '\0'; - delete[] buffer; + ecore_main_fd_handler_add(ev->fd, ECORE_FD_WRITE, WriteDelayedDataTofd, data, NULL, NULL); } void DragAndDropEcoreWl::ReceiveData(void* event) diff --git a/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.h b/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.h index 341f68e..5f53985 100644 --- a/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.h +++ b/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.h @@ -30,6 +30,12 @@ namespace Internal { namespace Adaptor { + +struct DelayedWritingData{ + Eina_Rw_Slice slice; + unsigned int writtenBytes; +}; + struct DropTarget { Dali::Actor target; -- 2.7.4