11#include < assert.h>
22#include < base64.h>
33#include < utils.h>
4+ #include < ConvertUTF.h>
45#include < fcntl.h>
56#include " ../WinPort/src/SavedScreen.h"
67
@@ -267,6 +268,14 @@ void VTFar2lExtensios::OnInterract_ClipboardIsFormatAvailable(StackSerializer &s
267268 stk_ser.PushPOD (out);
268269}
269270
271+ void ClipboardData_Local2Remote (UINT fmt, void *&data, uint32_t &len)
272+ {
273+ }
274+
275+ void ClipboardData_Remote2Local (UINT fmt, void *&data, uint32_t &len)
276+ {
277+ }
278+
270279void VTFar2lExtensios::OnInterract_ClipboardSetData (StackSerializer &stk_ser)
271280{
272281 char out = -1 ;
@@ -280,6 +289,23 @@ void VTFar2lExtensios::OnInterract_ClipboardSetData(StackSerializer &stk_ser)
280289 if (len) {
281290 data = malloc (len);
282291 stk_ser.Pop (data, len);
292+ #if (__WCHAR_MAX__ <= 0xffff)
293+ if (fmt == CF_UNICODETEXT ) { // UTF32 -> UTF16
294+ int cnt = 0 ;
295+ const UTF32 *src = (const UTF32 *)data;
296+ CalcSpaceUTF32toUTF16 (&cnt, &src, src + len / sizeof (UTF32 ), lenientConversion);
297+ UTF16 *new_data = (UTF16 *)malloc ((cnt + 1 ) * sizeof (UTF16 ));
298+ if (new_data != nullptr ) {
299+ new_data[cnt] = 0 ;
300+ src = (const UTF32 *)data;
301+ UTF16 *dst = new_data;
302+ ConvertUTF32toUTF16 ( &src, src + len / sizeof (UTF32 ), &dst, dst + cnt, lenientConversion);
303+ free (data);
304+ data = new_data;
305+ len = cnt * sizeof (UTF16 );
306+ }
307+ }
308+ #endif
283309 } else
284310 data = nullptr ;
285311
@@ -297,11 +323,32 @@ void VTFar2lExtensios::OnInterract_ClipboardGetData(StackSerializer &stk_ser)
297323
298324 UINT fmt;
299325 stk_ser.PopPOD (fmt);
300- void *ptr = allowed ? WINPORT (GetClipboardData)(fmt) : nullptr ;
326+ void *data = allowed ? WINPORT (GetClipboardData)(fmt) : nullptr ;
301327 stk_ser.Clear ();
302- uint32_t len = ptr ? GetMallocSize (ptr) : 0 ;
303- if (len)
304- stk_ser.Push (ptr, len);
328+ uint32_t len = data ? GetMallocSize (data) : 0 ;
329+ if (len) {
330+ #if (__WCHAR_MAX__ <= 0xffff)
331+ UTF32 *new_data = nullptr ;
332+ if (fmt == CF_UNICODETEXT ) { // UTF16 -> UTF32
333+ int cnt = 0 ;
334+ const UTF16 *src = (const UTF16 *)data;
335+ CalcSpaceUTF16toUTF32 (&cnt, &src, src + len / sizeof (UTF16 ), lenientConversion);
336+ new_data = (UTF32 *)malloc ((cnt + 1 ) * sizeof (UTF32 ));
337+ if (new_data != nullptr ) {
338+ new_data[cnt] = 0 ;
339+ src = (const UTF16 *)data;
340+ UTF32 *dst = new_data;
341+ ConvertUTF16toUTF32 ( &src, src + len / sizeof (UTF16 ), &dst, dst + cnt, lenientConversion);
342+ data = new_data;
343+ len = cnt * sizeof (UTF32 );
344+ }
345+ }
346+ stk_ser.Push (data, len);
347+ free (new_data);
348+ #else
349+ stk_ser.Push (data, len);
350+ #endif
351+ }
305352 stk_ser.PushPOD (len);
306353
307354 if (allowed) { // prolong allowance
0 commit comments