@@ -1458,9 +1458,8 @@ drag_process_item_data(Window *w, size_t idx, int has_more, const uint8_t *paylo
14581458 }
14591459 size_t written = 0 ;
14601460 while (written < outlen ) {
1461- ssize_t n = write (ds .items [idx ].fd_plus_one - 1 , decoded + written , outlen - written );
1461+ ssize_t n = safe_write (ds .items [idx ].fd_plus_one - 1 , decoded + written , outlen - written );
14621462 if (n < 0 ) {
1463- if (errno == EINTR ) continue ;
14641463 cancel_drag (w , EIO );
14651464 return ;
14661465 }
@@ -1542,6 +1541,46 @@ parse_uri_list(Window *w, int fd, size_t *num_uris_out) {
15421541 return result ;
15431542}
15441543
1544+ static int
1545+ write_all (int fd , const void * buf , size_t sz ) {
1546+ size_t pos = 0 ; const char * p = buf ;
1547+ while (pos < sz ) {
1548+ ssize_t ret = safe_write (fd , p + pos , sz - pos );
1549+ if (ret < 0 ) return ret ;
1550+ pos += ret ;
1551+ }
1552+ return 0 ;
1553+ }
1554+
1555+ static void
1556+ finish_remote_data (Window * w , size_t item_idx ) {
1557+ const int fd = ds .items [item_idx ].fd_plus_one - 1 ;
1558+ if (safe_ftruncate (fd , 0 ) != 0 ) abrt (errno );
1559+ if (lseek (fd , 0 , SEEK_SET ) == -1 ) abrt (errno );
1560+ for (size_t i = 0 ; i < ds .items [item_idx ].num_uris ; i ++ ) {
1561+ int ret = write_all (fd , ds .items [item_idx ].uri_list [i ], strlen (ds .items [item_idx ].uri_list [i ]));
1562+ free ((char * )ds .items [item_idx ].uri_list [i ]); ds .items [item_idx ].uri_list [i ] = NULL ;
1563+ if (ret ) abrt (ret );
1564+ if ((ret = write_all (fd , "\r\n" , 2 ))) abrt (ret );
1565+ }
1566+ free (ds .items [item_idx ].uri_list ); ds .items [item_idx ].uri_list = NULL ; ds .items [item_idx ].num_uris = 0 ;
1567+ int ret = notify_drag_data_ready (global_state .drag_source .from_os_window , ds .items [item_idx ].mime_type );
1568+ abrt (ret );
1569+ }
1570+
1571+ static void
1572+ toplevel_data_for_drag (Window * w , unsigned uri_item_idx , unsigned item_type , bool has_more , const uint8_t * payload , size_t payload_sz ) {
1573+ (void )w ; (void )uri_item_idx ; (void )item_type ; (void )has_more ; (void )payload ; (void )payload_sz ;
1574+ }
1575+
1576+ static void
1577+ subdir_data_for_drag (
1578+ Window * w , unsigned uri_item_idx , int handle , unsigned entry_num , unsigned item_type , bool has_more ,
1579+ const uint8_t * payload , size_t payload_sz
1580+ ) {
1581+ (void )w ; (void )uri_item_idx ; (void )item_type ; (void )has_more ; (void )payload ; (void )payload_sz ; (void )handle ; (void )entry_num ;
1582+ }
1583+
15451584
15461585void
15471586drag_remote_file_data (
@@ -1558,8 +1597,10 @@ drag_remote_file_data(
15581597 ds .items [item_idx ].uri_list = parse_uri_list (w , ds .items [item_idx ].fd_plus_one - 1 , & ds .items [item_idx ].num_uris );
15591598 if (!ds .items [item_idx ].uri_list ) return ;
15601599 }
1561- (void )x ; (void )y ; (void )X ; (void )Y ; (void )has_more ; (void )payload ; (void )payload_sz ;
1562- // TODO: Implement this
1600+ if (X < 0 ) abrt (EINVAL );
1601+ if (!x && !y && !Y ) { finish_remote_data (w , item_idx ); return ; }
1602+ if (!Y ) toplevel_data_for_drag (w , x - 1 , X , has_more , payload , payload_sz );
1603+ else subdir_data_for_drag (w , x - 1 , Y , y - 1 , X , has_more , payload , payload_sz );
15631604}
15641605#undef img
15651606#undef abrt
0 commit comments