Changeset 80283 in vbox
- Timestamp:
- Aug 15, 2019 8:47:23 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 132738
- Location:
- trunk
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/GuestHost/SharedClipboard-uri.h
r79703 r80283 70 70 71 71 /** No flags. Initialization value. */ 72 #define SHAREDCLIPBOARD_ CF_NONE (0x00000000)72 #define SHAREDCLIPBOARD_OBJ_CF_NONE (0x00000000) 73 73 74 74 /** Lookup only the object, do not return a handle. All other flags are ignored. */ 75 #define SHAREDCLIPBOARD_ CF_LOOKUP (0x00000001)75 #define SHAREDCLIPBOARD_OBJ_CF_LOOKUP (0x00000001) 76 76 77 77 /** Create/open a directory. */ 78 #define SHAREDCLIPBOARD_ CF_DIRECTORY (0x00000004)78 #define SHAREDCLIPBOARD_OBJ_CF_DIRECTORY (0x00000004) 79 79 80 80 /** Open/create action to do if object exists … … 87 87 * FILE_EXISTS with NIL handle. 88 88 */ 89 #define SHAREDCLIPBOARD_ CF_ACT_MASK_IF_EXISTS (0x000000F0)90 #define SHAREDCLIPBOARD_ CF_ACT_MASK_IF_NEW (0x00000F00)89 #define SHAREDCLIPBOARD_OBJ_CF_ACT_MASK_IF_EXISTS (0x000000F0) 90 #define SHAREDCLIPBOARD_OBJ_CF_ACT_MASK_IF_NEW (0x00000F00) 91 91 92 92 /** What to do if object exists. */ 93 #define SHAREDCLIPBOARD_ CF_ACT_OPEN_IF_EXISTS (0x00000000)94 #define SHAREDCLIPBOARD_ CF_ACT_FAIL_IF_EXISTS (0x00000010)95 #define SHAREDCLIPBOARD_ CF_ACT_REPLACE_IF_EXISTS (0x00000020)96 #define SHAREDCLIPBOARD_ CF_ACT_OVERWRITE_IF_EXISTS (0x00000030)93 #define SHAREDCLIPBOARD_OBJ_CF_ACT_OPEN_IF_EXISTS (0x00000000) 94 #define SHAREDCLIPBOARD_OBJ_CF_ACT_FAIL_IF_EXISTS (0x00000010) 95 #define SHAREDCLIPBOARD_OBJ_CF_ACT_REPLACE_IF_EXISTS (0x00000020) 96 #define SHAREDCLIPBOARD_OBJ_CF_ACT_OVERWRITE_IF_EXISTS (0x00000030) 97 97 98 98 /** What to do if object does not exist. */ 99 #define SHAREDCLIPBOARD_ CF_ACT_CREATE_IF_NEW (0x00000000)100 #define SHAREDCLIPBOARD_ CF_ACT_FAIL_IF_NEW (0x00000100)99 #define SHAREDCLIPBOARD_OBJ_CF_ACT_CREATE_IF_NEW (0x00000000) 100 #define SHAREDCLIPBOARD_OBJ_CF_ACT_FAIL_IF_NEW (0x00000100) 101 101 102 102 /** Read/write requested access for the object. */ 103 #define SHAREDCLIPBOARD_ CF_ACCESS_MASK_RW (0x00003000)103 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_MASK_RW (0x00003000) 104 104 105 105 /** No access requested. */ 106 #define SHAREDCLIPBOARD_ CF_ACCESS_NONE (0x00000000)106 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_NONE (0x00000000) 107 107 /** Read access requested. */ 108 #define SHAREDCLIPBOARD_ CF_ACCESS_READ (0x00001000)108 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_READ (0x00001000) 109 109 /** Write access requested. */ 110 #define SHAREDCLIPBOARD_ CF_ACCESS_WRITE (0x00002000)110 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_WRITE (0x00002000) 111 111 /** Read/Write access requested. */ 112 #define SHAREDCLIPBOARD_ CF_ACCESS_READWRITE (SHAREDCLIPBOARD_CF_ACCESS_READ | SHAREDCLIPBOARD_CF_ACCESS_WRITE)112 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_READWRITE (SHAREDCLIPBOARD_OBJ_CF_ACCESS_READ | SHAREDCLIPBOARD_OBJ_CF_ACCESS_WRITE) 113 113 114 114 /** Requested share access for the object. */ 115 #define SHAREDCLIPBOARD_ CF_ACCESS_MASK_DENY (0x0000C000)115 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_MASK_DENY (0x0000C000) 116 116 117 117 /** Allow any access. */ 118 #define SHAREDCLIPBOARD_ CF_ACCESS_DENYNONE (0x00000000)118 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_DENYNONE (0x00000000) 119 119 /** Do not allow read. */ 120 #define SHAREDCLIPBOARD_ CF_ACCESS_DENYREAD (0x00004000)120 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_DENYREAD (0x00004000) 121 121 /** Do not allow write. */ 122 #define SHAREDCLIPBOARD_ CF_ACCESS_DENYWRITE (0x00008000)122 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_DENYWRITE (0x00008000) 123 123 /** Do not allow access. */ 124 #define SHAREDCLIPBOARD_ CF_ACCESS_DENYALL (SHAREDCLIPBOARD_CF_ACCESS_DENYREAD | SHAREDCLIPBOARD_CF_ACCESS_DENYWRITE)124 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_DENYALL (SHAREDCLIPBOARD_OBJ_CF_ACCESS_DENYREAD | SHAREDCLIPBOARD_OBJ_CF_ACCESS_DENYWRITE) 125 125 126 126 /** Requested access to attributes of the object. */ 127 #define SHAREDCLIPBOARD_ CF_ACCESS_MASK_ATTR (0x00030000)127 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_MASK_ATTR (0x00030000) 128 128 129 129 /** No access requested. */ 130 #define SHAREDCLIPBOARD_ CF_ACCESS_ATTR_NONE (0x00000000)130 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_ATTR_NONE (0x00000000) 131 131 /** Read access requested. */ 132 #define SHAREDCLIPBOARD_ CF_ACCESS_ATTR_READ (0x00010000)132 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_ATTR_READ (0x00010000) 133 133 /** Write access requested. */ 134 #define SHAREDCLIPBOARD_ CF_ACCESS_ATTR_WRITE (0x00020000)134 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_ATTR_WRITE (0x00020000) 135 135 /** Read/Write access requested. */ 136 #define SHAREDCLIPBOARD_ CF_ACCESS_ATTR_READWRITE (SHAREDCLIPBOARD_CF_ACCESS_ATTR_READ | SHAREDCLIPBOARD_CF_ACCESS_ATTR_WRITE)137 138 /** The file is opened in append mode. Ignored if SHAREDCLIPBOARD_ CF_ACCESS_WRITE is not set. */139 #define SHAREDCLIPBOARD_ CF_ACCESS_APPEND (0x00040000)136 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_ATTR_READWRITE (SHAREDCLIPBOARD_OBJ_CF_ACCESS_ATTR_READ | SHAREDCLIPBOARD_OBJ_CF_ACCESS_ATTR_WRITE) 137 138 /** The file is opened in append mode. Ignored if SHAREDCLIPBOARD_OBJ_CF_ACCESS_WRITE is not set. */ 139 #define SHAREDCLIPBOARD_OBJ_CF_ACCESS_APPEND (0x00040000) 140 140 141 141 /** @} */ … … 327 327 328 328 #pragma pack(1) 329 typedef struct _VBOXCLIPBOARDCREATEPARMS 330 { 331 /** Returned SHAREDCLIPBOARDOBJHANDLE of opened object. */ 332 SHAREDCLIPBOARDOBJHANDLE uHandle; 333 /** Returned result of the operation. */ 334 SHAREDCLIPBOARDCREATERESULT enmResult; 335 /** SHAREDCLIPBOARD_CF_* */ 329 /** 330 * Structure for keeping object open/create parameters. 331 */ 332 typedef struct _VBOXCLIPBOARDOBJOPENCREATEPARMS 333 { 334 char *pszPath; 335 uint32_t cbPath; 336 /** SHAREDCLIPBOARD_OBJ_CF_* */ 336 337 uint32_t fCreate; 337 338 /** … … 340 341 */ 341 342 SHAREDCLIPBOARDFSOBJINFO ObjInfo; 342 } VBOXCLIPBOARD CREATEPARMS, *PVBOXCLIPBOARDCREATEPARMS;343 } VBOXCLIPBOARDOBJOPENCREATEPARMS, *PVBOXCLIPBOARDOBJOPENCREATEPARMS; 343 344 #pragma pack() 344 345 … … 369 370 } VBOXCLIPBOARDREPLY, *PVBOXCLIPBOARDREPLY; 370 371 371 /** 372 * Structure for keeping Shared Clipboard list root entries. 373 */ 374 typedef struct _VBOXCLIPBOARDROOTS 372 struct _VBOXCLIPBOARDLISTENTRY; 373 typedef _VBOXCLIPBOARDLISTENTRY VBOXCLIPBOARDLISTENTRY; 374 375 /** Defines a single root list entry. Currently the same as a regular list entry. */ 376 typedef VBOXCLIPBOARDLISTENTRY VBOXCLIPBOARDROOTLISTENTRY; 377 /** Defines a pointer to a single root list entry. Currently the same as a regular list entry pointer. */ 378 typedef VBOXCLIPBOARDROOTLISTENTRY *PVBOXCLIPBOARDROOTLISTENTRY; 379 380 /** 381 * Structure for keeping Shared Clipboard root list headers. 382 */ 383 typedef struct _VBOXCLIPBOARDROOTLISTHDR 375 384 { 376 385 /** Roots listing flags; unused at the moment. */ 377 uint32_t fRoots; 378 /** Boolean indicating that more root items are following. */ 379 bool fMore; 380 /** Number of root items in this message. */ 381 uint32_t cRoots; 382 /** Size (in bytes) of string list. */ 383 uint32_t cbRoots; 384 /** String list (separated with CRLF) containing the root items. */ 385 char *pszRoots; 386 } VBOXCLIPBOARDROOTS, *PVBOXCLIPBOARDROOTS; 386 uint32_t fRoots; 387 /** Number of root list entries. */ 388 uint32_t cRoots; 389 } VBOXCLIPBOARDROOTLISTHDR, *PVBOXCLIPBOARDROOTLISTHDR; 390 391 /** 392 * Structure for maintaining a Shared Clipboard root list. 393 */ 394 typedef struct _VBOXCLIPBOARDROOTLIST 395 { 396 /** Root list header. */ 397 VBOXCLIPBOARDROOTLISTHDR Hdr; 398 /** Root list entries. */ 399 VBOXCLIPBOARDROOTLISTENTRY *paEntries; 400 } VBOXCLIPBOARDROOTLIST, *PVBOXCLIPBOARDROOTLIST; 387 401 388 402 /** … … 437 451 } VBOXCLIPBOARDLISTENTRY, *PVBOXCLIPBOARDLISTENTRY; 438 452 439 #define VBOXCLIPBOARDLISTENTRY_MAX_NAME RTPATH_MAX 453 /** Maximum length (in UTF-8 characters) of a list entry name. */ 454 #define VBOXCLIPBOARDLISTENTRY_MAX_NAME RTPATH_MAX /** @todo Improve this to be more dynamic. */ 455 456 /** 457 * Structure for maintaining a Shared Clipboard list. 458 */ 459 typedef struct _VBOXCLIPBOARDLIST 460 { 461 /** List header. */ 462 VBOXCLIPBOARDLISTHDR Hdr; 463 /** List entries. */ 464 VBOXCLIPBOARDROOTLISTENTRY *paEntries; 465 } VBOXCLIPBOARDLIST, *PVBOXCLIPBOARDLIST; 440 466 441 467 /** … … 579 605 int SharedClipboardPathSanitize(char *pszPath, size_t cbPath); 580 606 581 PVBOXCLIPBOARDROOTS SharedClipboardURIRootsDup(PVBOXCLIPBOARDROOTS pRoots); 582 int SharedClipboardURIRootsInit(PVBOXCLIPBOARDROOTS pRoots); 583 void SharedClipboardURIRootsDestroy(PVBOXCLIPBOARDROOTS pRoots); 607 PVBOXCLIPBOARDROOTLIST SharedClipboardURIRootListAlloc(void); 608 void SharedClipboardURIRootListFree(PVBOXCLIPBOARDROOTLIST pRootList); 609 610 PVBOXCLIPBOARDROOTLISTHDR SharedClipboardURIRootListHdrDup(PVBOXCLIPBOARDROOTLISTHDR pRoots); 611 int SharedClipboardURIRootListHdrInit(PVBOXCLIPBOARDROOTLISTHDR pRoots); 612 void SharedClipboardURIRootListHdrDestroy(PVBOXCLIPBOARDROOTLISTHDR pRoots); 613 614 int SharedClipboardURIRootListEntryCopy(PVBOXCLIPBOARDROOTLISTENTRY pDst, PVBOXCLIPBOARDROOTLISTENTRY pSrc); 615 PVBOXCLIPBOARDROOTLISTENTRY SharedClipboardURIRootListEntryDup(PVBOXCLIPBOARDROOTLISTENTRY pRootListEntry); 616 void SharedClipboardURIRootListEntryDestroy(PVBOXCLIPBOARDROOTLISTENTRY pRootListEntry); 584 617 585 618 int SharedClipboardURIListHdrAlloc(PVBOXCLIPBOARDLISTHDR *ppListHdr); … … 686 719 } SHAREDCLIPBOARDURITRANSFEREVENT, *PSHAREDCLIPBOARDURITRANSFEREVENT; 687 720 688 /**689 * Enumeration for an URI transfer event type.690 */691 typedef enum _SHAREDCLIPBOARDURITRANSFEREVENTTYPE692 {693 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_UNKNOWN,694 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_GET_ROOTS,695 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN,696 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_CLOSE,697 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_READ,698 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE,699 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_READ,700 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE,701 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_OBJ_OPEN,702 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_OBJ_CLOSE,703 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_OBJ_READ,704 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_OBJ_WRITE,705 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_ERROR,706 /** Marks the end of the event list. */707 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LAST,708 /** The usual 32-bit hack. */709 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_32BIT_HACK = 0x7fffffff710 } SHAREDCLIPBOARDURITRANSFEREVENTTYPE;711 712 721 /** Map of URI transfer events. 713 722 * The key specifies the event type of SHAREDCLIPBOARDURITRANSFEREVENTTYPE. */ 714 typedef std::map<uint 32_t, SHAREDCLIPBOARDURITRANSFEREVENT *> SharedClipboardURITransferEventMap;723 typedef std::map<uint16_t, SHAREDCLIPBOARDURITRANSFEREVENT *> SharedClipboardURITransferEventMap; 715 724 716 725 typedef struct _SHAREDCLIPBOARDURILISTHANDLEINFO … … 750 759 typedef std::map<SHAREDCLIPBOARDOBJHANDLE, SHAREDCLIPBOARDURILISTHANDLEINFO *> SharedClipboardURIObjMap; 751 760 761 /** 762 * Structure for keeping a single root list entry. 763 * 764 * Warning: Contains non-POD types. 765 */ 766 typedef struct _SHAREDCLIPBOARDURILISTROOT 767 { 768 /** Absolute path of entry. */ 769 RTCString strPathAbs; 770 } SHAREDCLIPBOARDURILISTROOT, *PSHAREDCLIPBOARDURILISTROOT; 771 752 772 /** List of URI list root entries. */ 753 typedef RTCList< RTCString> SharedClipboardURIListRootEntries;773 typedef RTCList<SHAREDCLIPBOARDURILISTROOT> SharedClipboardURIListRootEntries; 754 774 755 775 /** … … 759 779 typedef struct _SHAREDCLIPBOARDURITRANSFERSTATE 760 780 { 781 /** The transfer's (local) ID. */ 782 uint16_t uID; 761 783 /** The transfer's current status. */ 762 784 SHAREDCLIPBOARDURITRANSFERSTATUS enmStatus; … … 803 825 SHAREDCLIPBOARDPROVIDERFUNCDECLVOID(TRANSFEROPEN) 804 826 SHAREDCLIPBOARDPROVIDERFUNCDECLVOID(TRANSFERCLOSE) 805 SHAREDCLIPBOARDPROVIDERFUNCDECL(GETROOTS, char **ppapszRoots, uint32_t *pcRoots)827 SHAREDCLIPBOARDPROVIDERFUNCDECL(GETROOTS, PVBOXCLIPBOARDROOTLIST *ppRootList); 806 828 SHAREDCLIPBOARDPROVIDERFUNCDECL(LISTOPEN, PVBOXCLIPBOARDLISTOPENPARMS pOpenParms, PSHAREDCLIPBOARDLISTHANDLE phList) 807 829 SHAREDCLIPBOARDPROVIDERFUNCDECL(LISTCLOSE, SHAREDCLIPBOARDLISTHANDLE hList); … … 810 832 SHAREDCLIPBOARDPROVIDERFUNCDECL(LISTENTRYREAD, SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pEntry) 811 833 SHAREDCLIPBOARDPROVIDERFUNCDECL(LISTENTRYWRITE, SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pEntry) 812 SHAREDCLIPBOARDPROVIDERFUNCDECL(OBJOPEN, const char *pszPath, PVBOXCLIPBOARDCREATEPARMS pCreateParms, PSHAREDCLIPBOARDOBJHANDLE phObj)834 SHAREDCLIPBOARDPROVIDERFUNCDECL(OBJOPEN, PVBOXCLIPBOARDOBJOPENCREATEPARMS pCreateParms, PSHAREDCLIPBOARDOBJHANDLE phObj) 813 835 SHAREDCLIPBOARDPROVIDERFUNCDECL(OBJCLOSE, SHAREDCLIPBOARDOBJHANDLE hObj) 814 836 SHAREDCLIPBOARDPROVIDERFUNCDECL(OBJREAD, SHAREDCLIPBOARDOBJHANDLE hObj, void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbRead) … … 934 956 /** The transfer's state (for SSM, later). */ 935 957 SHAREDCLIPBOARDURITRANSFERSTATE State; 958 /** Timeout (in ms) for waiting of events. Default is 30s. */ 959 RTMSINTERVAL uTimeoutMs; 960 /** Maximum data chunk size (in bytes) to transfer. Default is 64K. */ 961 uint32_t cbMaxChunkSize; 936 962 /** Events related to this transfer. */ 937 963 SharedClipboardURITransferEventMap *pMapEvents; 964 /** Next upcoming list handle. */ 965 uint64_t uListHandleNext; 938 966 /** Map of all lists related to this transfer. */ 939 967 SharedClipboardURIListMap *pMapLists; 940 968 /** List of root entries of this transfer. */ 941 969 SharedClipboardURIListRootEntries lstRootEntries; 970 /** Next upcoming object handle. */ 971 uint64_t uObjHandleNext; 972 /** Next upcoming event ID. 973 * 0 is reserved for invalid event IDs. */ 974 uint16_t uEventIDNext; 942 975 /** Map of all objects related to this transfer. */ 943 976 SharedClipboardURIObjMap *pMapObj; … … 982 1015 bool SharedClipboardURIObjCtxIsValid(PSHAREDCLIPBOARDCLIENTURIOBJCTX pObjCtx); 983 1016 1017 int SharedClipboardURIObjectOpen(PSHAREDCLIPBOARDURITRANSFER pTransfer, PVBOXCLIPBOARDOBJOPENCREATEPARMS pOpenCreateParms, 1018 PSHAREDCLIPBOARDOBJHANDLE phObj); 1019 int SharedClipboardURIObjectClose(SHAREDCLIPBOARDOBJHANDLE hObj); 1020 int SharedClipboardURIObjectRead(SHAREDCLIPBOARDOBJHANDLE hObj, void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead, uint32_t fFlags); 1021 int SharedClipboardURIObjectWrite(SHAREDCLIPBOARDOBJHANDLE hObj, void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten, uint32_t fFlags); 1022 int SharedClipboardURIObjectQueryInfo(SHAREDCLIPBOARDOBJHANDLE hObj, PSHAREDCLIPBOARDFSOBJINFO pObjInfo); 1023 984 1024 int SharedClipboardURITransferCreate(SHAREDCLIPBOARDURITRANSFERDIR enmDir, SHAREDCLIPBOARDSOURCE enmSource, 985 1025 PSHAREDCLIPBOARDURITRANSFER *ppTransfer); … … 1009 1049 void SharedClipboardURITransferReset(PSHAREDCLIPBOARDURITRANSFER pTransfer); 1010 1050 SharedClipboardArea *SharedClipboardURITransferGetArea(PSHAREDCLIPBOARDURITRANSFER pTransfer); 1011 int SharedClipboardURILTransferGetRoots(PSHAREDCLIPBOARDURITRANSFER pTransfer, char **ppapszRoots, uint32_t *pcRoots); 1051 1052 uint32_t SharedClipboardURILTransferRootsCount(PSHAREDCLIPBOARDURITRANSFER pTransfer); 1053 int SharedClipboardURILTransferRootsEntry(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t uIndex, PVBOXCLIPBOARDLISTENTRY pEntry); 1054 int SharedClipboardURILTransferRootsAsList(PSHAREDCLIPBOARDURITRANSFER pTransfer, PVBOXCLIPBOARDROOTLIST *ppRootList); 1055 1012 1056 SHAREDCLIPBOARDSOURCE SharedClipboardURITransferGetSource(PSHAREDCLIPBOARDURITRANSFER pTransfer); 1013 1057 SHAREDCLIPBOARDURITRANSFERSTATUS SharedClipboardURITransferGetStatus(PSHAREDCLIPBOARDURITRANSFER pTransfer); … … 1021 1065 void SharedClipboardURITransferPayloadFree(PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload); 1022 1066 1023 int SharedClipboardURITransferEventRegister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t uID); 1024 int SharedClipboardURITransferEventUnregister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t uID); 1025 int SharedClipboardURITransferEventWait(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t uID, RTMSINTERVAL uTimeoutMs, 1067 uint16_t SharedClipboardURITransferEventIDGenerate(PSHAREDCLIPBOARDURITRANSFER pTransfer); 1068 int SharedClipboardURITransferEventRegister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID); 1069 int SharedClipboardURITransferEventUnregister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID); 1070 int SharedClipboardURITransferEventWait(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID, RTMSINTERVAL uTimeoutMs, 1026 1071 PSHAREDCLIPBOARDURITRANSFERPAYLOAD *ppPayload); 1027 int SharedClipboardURITransferEventSignal(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint 32_t uID, PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload);1072 int SharedClipboardURITransferEventSignal(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID, PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload); 1028 1073 1029 1074 int SharedClipboardURITransferRead(PSHAREDCLIPBOARDURITRANSFER pTransfer); -
trunk/include/VBox/GuestHost/clipboard-helper.h
r79178 r80283 190 190 */ 191 191 void VBoxClipboardDbgDumpData(const void *pv, size_t cb, VBOXCLIPBOARDFORMAT u32Format); 192 193 /** 194 * Translates a Shared Clipboard host message enum to a string. 195 * 196 * @returns Message ID string name. 197 * @param uMsg The message to translate. 198 */ 199 const char *VBoxClipboardHostMsgToStr(uint32_t uMsg); 200 201 /** 202 * Translates a Shared Clipboard guest message enum to a string. 203 * 204 * @returns Message ID string name. 205 * @param uMsg The message to translate. 206 */ 207 const char *VBoxClipboardGuestMsgToStr(uint32_t uMsg); 192 208 #endif /* LOG_ENABLED */ 193 209 -
trunk/include/VBox/HostServices/VBoxClipboardSvc.h
r79703 r80283 74 74 75 75 /** Initiates a new transfer (read / write) on the guest side. */ 76 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START 50 77 /** Requests reading the root entries from the guest. */ 78 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOTS 51 76 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START 50 77 /** Reads the root list header from the guest. */ 78 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_READ 51 79 /** Writes the root list header to the guest. */ 80 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_WRITE 52 81 /** Reads a root list entry from the guest. */ 82 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_ENTRY_READ 53 83 /** Writes a root list entry to the guest. */ 84 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_ENTRY_WRITE 54 79 85 /** Open an URI list on the guest side. */ 80 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN 5286 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN 55 81 87 /** Closes a formerly opened URI list on the guest side. */ 82 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE 5388 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE 56 83 89 /** Reads a list header from the guest. */ 84 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ 5490 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ 57 85 91 /** Writes a list header to the guest. */ 86 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_WRITE 5592 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_WRITE 58 87 93 /** Reads a list entry from the guest. */ 88 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ 5694 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ 59 89 95 /** Writes a list entry to the guest. */ 90 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_WRITE 5796 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_WRITE 60 91 97 /** Open an URI object on the guest side. */ 92 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN 5898 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN 61 93 99 /** Closes a formerly opened URI object on the guest side. */ 94 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_CLOSE 59100 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_CLOSE 62 95 101 /** Reads from an object on the guest side. */ 96 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_READ 60102 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_READ 63 97 103 /** Writes to an object on the guest side. */ 98 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE 61104 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE 64 99 105 /** Indicates that the host has canceled a transfer. */ 100 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_CANCEL 62106 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_CANCEL 65 101 107 /** Indicates that the an unrecoverable error on the host occurred . */ 102 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ERROR 63108 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ERROR 66 103 109 104 110 /* … … 118 124 /** Peeks at the next message, returning immediately. 119 125 * New since URI handling was implemented. */ 120 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT 5126 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT 5 121 127 /** Peeks at the next message, waiting for one to arrive. 122 128 * New since URI handling was implemented. */ 123 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT 6129 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT 6 124 130 /** Gets the next message, returning immediately. 125 131 * New since URI handling was implemented. */ 126 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET 7132 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET 7 127 133 /** Sends a transfer status to the host. 128 134 * New since URI handling was implemented. */ 129 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS 8135 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS 8 130 136 /** Replies to a function from the host. 131 137 * New since URI handling was implemented. */ 132 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY 9138 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY 9 133 139 /** Reports the available root entries of a transfer. 134 * New since URI handling was implemented. */ 135 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOTS 10 140 * New since URI handling was implemented. */ 141 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_READ 10 142 /** Reports the available root entries of a transfer. 143 * New since URI handling was implemented. */ 144 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_WRITE 11 145 /** Reports the available root entries of a transfer. 146 * New since URI handling was implemented. */ 147 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_READ 12 148 /** Reports the available root entries of a transfer. 149 * New since URI handling was implemented. */ 150 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_WRITE 13 136 151 /** Opens / gets a list handle from the host. 137 152 * New since URI handling was implemented. */ 138 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN 11153 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN 14 139 154 /** Closes a list handle from the host. 140 155 * New since URI handling was implemented. */ 141 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE 12156 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE 15 142 157 /** Reads a list header from the host. 143 158 * New since URI handling was implemented. */ 144 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_READ 13159 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_READ 16 145 160 /** Writes a list header to the host. 146 161 * New since URI handling was implemented. */ 147 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE 14162 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE 17 148 163 /** New since URI handling was implemented. */ 149 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_READ 15164 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_READ 18 150 165 /** New since URI handling was implemented. */ 151 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE 16166 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE 19 152 167 /** New since URI handling was implemented. */ 153 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_OPEN 17168 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_OPEN 20 154 169 /** New since URI handling was implemented. */ 155 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_CLOSE 18170 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_CLOSE 21 156 171 /** New since URI handling was implemented. */ 157 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_READ 19172 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_READ 22 158 173 /** New since URI handling was implemented. */ 159 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_WRITE 20174 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_WRITE 23 160 175 /** Reports cancellation of the current operation to the host. 161 176 * New since URI handling was implemented. */ 162 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL 21177 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL 24 163 178 /** Reports an error to the host. 164 179 * New since URI handling was implemented. */ 165 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR 22 166 167 /** 168 * Translates a Shared Clipboard host message enum to a string. 169 * 170 * @returns Message ID string name. 171 * @param uMsg The message to translate. 172 */ 173 DECLINLINE(const char *) VBoxSvcClipboardHostMsgToStr(uint32_t uMsg) 174 { 175 switch (uMsg) 176 { 177 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT); 178 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); 179 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS); 180 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START); 181 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOTS); 182 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN); 183 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE); 184 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ); 185 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_WRITE); 186 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ); 187 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_WRITE); 188 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN); 189 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_CLOSE); 190 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_READ); 191 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE); 192 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_CANCEL); 193 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ERROR); 194 } 195 return "Unknown"; 196 } 197 198 /** 199 * Translates a Shared Clipboard guest message enum to a string. 200 * 201 * @returns Message ID string name. 202 * @param uMsg The message to translate. 203 */ 204 DECLINLINE(const char *) VBoxSvcClipboardGuestMsgToStr(uint32_t uMsg) 205 { 206 switch (uMsg) 207 { 208 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_REPORT_FORMATS); 209 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA); 210 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA); 211 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT); 212 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT); 213 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET); 214 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS); 215 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY); 216 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOTS); 217 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN); 218 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE); 219 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_READ); 220 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE); 221 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_READ); 222 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE); 223 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_OPEN); 224 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_CLOSE); 225 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_READ); 226 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_WRITE); 227 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL); 228 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR); 229 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT); 230 } 231 return "Unknown"; 232 } 180 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR 25 233 181 234 182 /** The maximum default chunk size for a single data transfer. */ 235 #define VBOX_SHARED_CLIPBOARD_MAX_CHUNK_SIZE _64K 183 #define VBOX_SHARED_CLIPBOARD_MAX_CHUNK_SIZE _64K 184 185 /** Maximum number of concurrent Shared Clipboard transfers a VM can have. */ 186 #define VBOX_SHARED_CLIPBOARD_MAX_TRANSFERS UINT16_MAX 187 /** Maximum number of concurrent events a transfer can have. */ 188 #define VBOX_SHARED_CLIPBOARD_MAX_EVENTS UINT16_MAX 189 190 /** Creates a context ID out of a transfer ID. */ 191 #define VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(uTransfer, uEvent) \ 192 RT_MAKE_U32(uEvent, uTransfer) 193 /** Gets the transfer ID out of a context ID. */ 194 #define VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_TRANSFER(uContextID) \ 195 RT_HI_U16(uContextID) 196 /** Gets the event ID out of a context ID. */ 197 #define VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uContextID) \ 198 RT_LO_U16(uContextID) 236 199 237 200 /* … … 392 355 HGCMFunctionParameter uHandle; 393 356 } ObjOpen; 357 struct 358 { 359 HGCMFunctionParameter uHandle; 360 } ObjClose; 394 361 } u; 395 362 } VBoxClipboardReplyMsg; … … 397 364 #define VBOX_SHARED_CLIPBOARD_CPARMS_REPLY_MIN 5 398 365 399 /** 400 * Reads / Writes the roots list. 401 */ 402 typedef struct _VBoxClipboardRootsMsg 403 { 404 VBGLIOCHGCMCALL hdr; 405 406 /** uint32_t, in: Context ID. Unused at the moment. */ 366 typedef struct _VBoxClipboardRootListParms 367 { 368 /** uint32_t, in: Context ID. s*/ 407 369 HGCMFunctionParameter uContext; 408 370 /** uint32_t, in: Roots listing flags; unused at the moment. */ 409 371 HGCMFunctionParameter fRoots; 410 /** uint32_t, out: Boolean indicating that more root items are following 411 * (via another message). */ 412 HGCMFunctionParameter fMore; 413 /** uint32_t, out: Number of root items in this message. */ 414 HGCMFunctionParameter cRoots; 415 /** uin32_t, out: Size (in bytes) of string list. */ 416 HGCMFunctionParameter cbRoots; 417 /** pointer, out: string list (separated with CRLF) containing the root items. */ 418 HGCMFunctionParameter pvRoots; 419 } VBoxClipboardRootsMsg; 420 421 #define VBOX_SHARED_CLIPBOARD_CPARMS_ROOTS 6 372 } VBoxClipboardRootListParms; 373 374 /** 375 * Requests to read the root list. 376 */ 377 typedef struct _VBoxClipboardRootListReadReqMsg 378 { 379 VBGLIOCHGCMCALL hdr; 380 381 VBoxClipboardRootListParms ReqParms; 382 } VBoxClipboardRootListReadReqMsg; 383 384 #define VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_HDR_READ 2 385 386 /** 387 * Reads / Writes a root list header. 388 */ 389 typedef struct _VBoxClipboardRootListHdrMsg 390 { 391 VBGLIOCHGCMCALL hdr; 392 393 VBoxClipboardRootListParms ReqParms; 394 /** uint64_t, in/out: Number of total root list entries. */ 395 HGCMFunctionParameter cRoots; 396 /** uint32_t, in/out: Compression type. */ 397 HGCMFunctionParameter enmCompression; 398 /** uint32_t, in/out: Checksum type used for data transfer. */ 399 HGCMFunctionParameter enmChecksumType; 400 } VBoxClipboardRootListHdrMsg; 401 402 #define VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_HDR 5 403 404 typedef struct _VBoxClipboardRootListEntryParms 405 { 406 /** uint32_t, in: Context ID. */ 407 HGCMFunctionParameter uContext; 408 /** uint32_t, in: VBOX_SHAREDCLIPBOARD_INFO_FLAG_XXX. */ 409 HGCMFunctionParameter fInfo; 410 /** uint32_t, in: Index of root list entry to get (zero-based). */ 411 HGCMFunctionParameter uIndex; 412 } VBoxClipboardRootListEntryParms; 413 414 /** 415 * Request to read a list root entry. 416 */ 417 typedef struct _VBoxClipboardRootListEntryReadReqMsg 418 { 419 VBGLIOCHGCMCALL hdr; 420 421 /** in: Request parameters. */ 422 VBoxClipboardRootListEntryParms Parms; 423 } VBoxClipboardRootListEntryReadReqMsg; 424 425 #define VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_ENTRY_READ_REQ 3 426 427 /** 428 * Reads / Writes a root list entry. 429 */ 430 typedef struct _VBoxClipboardRootListEntryMsg 431 { 432 VBGLIOCHGCMCALL hdr; 433 434 /** in/out: Request parameters. */ 435 VBoxClipboardRootListEntryParms Parms; 436 /** pointer, in/out: Entry name. */ 437 HGCMFunctionParameter szName; 438 /** uint32_t, out: Bytes to be used for information/How many bytes were used. */ 439 HGCMFunctionParameter cbInfo; 440 /** pointer, in/out: Information to be set/get (SHAREDCLIPBOARDFSOBJINFO only currently). 441 * Do not forget to set the SHAREDCLIPBOARDFSOBJINFO::Attr::enmAdditional for Get operation as well. */ 442 HGCMFunctionParameter pvInfo; 443 } VBoxClipboardRootListEntryMsg; 444 445 #define VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_ENTRY 6 422 446 423 447 /** … … 507 531 typedef struct _VBoxClipboardListEntryReqParms 508 532 { 509 /** uint32_t, Context ID. Unused at the moment. */533 /** uint32_t, in: Context ID. Unused at the moment. */ 510 534 HGCMFunctionParameter uContext; 511 535 /** uint64_t, in: List handle. */ … … 525 549 } VBoxClipboardListEntryReadReqMsg; 526 550 527 #define VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ _REQ3551 #define VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ 3 528 552 529 553 /** … … 541 565 HGCMFunctionParameter cbInfo; 542 566 /** pointer, in/out: Information to be set/get (SHAREDCLIPBOARDFSOBJINFO only currently). 543 * Do not forget to set the SHAREDCLIPBOARDFSOBJINFO::Attr::enmAdditional for Get operation as well. */567 * Do not forget to set the SHAREDCLIPBOARDFSOBJINFO::Attr::enmAdditional for Get operation as well. */ 544 568 HGCMFunctionParameter pvInfo; 545 569 } VBoxClipboardListEntryMsg; … … 549 573 typedef struct _VBoxClipboardObjOpenMsg 550 574 { 551 VBGLIOCHGCMCALL hdr; 552 553 /** Absoulte path of object to open/create. */ 575 VBGLIOCHGCMCALL hdr; 576 577 /** uint32_t, in/out: Context ID. Unused at the moment. */ 578 HGCMFunctionParameter uContext; 579 /** uint64_t, in/out: Object handle. */ 580 HGCMFunctionParameter uHandle; 581 /** uint32_t, in/out: Size (in bytes) of absoulte path of object to open/create. */ 554 582 HGCMFunctionParameter cbPath; 555 /** Absoulte path of object to open/create. */583 /** pointer, in/out: Absoulte path of object to open/create. */ 556 584 HGCMFunctionParameter szPath; 557 /** Points to SHAREDCLIPBOARDCREATEPARMS buffer. */ 558 HGCMFunctionParameter parms; 559 585 /** uint32_t in/out: Open / Create flags of type SHAREDCLIPBOARD_OBJ_CF_. */ 586 HGCMFunctionParameter fCreate; 587 /** pointer, in/out: SHAREDCLIPBOARDFSOBJINFO. */ 588 HGCMFunctionParameter objInfo; 560 589 } VBoxClipboardObjOpenMsg; 561 590 562 #define VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_OPEN 2591 #define VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_OPEN 4 563 592 564 593 typedef struct _VBoxClipboardObjCloseMsg 565 594 { 566 VBGLIOCHGCMCALL hdr; 567 595 VBGLIOCHGCMCALL hdr; 596 597 /** uint32_t, in/out: Context ID. Unused at the moment. */ 598 HGCMFunctionParameter uContext; 568 599 /** uint64_t, in: SHAREDCLIPBOARDOBJHANDLE of object to close. */ 569 600 HGCMFunctionParameter uHandle; 570 601 } VBoxClipboardObjCloseMsg; 571 602 572 #define VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_CLOSE 1 603 #define VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_CLOSE 2 604 605 typedef struct _VBoxClipboardObjReadReqParms 606 { 607 /** uint32_t, in: Context ID. Unused at the moment. */ 608 HGCMFunctionParameter uContext; 609 /** uint64_t, in: SHAREDCLIPBOARDOBJHANDLE of object to write to. */ 610 HGCMFunctionParameter uHandle; 611 /** uint32_t, in: How many bytes to read. */ 612 HGCMFunctionParameter cbToRead; 613 /** uint32_t, in: Read flags. Currently unused. */ 614 HGCMFunctionParameter fRead; 615 } VBoxClipboardObjReadReqParms; 616 617 typedef struct _VBoxClipboardObjReadReqMsg 618 { 619 VBGLIOCHGCMCALL hdr; 620 621 VBoxClipboardObjReadReqParms ReqParms; 622 } VBoxClipboardObjReadReqMsg; 623 624 #define VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_READ_REQ 3 573 625 574 626 /** … … 583 635 VBGLIOCHGCMCALL hdr; 584 636 585 /** Context ID. Unused at the moment. */586 HGCMFunctionParameter uContext; /* OUT uint32_t */587 /** uint64_t, in : SHAREDCLIPBOARDOBJHANDLE of object to write to. */588 HGCMFunctionParameter uHandle; 589 /** Size (in bytes) of current data chunk. */590 HGCMFunctionParameter cbData; /* OUT uint32_t */591 /** Current data chunk. */592 HGCMFunctionParameter pvData; /* OUT ptr */593 /** Size (in bytes) of current data chunk checksum. */594 HGCMFunctionParameter cbChecksum; /* OUT uint32_t */595 /** Checksum of data block, based on the checksum637 /** uint32_t, in/out: Context ID. Unused at the moment. */ 638 HGCMFunctionParameter uContext; 639 /** uint64_t, in/out: SHAREDCLIPBOARDOBJHANDLE of object to write to. */ 640 HGCMFunctionParameter uHandle; 641 /** uint32_t, in/out: Size (in bytes) of current data chunk. */ 642 HGCMFunctionParameter cbData; 643 /** pointer, in/out: Current data chunk. */ 644 HGCMFunctionParameter pvData; 645 /** uint32_t, in/out: Size (in bytes) of current data chunk checksum. */ 646 HGCMFunctionParameter cbChecksum; 647 /** pointer, in/out: Checksum of data block, based on the checksum 596 648 * type in the data header. Optional. */ 597 HGCMFunctionParameter pvChecksum; /* OUT ptr */649 HGCMFunctionParameter pvChecksum; 598 650 } VBoxClipboardObjReadWriteMsg; 599 651 … … 642 694 void VBoxSvcClipboardUnlock(void); 643 695 644 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST645 int VBoxSvcClipboardURIGetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTHDR pListHdr);646 int VBoxSvcClipboardURISetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDLISTHDR pListHdr);647 int VBoxSvcClipboardURIGetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTENTRY pListEntry);648 int VBoxSvcClipboardURISetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDLISTENTRY pListEntry);649 int VBoxSvcClipboardURIGetFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData);650 int VBoxSvcClipboardURISetFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData);651 #endif652 653 696 #endif /* !VBOX_INCLUDED_HostServices_VBoxClipboardSvc_h */ 654 697 -
trunk/include/VBox/VBoxGuestLib.h
r79672 r80283 575 575 /** @name Shared Clipboard 576 576 * @{ */ 577 578 /** 579 * Structure containing the context required for 580 * either retrieving or sending a HGCM shared clipboard 581 * commands from or to the host. 582 * 583 * Note: Do not change parameter order without also 584 * adapting all structure initializers. 585 */ 586 typedef struct VBGLR3SHCLCMDCTX 587 { 588 /** @todo This struct could be handy if we want to implement 589 * a second communication channel, e.g. via TCP/IP. 590 * Use a union for the HGCM stuff then. */ 591 592 /** IN: HGCM client ID to use for communication. */ 593 uint32_t uClientID; 594 /** IN/OUT: Context ID to retrieve or to use. */ 595 uint32_t uContextID; 596 /** IN: Protocol version to use. */ 597 uint32_t uProtocol; 598 /** OUT: Number of parameters retrieved. */ 599 uint32_t uNumParms; 600 } VBGLR3SHCLCMDCTX, *PVBGLR3SHCLCMDCTX; 577 601 578 602 # ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST … … 620 644 621 645 # ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 622 VBGLR3DECL(int) VbglR3ClipboardEventGetNext( HGCMCLIENTID idClient, PSHAREDCLIPBOARDURITRANSFER pTransfer,646 VBGLR3DECL(int) VbglR3ClipboardEventGetNext(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDURITRANSFER pTransfer, 623 647 PVBGLR3CLIPBOARDEVENT *ppEvent); 624 648 VBGLR3DECL(void) VbglR3ClipboardEventFree(PVBGLR3CLIPBOARDEVENT pEvent); 625 649 626 VBGLR3DECL(int) VbglR3ClipboardTransferSendStatus(HGCMCLIENTID idClient, SHAREDCLIPBOARDURITRANSFERSTATUS uStatus); 627 628 VBGLR3DECL(int) VbglR3ClipboardRootsRecv(HGCMCLIENTID idClient, uint32_t *pfRoots); 629 VBGLR3DECL(int) VbglR3ClipboardRootsWrite(HGCMCLIENTID idClient, uint32_t cRoots, const char *papszList, uint32_t cbList); 630 631 VBGLR3DECL(int) VbglR3ClipboardListOpenSend(HGCMCLIENTID idClient, PVBOXCLIPBOARDLISTOPENPARMS pOpenParms, PSHAREDCLIPBOARDLISTHANDLE phList); 632 VBGLR3DECL(int) VbglR3ClipboardListOpenRecv(HGCMCLIENTID idClient, PVBOXCLIPBOARDLISTOPENPARMS pOpenParms); 633 VBGLR3DECL(int) VbglR3ClipboardListOpenReply(HGCMCLIENTID idClient, int rcReply, SHAREDCLIPBOARDLISTHANDLE hList); 634 635 VBGLR3DECL(int) VbglR3ClipboardListCloseSend(HGCMCLIENTID idClient, SHAREDCLIPBOARDLISTHANDLE hList); 636 VBGLR3DECL(int) VbglR3ClipboardListCloseRecv(HGCMCLIENTID idClient, PSHAREDCLIPBOARDLISTHANDLE phList); 637 638 VBGLR3DECL(int) VbglR3ClipboardListHdrWrite(HGCMCLIENTID idClient, SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr); 639 640 VBGLR3DECL(int) VbglR3ClipboardListEntryWrite(HGCMCLIENTID idClient, SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry); 641 642 VBGLR3DECL(int) VbglR3ClipboardObjOpen(HGCMCLIENTID idClient, 643 const char *pszPath, PVBOXCLIPBOARDCREATEPARMS pCreateParms, 644 PSHAREDCLIPBOARDOBJHANDLE phObj); 645 VBGLR3DECL(int) VbglR3ClipboardObjClose(HGCMCLIENTID idClient, SHAREDCLIPBOARDOBJHANDLE hObj); 646 VBGLR3DECL(int) VbglR3ClipboardObjRead(HGCMCLIENTID idClient, SHAREDCLIPBOARDOBJHANDLE hObj, void *pvData, uint32_t cbData, 647 uint32_t *pcbRead); 648 VBGLR3DECL(int) VbglR3ClipboardObjWrite(HGCMCLIENTID idClient, SHAREDCLIPBOARDOBJHANDLE hObj, void *pvData, uint32_t cbData, 649 uint32_t *pcbWritten); 650 VBGLR3DECL(int) VbglR3ClipboardTransferSendStatus(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDURITRANSFERSTATUS uStatus); 651 652 VBGLR3DECL(int) VbglR3ClipboardRootListHdrReadReq(PVBGLR3SHCLCMDCTX pCtx, uint32_t *pfRoots); 653 VBGLR3DECL(int) VbglR3ClipboardRootListHdrReadReply(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDROOTLIST pRootList); 654 VBGLR3DECL(int) VbglR3ClipboardRootsWrite(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDROOTLISTHDR pRoots); 655 656 VBGLR3DECL(int) VbglR3ClipboardListOpenSend(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDLISTOPENPARMS pOpenParms, PSHAREDCLIPBOARDLISTHANDLE phList); 657 VBGLR3DECL(int) VbglR3ClipboardListOpenRecv(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDLISTOPENPARMS pOpenParms); 658 VBGLR3DECL(int) VbglR3ClipboardListOpenReply(PVBGLR3SHCLCMDCTX pCtx, int rcReply, SHAREDCLIPBOARDLISTHANDLE hList); 659 660 VBGLR3DECL(int) VbglR3ClipboardListCloseSend(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDLISTHANDLE hList); 661 VBGLR3DECL(int) VbglR3ClipboardListCloseRecv(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDLISTHANDLE phList); 662 663 VBGLR3DECL(int) VbglR3ClipboardListHdrWrite(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr); 664 VBGLR3DECL(int) VbglR3ClipboardListEntryWrite(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry); 665 666 VBGLR3DECL(int) VbglR3ClipboardObjOpenRecv(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDOBJOPENCREATEPARMS pCreateParms); 667 VBGLR3DECL(int) VbglR3ClipboardObjOpenReply(PVBGLR3SHCLCMDCTX pCtx, int rcReply, SHAREDCLIPBOARDOBJHANDLE hObj); 668 VBGLR3DECL(int) VbglR3ClipboardObjOpenSend(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDOBJOPENCREATEPARMS pCreateParms, 669 PSHAREDCLIPBOARDOBJHANDLE phObj); 670 671 VBGLR3DECL(int) VbglR3ClipboardObjCloseRecv(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDOBJHANDLE phObj); 672 VBGLR3DECL(int) VbglR3ClipboardObjCloseReply(PVBGLR3SHCLCMDCTX pCtx, int rcReply, SHAREDCLIPBOARDOBJHANDLE hObj); 673 VBGLR3DECL(int) VbglR3ClipboardObjCloseSend(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj); 674 675 VBGLR3DECL(int) VbglR3ClipboardObjReadRecv(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDOBJHANDLE phObj, uint32_t pcbToRead, 676 uint32_t *pfFlags); 677 VBGLR3DECL(int) VbglR3ClipboardObjReadSend(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj, void *pvBuf, uint32_t cbBuf, 678 uint32_t *pcbRead); 679 VBGLR3DECL(int) VbglR3ClipboardObjWriteSend(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj, void *pvBuf, uint32_t cbBuf, 680 uint32_t *pcbWritten); 650 681 651 682 VBGLR3DECL(int) VbglR3ClipboardWriteError(HGCMCLIENTID idClient, int rcErr); -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp
r79702 r80283 59 59 /** Pointer to the VBoxClient service environment. */ 60 60 const VBOXSERVICEENV *pEnv; 61 /** C lient ID the service is connected to the HGCM service with. */62 uint32_t u32ClientID;61 /** Command context. */ 62 VBGLR3SHCLCMDCTX CmdCtx; 63 63 /** Windows-specific context data. */ 64 64 VBOXCLIPBOARDWINCTX Win; … … 119 119 RTThreadUserSignal(RTThreadSelf()); 120 120 121 uint32_t uClientID; 122 int rc = VbglR3ClipboardConnect(&uClientID); 121 VBGLR3SHCLCMDCTX cmdCtx; 122 RT_ZERO(cmdCtx); 123 124 int rc = VbglR3ClipboardConnect(&cmdCtx.uClientID); 123 125 if (RT_SUCCESS(rc)) 124 126 { 125 rc = VbglR3ClipboardTransferSendStatus( uClientID, SHAREDCLIPBOARDURITRANSFERSTATUS_RUNNING);127 rc = VbglR3ClipboardTransferSendStatus(&cmdCtx, SHAREDCLIPBOARDURITRANSFERSTATUS_RUNNING); 126 128 if (RT_SUCCESS(rc)) 127 129 { … … 132 134 { 133 135 PVBGLR3CLIPBOARDEVENT pEvent = NULL; 134 rc = VbglR3ClipboardEventGetNext( uClientID, pTransfer, &pEvent);136 rc = VbglR3ClipboardEventGetNext(&cmdCtx, pTransfer, &pEvent); 135 137 if (RT_SUCCESS(rc)) 136 138 { … … 152 154 } 153 155 154 VbglR3ClipboardDisconnect( uClientID);156 VbglR3ClipboardDisconnect(cmdCtx.uClientID); 155 157 } 156 158 … … 235 237 AssertPtr(pThisCtx); 236 238 239 RT_NOREF(pThisCtx); 240 237 241 int rc = 0; // VbglR3ClipboardRecvListOpen(pThisCtx->u32ClientID, pListHdr, phList); 238 242 … … 251 255 AssertPtr(pThisCtx); 252 256 253 LogFlowFunc(("c=%RU32\n", pThisCtx->u32ClientID));257 RT_NOREF(pThisCtx); 254 258 255 259 int rc = SharedClipboardURIListHdrInit(pListHdr); … … 293 297 AssertPtr(pThisCtx); 294 298 299 RT_NOREF(pThisCtx); 300 295 301 RT_NOREF(pListEntry); 296 302 int rc = 0; // VbglR3ClipboardListEntryRead(pThisCtx->u32ClientID, pListEntry); … … 316 322 */ 317 323 318 static int vboxClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const char *pszPath,319 PVBOXCLIPBOARD CREATEPARMS pCreateParms, PSHAREDCLIPBOARDOBJHANDLE phObj)324 static int vboxClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, 325 PVBOXCLIPBOARDOBJOPENCREATEPARMS pCreateParms, PSHAREDCLIPBOARDOBJHANDLE phObj) 320 326 { 321 327 LogFlowFuncEnter(); … … 324 330 AssertPtr(pThisCtx); 325 331 326 int rc = VbglR3ClipboardObjOpen (pThisCtx->u32ClientID, pszPath, pCreateParms, phObj);332 int rc = VbglR3ClipboardObjOpenSend(&pThisCtx->CmdCtx, pCreateParms, phObj); 327 333 328 334 LogFlowFuncLeaveRC(rc); … … 337 343 AssertPtr(pThisCtx); 338 344 339 int rc = VbglR3ClipboardObjClose (pThisCtx->u32ClientID, hObj);345 int rc = VbglR3ClipboardObjCloseSend(&pThisCtx->CmdCtx, hObj); 340 346 341 347 LogFlowFuncLeaveRC(rc); … … 353 359 AssertPtr(pThisCtx); 354 360 355 int rc = VbglR3ClipboardObjRead (pThisCtx->u32ClientID, hObj, pvData, cbData, pcbRead);361 int rc = VbglR3ClipboardObjReadSend(&pThisCtx->CmdCtx, hObj, pvData, cbData, pcbRead); 356 362 357 363 LogFlowFuncLeaveRC(rc); … … 369 375 AssertPtr(pThisCtx); 370 376 371 int rc = VbglR3ClipboardObjWrite (pThisCtx->u32ClientID, hObj, pvData, cbData, pcbWritten);377 int rc = VbglR3ClipboardObjWriteSend(&pThisCtx->CmdCtx, hObj, pvData, cbData, pcbWritten); 372 378 373 379 LogFlowFuncLeaveRC(rc); … … 401 407 { 402 408 LogFunc(("WM_CLIPBOARDUPDATE: Reporting formats 0x%x\n", fFormats)); 403 rc = VbglR3ClipboardReportFormats(pCtx-> u32ClientID, fFormats);409 rc = VbglR3ClipboardReportFormats(pCtx->CmdCtx.uClientID, fFormats); 404 410 } 405 411 } … … 425 431 int rc = VBoxClipboardWinGetFormats(pWinCtx, &fFormats); 426 432 if (RT_SUCCESS(rc)) 427 rc = VbglR3ClipboardReportFormats(pCtx-> u32ClientID, fFormats);433 rc = VbglR3ClipboardReportFormats(pCtx->CmdCtx.uClientID, fFormats); 428 434 } 429 435 … … 478 484 { 479 485 /* Read the host data to the preallocated buffer. */ 480 int rc = VbglR3ClipboardReadData(pCtx-> u32ClientID, fFormat, pMem, cbPrealloc, &cb);486 int rc = VbglR3ClipboardReadData(pCtx->CmdCtx.uClientID, fFormat, pMem, cbPrealloc, &cb); 481 487 LogFlowFunc(("VbglR3ClipboardReadData returned with rc = %Rrc\n", rc)); 482 488 … … 509 515 /* Read the host data to the preallocated buffer. */ 510 516 uint32_t cbNew = 0; 511 rc = VbglR3ClipboardReadData(pCtx-> u32ClientID, fFormat, pMem, cb, &cbNew);517 rc = VbglR3ClipboardReadData(pCtx->CmdCtx.uClientID, fFormat, pMem, cb, &cbNew); 512 518 LogFlowFunc(("VbglR3ClipboardReadData returned with rc = %Rrc, cb = %d, cbNew = %d\n", 513 519 rc, cb, cbNew)); … … 698 704 if (lp != NULL) 699 705 { 700 rc = VbglR3ClipboardWriteData(pCtx-> u32ClientID, VBOX_SHARED_CLIPBOARD_FMT_BITMAP,706 rc = VbglR3ClipboardWriteData(pCtx->CmdCtx.uClientID, VBOX_SHARED_CLIPBOARD_FMT_BITMAP, 701 707 lp, GlobalSize(hClip)); 702 708 GlobalUnlock(hClip); … … 716 722 if (uniString != NULL) 717 723 { 718 rc = VbglR3ClipboardWriteData(pCtx-> u32ClientID, VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT,724 rc = VbglR3ClipboardWriteData(pCtx->CmdCtx.uClientID, VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT, 719 725 uniString, (lstrlenW(uniString) + 1) * 2); 720 726 GlobalUnlock(hClip); … … 738 744 if (lp != NULL) 739 745 { 740 rc = VbglR3ClipboardWriteData(pCtx-> u32ClientID, VBOX_SHARED_CLIPBOARD_FMT_HTML,746 rc = VbglR3ClipboardWriteData(pCtx->CmdCtx.uClientID, VBOX_SHARED_CLIPBOARD_FMT_HTML, 741 747 lp, GlobalSize(hClip)); 742 748 GlobalUnlock(hClip); … … 755 761 756 762 /* Requested clipboard format is not available, send empty data. */ 757 VbglR3ClipboardWriteData(pCtx-> u32ClientID, VBOX_SHARED_CLIPBOARD_FMT_NONE, NULL, 0);763 VbglR3ClipboardWriteData(pCtx->CmdCtx.uClientID, VBOX_SHARED_CLIPBOARD_FMT_NONE, NULL, 0); 758 764 #ifdef DEBUG_andy 759 765 AssertFailed(); … … 1047 1053 /* ignore rc */ VBoxClipboardWinCheckAndInitNewAPI(&pCtx->Win.newAPI); 1048 1054 1049 rc = VbglR3ClipboardConnect(&pCtx-> u32ClientID);1055 rc = VbglR3ClipboardConnect(&pCtx->CmdCtx.uClientID); 1050 1056 if (RT_SUCCESS(rc)) 1051 1057 { 1058 pCtx->CmdCtx.uProtocol = 0; 1059 1052 1060 rc = vboxClipboardCreateWindow(pCtx); 1053 1061 if (RT_SUCCESS(rc)) … … 1061 1069 else 1062 1070 { 1063 VbglR3ClipboardDisconnect(pCtx-> u32ClientID);1071 VbglR3ClipboardDisconnect(pCtx->CmdCtx.uClientID); 1064 1072 } 1065 1073 } … … 1095 1103 uint32_t u32Msg; 1096 1104 uint32_t u32Formats; 1097 rc = VbglR3ClipboardGetHostMsgOld(pCtx-> u32ClientID, &u32Msg, &u32Formats);1105 rc = VbglR3ClipboardGetHostMsgOld(pCtx->CmdCtx.uClientID, &u32Msg, &u32Formats); 1098 1106 if (RT_FAILURE(rc)) 1099 1107 { … … 1185 1193 AssertPtr(pCtx); 1186 1194 1187 VbglR3ClipboardDisconnect(pCtx-> u32ClientID);1188 pCtx-> u32ClientID = 0;1195 VbglR3ClipboardDisconnect(pCtx->CmdCtx.uClientID); 1196 pCtx->CmdCtx.uClientID = 0; 1189 1197 1190 1198 LogFlowFuncLeaveRC(VINF_SUCCESS); … … 1200 1208 1201 1209 /* Make sure that we are disconnected. */ 1202 Assert(pCtx-> u32ClientID == 0);1210 Assert(pCtx->CmdCtx.uClientID == 0); 1203 1211 1204 1212 vboxClipboardDestroy(pCtx); -
trunk/src/VBox/Additions/common/VBoxGuest/lib/Makefile.kmk
r79497 r80283 147 147 endif 148 148 ifdef VBOX_WITH_SHARED_CLIPBOARD 149 VBoxGuestR3Lib_DEFS += VBOX_WITH_SHARED_CLIPBOARD_GUEST 149 VBoxGuestR3Lib_DEFS += VBOX_WITH_SHARED_CLIPBOARD_GUEST LOG_ENABLED 150 150 VBoxGuestR3Lib_SOURCES += \ 151 151 VBoxGuestR3LibClipboard.cpp -
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibClipboard.cpp
r79702 r80283 30 30 *********************************************************************************************************************************/ 31 31 #include <VBox/GuestHost/SharedClipboard.h> 32 #include <VBox/GuestHost/clipboard-helper.h> 32 33 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 33 34 # include <VBox/GuestHost/SharedClipboard-uri.h> … … 207 208 * @note Restore check is only performed optimally with a 6.0 host. 208 209 */ 209 static int vbglR3ClipboardMsgPeekWait( uint32_t idClient, uint32_t *pidMsg, uint32_t *pcParameters, uint64_t *pidRestoreCheck)210 static int vbglR3ClipboardMsgPeekWait(PVBGLR3SHCLCMDCTX pCtx, uint32_t *pidMsg, uint32_t *pcParameters, uint64_t *pidRestoreCheck) 210 211 { 211 212 AssertPtrReturn(pidMsg, VERR_INVALID_POINTER); … … 220 221 HGCMFunctionParameter cParameters; 221 222 } Msg; 222 VBGL_HGCM_HDR_INIT(&Msg.Hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT, 2);223 VBGL_HGCM_HDR_INIT(&Msg.Hdr, pCtx->uClientID, VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT, 2); 223 224 VbglHGCMParmUInt64Set(&Msg.idMsg, pidRestoreCheck ? *pidRestoreCheck : 0); 224 225 VbglHGCMParmUInt32Set(&Msg.cParameters, 0); … … 242 243 if (rc == VERR_INTERRUPTED) 243 244 { 244 VBGL_HGCM_HDR_INIT(&Msg.Hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL, 0);245 VBGL_HGCM_HDR_INIT(&Msg.Hdr, pCtx->uClientID, VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL, 0); 245 246 int rc2 = VbglR3HGCMCall(&Msg.Hdr, sizeof(Msg.Hdr)); 246 247 AssertRC(rc2); … … 259 260 #endif 260 261 261 VBGLR3DECL(int) VbglR3ClipboardTransferSendStatus(HGCMCLIENTID idClient, SHAREDCLIPBOARDURITRANSFERSTATUS uStatus) 262 { 262 VBGLR3DECL(int) VbglR3ClipboardTransferSendStatus(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDURITRANSFERSTATUS uStatus) 263 { 264 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 265 263 266 VBoxClipboardStatusMsg Msg; 264 267 RT_ZERO(Msg); 265 268 266 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,269 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 267 270 VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS, VBOX_SHARED_CLIPBOARD_CPARMS_STATUS); 268 271 … … 278 281 } 279 282 280 VBGLR3DECL(int) VbglR3ClipboardRootsRecv(HGCMCLIENTID idClient, PVBOXCLIPBOARDROOTS pRoots) 281 { 282 AssertPtrReturn(pRoots, VERR_INVALID_POINTER); 283 284 VBoxClipboardRootsMsg Msg; 285 RT_ZERO(Msg); 286 287 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 288 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_ROOTS); 289 290 Msg.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOTS); 291 Msg.fRoots.SetUInt32(0); 292 Msg.fMore.SetUInt32(0); 293 Msg.cRoots.SetUInt32(0); 294 Msg.cbRoots.SetUInt32(pRoots->cbRoots); 295 Msg.pvRoots.SetPtr((void *)pRoots->pszRoots, pRoots->cbRoots); 296 297 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 298 if (RT_SUCCESS(rc)) 299 { 300 uint32_t fMore; 301 rc = Msg.fMore.GetUInt32(&fMore); AssertRC(rc); 302 if (RT_SUCCESS(rc)) 303 { 304 pRoots->fMore = RT_BOOL(fMore); 305 } 306 if (RT_SUCCESS(rc)) 307 rc = Msg.fRoots.GetUInt32(&pRoots->fRoots); AssertRC(rc); 308 if (RT_SUCCESS(rc)) 309 rc = Msg.cRoots.GetUInt32(&pRoots->cRoots); AssertRC(rc); 310 if (RT_SUCCESS(rc)) 311 rc = Msg.cbRoots.GetUInt32(&pRoots->cbRoots); AssertRC(rc); 312 } 313 314 LogFlowFuncLeaveRC(rc); 315 return rc; 316 } 317 318 VBGLR3DECL(int) VbglR3ClipboardRootsWrite(HGCMCLIENTID idClient, uint32_t cRoots, char *papszList, uint32_t cbList) 319 { 320 AssertPtrReturn(papszList, VERR_INVALID_POINTER); 321 AssertReturn(cbList, VERR_INVALID_PARAMETER); 322 323 VBoxClipboardRootsMsg Msg; 324 RT_ZERO(Msg); 325 326 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 327 VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOTS, VBOX_SHARED_CLIPBOARD_CPARMS_ROOTS); 328 329 Msg.uContext.SetUInt32(0); /** @todo Context ID not used yet. */ 330 Msg.fRoots.SetUInt32(0); 331 Msg.fMore.SetUInt32(0); 332 Msg.cRoots.SetUInt32(cRoots); 333 Msg.cbRoots.SetUInt32(cbList); 334 Msg.pvRoots.SetPtr(papszList, cbList); 335 336 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 337 338 LogFlowFuncLeaveRC(rc); 339 return rc; 340 } 341 342 VBGLR3DECL(int) VbglR3ClipboardListOpenSend(HGCMCLIENTID idClient, PVBOXCLIPBOARDLISTOPENPARMS pOpenParms, 283 VBGLR3DECL(int) VbglR3ClipboardRootListHdrReadReq(PVBGLR3SHCLCMDCTX pCtx, uint32_t *pfRoots) 284 { 285 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 286 AssertPtrReturn(pfRoots, VERR_INVALID_POINTER); 287 288 VBoxClipboardRootListReadReqMsg Msg; 289 RT_ZERO(Msg); 290 291 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 292 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_HDR_READ); 293 294 Msg.ReqParms.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_READ); 295 Msg.ReqParms.fRoots.SetUInt32(0); 296 297 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 298 if (RT_SUCCESS(rc)) 299 { 300 rc = Msg.ReqParms.uContext.GetUInt32(&pCtx->uContextID); AssertRC(rc); 301 if (RT_SUCCESS(rc)) 302 rc = Msg.ReqParms.fRoots.GetUInt32(pfRoots); AssertRC(rc); 303 } 304 305 LogFlowFuncLeaveRC(rc); 306 return rc; 307 } 308 309 VBGLR3DECL(int) VbglR3ClipboardRootListHdrReadReply(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDROOTLISTHDR pRootListHdr) 310 { 311 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 312 AssertPtrReturn(pRootListHdr, VERR_INVALID_POINTER); 313 314 VBoxClipboardRootListHdrMsg Msg; 315 RT_ZERO(Msg); 316 317 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 318 VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_WRITE, VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_HDR); 319 320 Msg.ReqParms.uContext.SetUInt32(pCtx->uContextID); 321 Msg.ReqParms.fRoots.SetUInt32(pRootListHdr->fRoots); 322 323 Msg.cRoots.SetUInt32(pRootListHdr->cRoots); 324 Msg.enmCompression.SetUInt32(0); /** @todo Not implemented yet. */ 325 Msg.enmChecksumType.SetUInt32(0); /** @todo Not implemented yet. */ 326 327 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 328 329 LogFlowFuncLeaveRC(rc); 330 return rc; 331 } 332 333 VBGLR3DECL(int) VbglR3ClipboardRootListEntryReadReq(PVBGLR3SHCLCMDCTX pCtx, uint32_t *puIndex, uint32_t *pfInfo) 334 { 335 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 336 AssertPtrReturn(puIndex, VERR_INVALID_POINTER); 337 AssertPtrReturn(pfInfo, VERR_INVALID_POINTER); 338 339 VBoxClipboardRootListEntryReadReqMsg Msg; 340 RT_ZERO(Msg); 341 342 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 343 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_ENTRY_READ_REQ); 344 345 Msg.Parms.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_ENTRY_READ); 346 Msg.Parms.fInfo.SetUInt32(0); 347 Msg.Parms.uIndex.SetUInt32(0); 348 349 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 350 if (RT_SUCCESS(rc)) 351 { 352 rc = Msg.Parms.uContext.GetUInt32(&pCtx->uContextID); AssertRC(rc); 353 if (RT_SUCCESS(rc)) 354 rc = Msg.Parms.fInfo.GetUInt32(pfInfo); AssertRC(rc); 355 if (RT_SUCCESS(rc)) 356 rc = Msg.Parms.uIndex.GetUInt32(puIndex); AssertRC(rc); 357 } 358 359 LogFlowFuncLeaveRC(rc); 360 return rc; 361 } 362 363 VBGLR3DECL(int) VbglR3ClipboardRootListEntryReadReply(PVBGLR3SHCLCMDCTX pCtx, uint32_t uIndex, PVBOXCLIPBOARDLISTENTRY pEntry) 364 { 365 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 366 AssertPtrReturn(pEntry, VERR_INVALID_POINTER); 367 368 VBoxClipboardRootListEntryMsg Msg; 369 RT_ZERO(Msg); 370 371 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 372 VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_WRITE, VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_ENTRY); 373 374 Msg.Parms.uContext.SetUInt32(pCtx->uContextID); 375 Msg.Parms.fInfo.SetUInt32(0); 376 Msg.Parms.uIndex.SetUInt32(uIndex); 377 378 Msg.szName.SetPtr(pEntry->pszName, pEntry->cbName); 379 Msg.cbInfo.SetUInt32(pEntry->cbInfo); 380 Msg.pvInfo.SetPtr(pEntry->pvInfo, pEntry->cbInfo); 381 382 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 383 384 LogFlowFuncLeaveRC(rc); 385 return rc; 386 } 387 388 VBGLR3DECL(int) VbglR3ClipboardListOpenSend(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDLISTOPENPARMS pOpenParms, 343 389 PSHAREDCLIPBOARDLISTHANDLE phList) 344 390 { 391 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 345 392 AssertPtrReturn(pOpenParms, VERR_INVALID_POINTER); 346 393 AssertPtrReturn(phList, VERR_INVALID_POINTER); … … 349 396 RT_ZERO(Msg); 350 397 351 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,398 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 352 399 VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_OPEN); 353 400 … … 369 416 } 370 417 371 VBGLR3DECL(int) VbglR3ClipboardListOpenRecv(HGCMCLIENTID idClient, PVBOXCLIPBOARDLISTOPENPARMS pOpenParms) 372 { 418 VBGLR3DECL(int) VbglR3ClipboardListOpenRecv(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDLISTOPENPARMS pOpenParms) 419 { 420 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 373 421 AssertPtrReturn(pOpenParms, VERR_INVALID_POINTER); 374 422 … … 376 424 RT_ZERO(Msg); 377 425 378 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,426 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 379 427 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_OPEN); 380 428 … … 401 449 } 402 450 403 VBGLR3DECL(int) VbglR3ClipboardListOpenReply(HGCMCLIENTID idClient, int rcReply, SHAREDCLIPBOARDLISTHANDLE hList) 404 { 451 VBGLR3DECL(int) VbglR3ClipboardListOpenReply(PVBGLR3SHCLCMDCTX pCtx, int rcReply, SHAREDCLIPBOARDLISTHANDLE hList) 452 { 453 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 454 405 455 VBoxClipboardReplyMsg Msg; 406 456 RT_ZERO(Msg); 407 457 408 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,458 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 409 459 VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY, 6); 410 460 … … 423 473 } 424 474 425 VBGLR3DECL(int) VbglR3ClipboardListCloseReply(HGCMCLIENTID idClient, int rcReply, SHAREDCLIPBOARDLISTHANDLE hList) 426 { 475 VBGLR3DECL(int) VbglR3ClipboardListCloseRecv(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDLISTHANDLE phList) 476 { 477 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 478 AssertPtrReturn(phList, VERR_INVALID_POINTER); 479 480 VBoxClipboardListCloseMsg Msg; 481 RT_ZERO(Msg); 482 483 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 484 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_CLOSE); 485 486 Msg.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE); 487 Msg.uHandle.SetUInt64(0); 488 489 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 490 if (RT_SUCCESS(rc)) 491 { 492 rc = Msg.uHandle.GetUInt64(phList); AssertRC(rc); 493 } 494 495 LogFlowFuncLeaveRC(rc); 496 return rc; 497 } 498 499 VBGLR3DECL(int) VbglR3ClipboardListCloseReply(PVBGLR3SHCLCMDCTX pCtx, int rcReply, SHAREDCLIPBOARDLISTHANDLE hList) 500 { 501 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 502 427 503 VBoxClipboardReplyMsg Msg; 428 504 RT_ZERO(Msg); 429 505 430 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,506 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 431 507 VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY, 6); 432 508 … … 445 521 } 446 522 447 VBGLR3DECL(int) VbglR3ClipboardListCloseSend(HGCMCLIENTID idClient, SHAREDCLIPBOARDLISTHANDLE hList) 448 { 523 VBGLR3DECL(int) VbglR3ClipboardListCloseSend(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDLISTHANDLE hList) 524 { 525 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 526 449 527 VBoxClipboardListCloseMsg Msg; 450 528 RT_ZERO(Msg); 451 529 452 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,530 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 453 531 VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_CLOSE); 454 532 … … 462 540 } 463 541 464 VBGLR3DECL(int) VbglR3ClipboardListCloseRecv(HGCMCLIENTID idClient, PSHAREDCLIPBOARDLISTHANDLE phList) 465 { 466 AssertPtrReturn(phList, VERR_INVALID_POINTER); 467 468 VBoxClipboardListCloseMsg Msg; 469 RT_ZERO(Msg); 470 471 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 472 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_CLOSE); 473 474 Msg.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE); 475 Msg.uHandle.SetUInt64(0); 476 477 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 478 if (RT_SUCCESS(rc)) 479 { 480 rc = Msg.uHandle.GetUInt64(phList); AssertRC(rc); 481 } 482 483 LogFlowFuncLeaveRC(rc); 484 return rc; 485 } 486 487 VBGLR3DECL(int) VbglR3ClipboardListHdrRead(HGCMCLIENTID idClient, SHAREDCLIPBOARDLISTHANDLE hList, uint32_t fFlags, 542 543 VBGLR3DECL(int) VbglR3ClipboardListHdrRead(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDLISTHANDLE hList, uint32_t fFlags, 488 544 PVBOXCLIPBOARDLISTHDR pListHdr) 489 545 { 546 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 490 547 AssertPtrReturn(pListHdr, VERR_INVALID_POINTER); 491 548 … … 493 550 RT_ZERO(Msg); 494 551 495 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,552 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 496 553 VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_READ, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR); 497 554 … … 525 582 } 526 583 527 VBGLR3DECL(int) VbglR3ClipboardListHdrReadRecvReq(HGCMCLIENTID idClient, PSHAREDCLIPBOARDLISTHANDLE phList, uint32_t *pfFlags) 528 { 584 VBGLR3DECL(int) VbglR3ClipboardListHdrReadRecvReq(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDLISTHANDLE phList, uint32_t *pfFlags) 585 { 586 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 529 587 AssertPtrReturn(phList, VERR_INVALID_POINTER); 530 588 AssertPtrReturn(pfFlags, VERR_INVALID_POINTER); … … 533 591 RT_ZERO(Msg); 534 592 535 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,593 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 536 594 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR_READ_REQ); 537 595 … … 553 611 } 554 612 555 VBGLR3DECL(int) VbglR3ClipboardListHdrWrite( HGCMCLIENTID idClient, SHAREDCLIPBOARDLISTHANDLE hList,613 VBGLR3DECL(int) VbglR3ClipboardListHdrWrite(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDLISTHANDLE hList, 556 614 PVBOXCLIPBOARDLISTHDR pListHdr) 557 615 { 616 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 558 617 AssertPtrReturn(pListHdr, VERR_INVALID_POINTER); 559 618 … … 561 620 RT_ZERO(Msg); 562 621 563 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,622 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 564 623 VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR); 565 624 … … 581 640 } 582 641 583 VBGLR3DECL(int) VbglR3ClipboardListEntryRead( HGCMCLIENTID idClient, SHAREDCLIPBOARDLISTHANDLE hList,642 VBGLR3DECL(int) VbglR3ClipboardListEntryRead(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDLISTHANDLE hList, 584 643 PVBOXCLIPBOARDLISTENTRY pListEntry) 585 644 { 645 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 586 646 AssertPtrReturn(pListEntry, VERR_INVALID_POINTER); 587 647 … … 589 649 RT_ZERO(Msg); 590 650 591 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,651 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 592 652 VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_READ, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY); 593 653 … … 597 657 598 658 Msg.szName.SetPtr(pListEntry->pszName, pListEntry->cbName); 599 Msg.cbInfo.SetUInt32( 0);659 Msg.cbInfo.SetUInt32(pListEntry->cbInfo); 600 660 Msg.pvInfo.SetPtr(pListEntry->pvInfo, pListEntry->cbInfo); 601 661 … … 610 670 } 611 671 612 VBGLR3DECL(int) VbglR3ClipboardListEntryReadRecvReq(HGCMCLIENTID idClient, PSHAREDCLIPBOARDLISTHANDLE phList, uint32_t *pfInfo) 613 { 672 VBGLR3DECL(int) VbglR3ClipboardListEntryReadRecvReq(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDLISTHANDLE phList, uint32_t *pfInfo) 673 { 674 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 614 675 AssertPtrReturn(phList, VERR_INVALID_POINTER); 615 676 AssertPtrReturn(pfInfo, VERR_INVALID_POINTER); … … 618 679 RT_ZERO(Msg); 619 680 620 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,621 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ _REQ);681 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 682 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ); 622 683 623 684 Msg.ReqParms.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ); … … 637 698 } 638 699 639 VBGLR3DECL(int) VbglR3ClipboardListEntryWrite( HGCMCLIENTID idClient, SHAREDCLIPBOARDLISTHANDLE hList,700 VBGLR3DECL(int) VbglR3ClipboardListEntryWrite(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDLISTHANDLE hList, 640 701 PVBOXCLIPBOARDLISTENTRY pListEntry) 641 702 { 703 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 642 704 AssertPtrReturn(pListEntry, VERR_INVALID_POINTER); 643 705 … … 645 707 RT_ZERO(Msg); 646 708 647 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,709 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 648 710 VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE, VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY); 649 711 … … 662 724 } 663 725 664 VBGLR3DECL(int) VbglR3ClipboardEventGetNext(HGCMCLIENTID idClient, PSHAREDCLIPBOARDURITRANSFER pTransfer, 726 VBGLR3DECL(int) VbglR3ClipboardObjOpenRecv(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDOBJOPENCREATEPARMS pCreateParms) 727 { 728 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 729 AssertPtrReturn(pCreateParms, VERR_INVALID_POINTER); 730 731 VBoxClipboardObjOpenMsg Msg; 732 RT_ZERO(Msg); 733 734 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 735 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_OPEN); 736 737 Msg.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN); 738 Msg.cbPath.SetUInt64(pCreateParms->cbPath); 739 Msg.szPath.SetPtr(pCreateParms->pszPath, pCreateParms->cbPath); 740 Msg.fCreate.SetUInt32(0); 741 Msg.objInfo.SetPtr(&pCreateParms->ObjInfo, sizeof(pCreateParms->ObjInfo)); 742 743 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 744 if (RT_SUCCESS(rc)) 745 { 746 rc = Msg.cbPath.GetUInt32(&pCreateParms->cbPath); 747 if (RT_SUCCESS(rc)) 748 rc = Msg.fCreate.GetUInt32(&pCreateParms->fCreate); 749 } 750 751 LogFlowFuncLeaveRC(rc); 752 return rc; 753 } 754 755 VBGLR3DECL(int) VbglR3ClipboardObjOpenReply(PVBGLR3SHCLCMDCTX pCtx, int rcReply, SHAREDCLIPBOARDOBJHANDLE hObj) 756 { 757 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 758 759 VBoxClipboardReplyMsg Msg; 760 RT_ZERO(Msg); 761 762 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 763 VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY, 6); 764 765 Msg.uContext.SetUInt32(0); /** @todo Context ID not used yet. */ 766 Msg.enmType.SetUInt32(VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_OBJ_OPEN); 767 Msg.rc.SetUInt32((uint32_t)rcReply); /** int vs. uint32_t */ 768 Msg.cbPayload.SetUInt32(0); 769 Msg.pvPayload.SetPtr(0, NULL); 770 771 Msg.u.ObjOpen.uHandle.SetUInt64(hObj); 772 773 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 774 775 LogFlowFuncLeaveRC(rc); 776 return rc; 777 } 778 779 VBGLR3DECL(int) VbglR3ClipboardObjOpenSend(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDOBJOPENCREATEPARMS pCreateParms, 780 PSHAREDCLIPBOARDOBJHANDLE phObj) 781 { 782 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 783 AssertPtrReturn(pCreateParms, VERR_INVALID_POINTER); 784 AssertPtrReturn(phObj, VERR_INVALID_POINTER); 785 786 VBoxClipboardObjOpenMsg Msg; 787 RT_ZERO(Msg); 788 789 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 790 VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_OPEN, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_OPEN); 791 792 Msg.uContext.SetUInt32(0); /** @todo Context ID not used yet. */ 793 Msg.uHandle.SetUInt64(0); 794 Msg.cbPath.SetUInt32(pCreateParms->cbPath); 795 Msg.szPath.SetPtr((void *)pCreateParms->pszPath, pCreateParms->cbPath + 1 /* Include terminating zero */); 796 Msg.fCreate.SetUInt32(pCreateParms->fCreate); 797 Msg.objInfo.SetPtr((void *)&pCreateParms->ObjInfo, sizeof(pCreateParms->ObjInfo)); 798 799 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 800 if (RT_SUCCESS(rc)) 801 { 802 Msg.uHandle.GetUInt64(phObj); 803 } 804 805 LogFlowFuncLeaveRC(rc); 806 return rc; 807 } 808 809 VBGLR3DECL(int) VbglR3ClipboardObjCloseRecv(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDOBJHANDLE phObj) 810 { 811 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 812 AssertPtrReturn(phObj, VERR_INVALID_POINTER); 813 814 VBoxClipboardObjCloseMsg Msg; 815 RT_ZERO(Msg); 816 817 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 818 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_CLOSE); 819 820 Msg.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN); 821 Msg.uHandle.SetUInt64(0); 822 823 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 824 if (RT_SUCCESS(rc)) 825 { 826 rc = Msg.uHandle.GetUInt64(phObj); 827 } 828 829 LogFlowFuncLeaveRC(rc); 830 return rc; 831 } 832 833 VBGLR3DECL(int) VbglR3ClipboardObjCloseReply(PVBGLR3SHCLCMDCTX pCtx, int rcReply, SHAREDCLIPBOARDOBJHANDLE hObj) 834 { 835 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 836 837 VBoxClipboardReplyMsg Msg; 838 RT_ZERO(Msg); 839 840 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 841 VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY, 6); 842 843 Msg.uContext.SetUInt32(0); /** @todo Context ID not used yet. */ 844 Msg.enmType.SetUInt32(VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_OBJ_CLOSE); 845 Msg.rc.SetUInt32((uint32_t)rcReply); /** int vs. uint32_t */ 846 Msg.cbPayload.SetUInt32(0); 847 Msg.pvPayload.SetPtr(0, NULL); 848 849 Msg.u.ObjClose.uHandle.SetUInt64(hObj); 850 851 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 852 853 LogFlowFuncLeaveRC(rc); 854 return rc; 855 } 856 857 VBGLR3DECL(int) VbglR3ClipboardObjCloseSend(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj) 858 { 859 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 860 861 VBoxClipboardObjCloseMsg Msg; 862 RT_ZERO(Msg); 863 864 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 865 VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_CLOSE, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_CLOSE); 866 867 Msg.uContext.SetUInt32(0); /** @todo Context ID not used yet. */ 868 Msg.uHandle.SetUInt64(hObj); 869 870 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 871 872 LogFlowFuncLeaveRC(rc); 873 return rc; 874 } 875 876 VBGLR3DECL(int) VbglR3ClipboardObjReadRecv(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDOBJHANDLE phObj, uint32_t *pcbToRead, 877 uint32_t *pfFlags) 878 { 879 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 880 AssertPtrReturn(phObj, VERR_INVALID_POINTER); 881 AssertPtrReturn(pcbToRead, VERR_INVALID_POINTER); 882 AssertPtrReturn(pfFlags, VERR_INVALID_POINTER); 883 884 VBoxClipboardObjReadReqMsg Msg; 885 RT_ZERO(Msg); 886 887 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 888 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_READ_REQ); 889 890 Msg.ReqParms.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_READ); 891 Msg.ReqParms.uHandle.SetUInt64(0); 892 Msg.ReqParms.cbToRead.SetUInt32(0); 893 Msg.ReqParms.fRead.SetUInt32(0); 894 895 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 896 if (RT_SUCCESS(rc)) 897 { 898 rc = Msg.ReqParms.uHandle.GetUInt64(phObj); 899 if (RT_SUCCESS(rc)) 900 rc = Msg.ReqParms.cbToRead.GetUInt32(pcbToRead); 901 if (RT_SUCCESS(rc)) 902 rc = Msg.ReqParms.fRead.GetUInt32(pfFlags); 903 } 904 905 LogFlowFuncLeaveRC(rc); 906 return rc; 907 } 908 909 VBGLR3DECL(int) VbglR3ClipboardObjReadSend(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj, 910 void *pvData, uint32_t cbData, uint32_t *pcbRead) 911 { 912 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 913 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 914 AssertReturn(cbData, VERR_INVALID_PARAMETER); 915 /* pcbRead is optional. */ 916 917 VBoxClipboardObjReadWriteMsg Msg; 918 RT_ZERO(Msg); 919 920 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_READ, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_READ); 921 922 Msg.uContext.SetUInt32(0); 923 Msg.uHandle.SetUInt64(hObj); 924 Msg.pvData.SetPtr(pvData, cbData); 925 Msg.cbData.SetUInt32(0); 926 Msg.pvChecksum.SetPtr(NULL, 0); 927 Msg.cbChecksum.SetUInt32(0); 928 929 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 930 if (RT_SUCCESS(rc)) 931 { 932 /** @todo Context ID not used yet. */ 933 /** @todo Add checksum support. */ 934 935 if (pcbRead) 936 { 937 rc = Msg.cbData.GetUInt32(pcbRead); AssertRC(rc); 938 AssertReturn(cbData >= *pcbRead, VERR_TOO_MUCH_DATA); 939 } 940 } 941 942 LogFlowFuncLeaveRC(rc); 943 return rc; 944 } 945 946 VBGLR3DECL(int) VbglR3ClipboardObjWriteSend(PVBGLR3SHCLCMDCTX pCtx, 947 SHAREDCLIPBOARDOBJHANDLE hObj, 948 void *pvData, uint32_t cbData, uint32_t *pcbWritten) 949 { 950 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 951 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 952 AssertReturn(cbData, VERR_INVALID_PARAMETER); 953 /* pcbWritten is optional. */ 954 955 VBoxClipboardObjReadWriteMsg Msg; 956 RT_ZERO(Msg); 957 958 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_WRITE, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_WRITE); 959 960 Msg.uContext.SetUInt32(0); 961 Msg.uHandle.SetUInt64(hObj); 962 Msg.pvData.SetPtr(pvData, cbData); 963 Msg.cbData.SetUInt32(cbData); 964 Msg.pvChecksum.SetPtr(NULL, 0); /** @todo Implement this. */ 965 Msg.cbChecksum.SetUInt32(0); /** @todo Implement this. */ 966 967 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 968 if (RT_SUCCESS(rc)) 969 { 970 if (pcbWritten) 971 *pcbWritten = cbData; 972 } 973 974 LogFlowFuncLeaveRC(rc); 975 return rc; 976 } 977 978 VBGLR3DECL(int) VbglR3ClipboardEventGetNext(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDURITRANSFER pTransfer, 665 979 PVBGLR3CLIPBOARDEVENT *ppEvent) 666 980 { 981 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 667 982 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 668 983 AssertPtrReturn(ppEvent, VERR_INVALID_POINTER); … … 674 989 uint32_t uMsg = 0; 675 990 uint32_t cParms = 0; 676 int rc = vbglR3ClipboardMsgPeekWait(idClient, &uMsg, &cParms, NULL /* pidRestoreCheck */); 677 if (RT_SUCCESS(rc)) 678 { 679 LogFunc(("Handling uMsg=%RU32\n", uMsg)); 680 991 int rc = vbglR3ClipboardMsgPeekWait(pCtx, &uMsg, &cParms, NULL /* pidRestoreCheck */); 992 if (RT_SUCCESS(rc)) 993 { 994 #ifdef LOG_ENABLED 995 LogFunc(("Handling uMsg=%RU32 (%s)\n", uMsg, VBoxClipboardHostMsgToStr(uMsg))); 996 #endif 681 997 switch (uMsg) 682 998 { 683 999 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 684 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT S:1000 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_READ: 685 1001 { 686 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOTS\n")); 687 688 VBOXCLIPBOARDROOTS Roots; 689 rc = SharedClipboardURIRootsInit(&Roots); 1002 uint32_t fRoots; 1003 rc = VbglR3ClipboardRootListHdrReadReq(pCtx, &fRoots); 1004 1005 /** @todo Validate / handle fRoots. */ 1006 690 1007 if (RT_SUCCESS(rc)) 691 1008 { 692 rc = VbglR3ClipboardRootsRecv(idClient, &Roots); 1009 VBOXCLIPBOARDROOTLISTHDR rootListHdr; 1010 RT_ZERO(rootListHdr); 1011 1012 rootListHdr.cRoots = SharedClipboardURILTransferRootsCount(pTransfer); 1013 1014 LogFlowFunc(("cRoots=%RU32\n", rootListHdr.cRoots)); 1015 1016 rc = VbglR3ClipboardRootListHdrReadReply(pCtx, &rootListHdr); 1017 } 1018 break; 1019 } 1020 1021 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_ENTRY_READ: 1022 { 1023 uint32_t uIndex; 1024 uint32_t fInfo; 1025 rc = VbglR3ClipboardRootListEntryReadReq(pCtx, &uIndex, &fInfo); 1026 if (RT_SUCCESS(rc)) 1027 { 1028 VBOXCLIPBOARDLISTENTRY rootListEntry; 1029 rc = SharedClipboardURILTransferRootsEntry(pTransfer, uIndex, &rootListEntry); 693 1030 if (RT_SUCCESS(rc)) 694 { 695 /** @todo Handle Roots.fRoots flags. */ 696 697 char *pszRoots = NULL; 698 uint32_t cRoots = 0; 699 rc = SharedClipboardURILTransferGetRoots(pTransfer, &pszRoots, &cRoots); 700 if (RT_SUCCESS(rc)) 701 { 702 /** @todo Split up transfers in _64K each. */ 703 704 const uint32_t cbRoots = pszRoots 705 ? (uint32_t)strlen(pszRoots) + 1 /* Include termination. */ 706 : 0; 707 708 rc = VbglR3ClipboardRootsWrite(idClient, cRoots, pszRoots, cbRoots); 709 } 710 } 1031 rc = VbglR3ClipboardRootListEntryReadReply(pCtx, uIndex, &rootListEntry); 711 1032 } 712 713 1033 break; 714 1034 } … … 722 1042 if (RT_SUCCESS(rc)) 723 1043 { 724 rc = VbglR3ClipboardListOpenRecv( idClient, &openParmsList);1044 rc = VbglR3ClipboardListOpenRecv(pCtx, &openParmsList); 725 1045 if (RT_SUCCESS(rc)) 726 1046 { … … 731 1051 732 1052 /* Reply in any case. */ 733 int rc2 = VbglR3ClipboardListOpenReply( idClient, rc, hList);1053 int rc2 = VbglR3ClipboardListOpenReply(pCtx, rc, hList); 734 1054 AssertRC(rc2); 735 1055 … … 746 1066 747 1067 SHAREDCLIPBOARDLISTHANDLE hList; 748 rc = VbglR3ClipboardListCloseRecv( idClient, &hList);1068 rc = VbglR3ClipboardListCloseRecv(pCtx, &hList); 749 1069 if (RT_SUCCESS(rc)) 750 1070 { … … 752 1072 753 1073 /* Reply in any case. */ 754 int rc2 = VbglR3ClipboardListCloseReply( idClient, rc, hList);1074 int rc2 = VbglR3ClipboardListCloseReply(pCtx, rc, hList); 755 1075 AssertRC(rc2); 756 1076 } … … 767 1087 SHAREDCLIPBOARDLISTHANDLE hList = SHAREDCLIPBOARDLISTHANDLE_INVALID; 768 1088 uint32_t fFlags = 0; 769 rc = VbglR3ClipboardListHdrReadRecvReq( idClient, &hList, &fFlags);1089 rc = VbglR3ClipboardListHdrReadRecvReq(pCtx, &hList, &fFlags); 770 1090 if (RT_SUCCESS(rc)) 771 1091 { … … 774 1094 if (RT_SUCCESS(rc)) 775 1095 { 776 rc = VbglR3ClipboardListHdrWrite(idClient, hList, &hdrList); 1096 rc = VbglR3ClipboardListHdrWrite(pCtx, hList, &hdrList); 1097 777 1098 SharedClipboardURIListHdrDestroy(&hdrList); 778 1099 } … … 791 1112 if (RT_SUCCESS(rc)) 792 1113 { 793 rc = VBglR3ClipboardListHdrRecv( idClient, )1114 rc = VBglR3ClipboardListHdrRecv(pCtx, ) 794 1115 } 795 1116 break; … … 807 1128 SHAREDCLIPBOARDLISTHANDLE hList; 808 1129 uint32_t fInfo; 809 rc = VbglR3ClipboardListEntryReadRecvReq( idClient, &hList, &fInfo);1130 rc = VbglR3ClipboardListEntryReadRecvReq(pCtx, &hList, &fInfo); 810 1131 if (RT_SUCCESS(rc)) 811 1132 { … … 816 1137 Assert(entryList.cbInfo == sizeof(SHAREDCLIPBOARDFSOBJINFO)); 817 1138 1139 RT_NOREF(pObjInfo); 1140 818 1141 LogFlowFunc(("\t%s (%RU64 bytes)\n", entryList.pszName, pObjInfo->cbObject)); 819 1142 820 rc = VbglR3ClipboardListEntryWrite( idClient, hList, &entryList);1143 rc = VbglR3ClipboardListEntryWrite(pCtx, hList, &entryList); 821 1144 } 822 1145 } … … 840 1163 { 841 1164 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN\n")); 842 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_OBJ_OPEN; 1165 1166 VBOXCLIPBOARDOBJOPENCREATEPARMS createParms; 1167 rc = VbglR3ClipboardObjOpenRecv(pCtx, &createParms); 1168 if (RT_SUCCESS(rc)) 1169 { 1170 SHAREDCLIPBOARDOBJHANDLE hObj; 1171 rc = SharedClipboardURIObjectOpen(pTransfer, &createParms, &hObj); 1172 if (RT_SUCCESS(rc)) 1173 { 1174 int rc2 = VbglR3ClipboardObjOpenReply(pCtx, rc, hObj); 1175 AssertRC(rc2); 1176 } 1177 } 1178 843 1179 break; 844 1180 } … … 847 1183 { 848 1184 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_CLOSE\n")); 849 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_OBJ_CLOSE; 1185 1186 SHAREDCLIPBOARDOBJHANDLE hObj; 1187 rc = VbglR3ClipboardObjCloseRecv(pCtx, &hObj); 1188 if (RT_SUCCESS(rc)) 1189 { 1190 rc = SharedClipboardURIObjectClose(hObj); 1191 1192 /* Reply in any case. */ 1193 int rc2 = VbglR3ClipboardObjCloseReply(pCtx, rc, hObj); 1194 AssertRC(rc2); 1195 } 850 1196 break; 851 1197 } … … 854 1200 { 855 1201 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_READ\n")); 856 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_OBJ_READ; 1202 1203 SHAREDCLIPBOARDOBJHANDLE hObj; 1204 uint32_t cbBuf; 1205 uint32_t fFlags; 1206 rc = VbglR3ClipboardObjReadRecv(pCtx, &hObj, &cbBuf, &fFlags); 1207 if (RT_SUCCESS(rc)) 1208 { 1209 void *pvBuf = RTMemAlloc(RT_MIN(cbBuf, _64K)); /** @todo Make this more flexible. */ 1210 if (pvBuf) 1211 { 1212 uint32_t cbRead; 1213 rc = SharedClipboardURIObjectRead(hObj, pvBuf, cbBuf, &cbRead, fFlags); 1214 if (RT_SUCCESS(rc)) 1215 rc = VbglR3ClipboardObjReadSend(pCtx, hObj, pvBuf, cbRead, NULL /* pcbWritten */); 1216 1217 RTMemFree(pvBuf); 1218 } 1219 else 1220 rc = VERR_NO_MEMORY; 1221 } 857 1222 break; 858 1223 } … … 862 1227 { 863 1228 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE\n")); 864 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_OBJ_WRITE;865 1229 break; 866 1230 } … … 886 1250 { 887 1251 /* Report error back to the host. */ 888 //VbglR3ClipboardWriteError(idClient, rc); 1252 int rc2 = VbglR3ClipboardWriteError(pCtx->uClientID, rc); 1253 Assert(rc2); 889 1254 890 1255 VbglR3ClipboardEventFree(pEvent); … … 1004 1369 } 1005 1370 #endif 1006 1007 VBGLR3DECL(int) VbglR3ClipboardObjOpen(HGCMCLIENTID idClient,1008 const char *pszPath, PVBOXCLIPBOARDCREATEPARMS pCreateParms,1009 PSHAREDCLIPBOARDOBJHANDLE phObj)1010 {1011 AssertPtrReturn(pszPath, VERR_INVALID_POINTER);1012 AssertPtrReturn(pCreateParms, VERR_INVALID_POINTER);1013 AssertPtrReturn(phObj, VERR_INVALID_POINTER);1014 1015 VBoxClipboardObjOpenMsg Msg;1016 RT_ZERO(Msg);1017 1018 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,1019 VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_OPEN, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_OPEN);1020 1021 int rc;1022 1023 char *pszPathTmp = RTStrDup(pszPath);1024 if (pszPathTmp)1025 {1026 Msg.szPath.SetPtr((void *)pszPathTmp, (uint32_t)strlen(pszPathTmp) + 1 /* Include terminating zero */);1027 Msg.parms.SetPtr(pCreateParms, sizeof(VBOXCLIPBOARDCREATEPARMS));1028 1029 rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));1030 if (RT_SUCCESS(rc))1031 {1032 *phObj = pCreateParms->uHandle;1033 }1034 1035 RTStrFree(pszPathTmp);1036 }1037 else1038 rc = VERR_NO_MEMORY;1039 1040 LogFlowFuncLeaveRC(rc);1041 return rc;1042 }1043 1044 VBGLR3DECL(int) VbglR3ClipboardObjClose(HGCMCLIENTID idClient, SHAREDCLIPBOARDOBJHANDLE hObj)1045 {1046 VBoxClipboardObjCloseMsg Msg;1047 RT_ZERO(Msg);1048 1049 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,1050 VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_CLOSE, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_CLOSE);1051 1052 Msg.uHandle.SetUInt64(hObj);1053 1054 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));1055 1056 LogFlowFuncLeaveRC(rc);1057 return rc;1058 }1059 1060 VBGLR3DECL(int) VbglR3ClipboardObjRead(HGCMCLIENTID idClient, SHAREDCLIPBOARDOBJHANDLE hObj,1061 void *pvData, uint32_t cbData, uint32_t *pcbRead)1062 {1063 AssertPtrReturn(pvData, VERR_INVALID_POINTER);1064 AssertReturn(cbData, VERR_INVALID_PARAMETER);1065 /* pcbRead is optional. */1066 1067 VBoxClipboardObjReadWriteMsg Msg;1068 RT_ZERO(Msg);1069 1070 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_READ, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_READ);1071 1072 Msg.uContext.SetUInt32(0);1073 Msg.uHandle.SetUInt64(hObj);1074 Msg.pvData.SetPtr(pvData, cbData);1075 Msg.cbData.SetUInt32(0);1076 Msg.pvChecksum.SetPtr(NULL, 0);1077 Msg.cbChecksum.SetUInt32(0);1078 1079 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));1080 if (RT_SUCCESS(rc))1081 {1082 /** @todo Context ID not used yet. */1083 /** @todo Add checksum support. */1084 1085 if (pcbRead)1086 {1087 rc = Msg.cbData.GetUInt32(pcbRead); AssertRC(rc);1088 AssertReturn(cbData >= *pcbRead, VERR_TOO_MUCH_DATA);1089 }1090 }1091 1092 LogFlowFuncLeaveRC(rc);1093 return rc;1094 }1095 1096 VBGLR3DECL(int) VbglR3ClipboardObjWrite(HGCMCLIENTID idClient,1097 SHAREDCLIPBOARDOBJHANDLE hObj,1098 void *pvData, uint32_t cbData, uint32_t *pcbWritten)1099 {1100 AssertPtrReturn(pvData, VERR_INVALID_POINTER);1101 AssertReturn(cbData, VERR_INVALID_PARAMETER);1102 /* pcbWritten is optional. */1103 1104 VBoxClipboardObjReadWriteMsg Msg;1105 RT_ZERO(Msg);1106 1107 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_WRITE, VBOX_SHARED_CLIPBOARD_CPARMS_OBJ_WRITE);1108 1109 Msg.uContext.SetUInt32(0);1110 Msg.uHandle.SetUInt64(hObj);1111 Msg.pvData.SetPtr(pvData, cbData);1112 Msg.cbData.SetUInt32(cbData);1113 Msg.pvChecksum.SetPtr(NULL, 0); /** @todo Implement this. */1114 Msg.cbChecksum.SetUInt32(0); /** @todo Implement this. */1115 1116 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));1117 if (RT_SUCCESS(rc))1118 {1119 if (pcbWritten)1120 *pcbWritten = cbData;1121 }1122 1123 LogFlowFuncLeaveRC(rc);1124 return rc;1125 }1126 1371 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 1127 1372 -
trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp
r79702 r80283 245 245 246 246 pTransfer->Thread.fStarted = true; 247 pTransfer->Thread.fStop = false; 247 248 248 249 RTThreadUserSignal(RTThreadSelf()); 249 250 250 LogRel2(("Shared Clipboard: Calculating transfer ... .\n"));251 LogRel2(("Shared Clipboard: Calculating transfer ...\n")); 251 252 252 253 int rc = SharedClipboardURITransferOpen(pTransfer); 253 254 if (RT_SUCCESS(rc)) 254 255 { 255 uint32_t cRoots; 256 char *pszRoots; 257 rc = SharedClipboardURILTransferGetRoots(pTransfer, &pszRoots, &cRoots); 256 PVBOXCLIPBOARDROOTLIST pRootList; 257 rc = SharedClipboardURILTransferRootsAsList(pTransfer, &pRootList); 258 258 if (RT_SUCCESS(rc)) 259 259 { 260 SharedClipboardURIListRootEntries lstRoots = RTCString(pszRoots, strlen(pszRoots)).split("\r\n"); 261 Assert(lstRoots.size() == cRoots); 262 263 LogFlowFunc(("cRoots=%zu\n", lstRoots.size())); 264 265 for (uint32_t i = 0; i < lstRoots.size(); i++) 260 for (uint32_t i = 0; i < pRootList->Hdr.cRoots; i++) 266 261 { 267 VBOXCLIPBOARDLISTOPENPARMS openParmsList; 268 rc = SharedClipboardURIListOpenParmsInit(&openParmsList); 269 if (RT_SUCCESS(rc)) 262 PVBOXCLIPBOARDLISTENTRY pRootEntry = &pRootList->paEntries[i]; 263 AssertPtr(pRootEntry); 264 265 Assert(pRootEntry->cbInfo == sizeof(SHAREDCLIPBOARDFSOBJINFO)); 266 PSHAREDCLIPBOARDFSOBJINFO pFsObjInfo = (PSHAREDCLIPBOARDFSOBJINFO)pRootEntry->pvInfo; 267 268 LogFlowFunc(("pszRoot=%s, fMode=0x%x\n", pRootEntry->pszName, pFsObjInfo->Attr.fMode)); 269 270 if (RTFS_IS_DIRECTORY(pFsObjInfo->Attr.fMode)) 270 271 { 271 LogFlowFunc(("pszRoot=%s\n", lstRoots[i].c_str())); 272 273 rc = RTStrCopy(openParmsList.pszPath, openParmsList.cbPath, lstRoots[i].c_str()); 272 VBOXCLIPBOARDLISTOPENPARMS openParmsList; 273 rc = SharedClipboardURIListOpenParmsInit(&openParmsList); 274 if (RT_FAILURE(rc)) 275 break; 276 277 rc = RTStrCopy(openParmsList.pszPath, openParmsList.cbPath, pRootEntry->pszName); 274 278 if (RT_FAILURE(rc)) 275 279 break; … … 288 292 hdrList.cTotalObjects, hdrList.cbTotalSize)); 289 293 290 for (uint64_t i = 0; i < hdrList.cTotalObjects; i++)294 do 291 295 { 292 296 VBOXCLIPBOARDLISTENTRY entryList; … … 303 307 } 304 308 else 309 { 310 if (rc == VERR_NO_MORE_FILES) /* End of list has been reached. */ 311 rc = VINF_SUCCESS; 305 312 break; 313 } 306 314 307 315 if (pTransfer->Thread.fStop) 308 316 break; 309 } 317 318 } while (RT_SUCCESS(rc)); 310 319 } 311 320 … … 314 323 315 324 SharedClipboardURIListOpenParmsDestroy(&openParmsList); 325 } 326 else if (RTFS_IS_FILE(pFsObjInfo->Attr.fMode)) 327 { 328 FSOBJENTRY objEntry = { pRootEntry->pszName, *pFsObjInfo }; 329 330 pThis->m_lstRootEntries.push_back(objEntry); /** @todo Can this throw? */ 316 331 } 317 332 … … 319 334 break; 320 335 } 336 337 SharedClipboardURIRootListFree(pRootList); 338 pRootList = NULL; 321 339 322 340 if (RT_SUCCESS(rc)) … … 337 355 AssertRC(rc2); 338 356 } 339 340 RTStrFree(pszRoots);341 357 } 342 358 … … 553 569 if (pFormatEtc->cfFormat == m_cfFileContents) 554 570 { 555 if ( pFormatEtc->lindex >= 0556 && pFormatEtc->lindex <m_lstRootEntries.size())571 if ( pFormatEtc->lindex >= 0 572 && (ULONG)pFormatEtc->lindex < m_lstRootEntries.size()) 557 573 { 558 574 m_uObjIdx = pFormatEtc->lindex; /* lIndex of FormatEtc contains the actual index to the object being handled. */ 559 575 560 LogFlowFunc(("FormatIndex_FileContents: m_uObjIdx=%u\n", m_uObjIdx));561 562 576 FSOBJENTRY &fsObjEntry = m_lstRootEntries.at(m_uObjIdx); 563 577 564 LogRel2(("Shared Clipboard: Receiving file '%s' ...\n", fsObjEntry.strPath.c_str())); 578 LogFlowFunc(("FormatIndex_FileContents: m_uObjIdx=%u (entry '%s')\n", m_uObjIdx, fsObjEntry.strPath.c_str())); 579 580 LogRel2(("Shared Clipboard: Receiving object '%s' ...\n", fsObjEntry.strPath.c_str())); 565 581 566 582 /* Hand-in the provider so that our IStream implementation can continue working with it. */ -
trunk/src/VBox/GuestHost/SharedClipboard/ClipboardStreamImpl-win.cpp
r79702 r80283 187 187 && m_pURITransfer->ProviderIface.pfnObjOpen) 188 188 { 189 VBOXCLIPBOARD CREATEPARMS createParms;189 VBOXCLIPBOARDOBJOPENCREATEPARMS createParms; 190 190 RT_ZERO(createParms); 191 191 192 rc = m_pURITransfer->ProviderIface.pfnObjOpen(&m_pURITransfer->ProviderCtx, m_strPath.c_str(), &createParms, &m_hObj); 192 createParms.pszPath = RTStrDup(m_strPath.c_str()); 193 if (createParms.pszPath) 194 { 195 rc = m_pURITransfer->ProviderIface.pfnObjOpen(&m_pURITransfer->ProviderCtx, &createParms, &m_hObj); 196 197 RTStrFree(createParms.pszPath); 198 } 199 else 200 rc = VERR_NO_MEMORY; 193 201 } 194 202 else -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-common.cpp
r79272 r80283 27 27 #include <VBox/log.h> 28 28 #include <VBox/GuestHost/clipboard-helper.h> 29 29 #ifdef LOG_ENABLED 30 # include <VBox/HostServices/VBoxClipboardSvc.h> 31 #endif 30 32 31 33 /** @todo use const where appropriate; delinuxify the code (*Lin* -> *Host*); use AssertLogRel*. */ … … 407 409 LogFunc(("Invalid format %02X\n", u32Format)); 408 410 } 411 412 /** 413 * Translates a Shared Clipboard host message enum to a string. 414 * 415 * @returns Message ID string name. 416 * @param uMsg The message to translate. 417 */ 418 const char *VBoxClipboardHostMsgToStr(uint32_t uMsg) 419 { 420 switch (uMsg) 421 { 422 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT); 423 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); 424 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS); 425 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START); 426 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_READ); 427 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_WRITE); 428 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_ENTRY_READ); 429 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_ENTRY_WRITE); 430 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN); 431 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE); 432 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ); 433 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_WRITE); 434 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ); 435 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_WRITE); 436 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN); 437 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_CLOSE); 438 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_READ); 439 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE); 440 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_CANCEL); 441 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ERROR); 442 } 443 return "Unknown"; 444 } 445 446 /** 447 * Translates a Shared Clipboard guest message enum to a string. 448 * 449 * @returns Message ID string name. 450 * @param uMsg The message to translate. 451 */ 452 const char *VBoxClipboardGuestMsgToStr(uint32_t uMsg) 453 { 454 switch (uMsg) 455 { 456 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_REPORT_FORMATS); 457 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA); 458 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA); 459 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT); 460 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT); 461 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET); 462 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS); 463 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY); 464 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_READ); 465 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_WRITE); 466 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_READ); 467 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_WRITE); 468 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN); 469 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE); 470 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_READ); 471 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE); 472 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_READ); 473 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE); 474 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_OPEN); 475 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_CLOSE); 476 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_READ); 477 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_WRITE); 478 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL); 479 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR); 480 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT); 481 } 482 return "Unknown"; 483 } 409 484 #endif /* LOG_ENABLED */ 410 485 -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-uri.cpp
r79702 r80283 36 36 #endif 37 37 38 39 int SharedClipboardURIRootsInit(PVBOXCLIPBOARDROOTS pRoots) 40 { 41 AssertPtrReturn(pRoots, VERR_INVALID_POINTER); 42 43 RT_BZERO(pRoots, sizeof(VBOXCLIPBOARDROOTS)); 44 45 const uint32_t cbRoots = _64K; 46 47 pRoots->pszRoots = RTStrAlloc(cbRoots); 48 if (!pRoots->pszRoots) 49 return VERR_NO_MEMORY; 50 51 pRoots->cbRoots = cbRoots; 38 /** @todo Split this file up in different modules. */ 39 40 /** 41 * Allocates a new URI root list. 42 * 43 * @returns Allocated URI root list on success, or NULL on failure. 44 */ 45 PVBOXCLIPBOARDROOTLIST SharedClipboardURIRootListAlloc(void) 46 { 47 PVBOXCLIPBOARDROOTLIST pRootList = (PVBOXCLIPBOARDROOTLIST)RTMemAllocZ(sizeof(VBOXCLIPBOARDROOTLIST)); 48 49 return pRootList; 50 } 51 52 /** 53 * Frees an URI root list. 54 * 55 * @param pRootList URI root list to free. The pointer will be 56 * invalid after returning from this function. 57 */ 58 void SharedClipboardURIRootListFree(PVBOXCLIPBOARDROOTLIST pRootList) 59 { 60 if (!pRootList) 61 return; 62 63 for (uint32_t i = 0; i < pRootList->Hdr.cRoots; i++) 64 SharedClipboardURIListEntryDestroy(&pRootList->paEntries[i]); 65 66 RTMemFree(pRootList); 67 pRootList = NULL; 68 } 69 70 /** 71 * Initializes an URI root list header. 72 * 73 * @returns VBox status code. 74 * @param pRootLstHdr Root list header to initialize. 75 */ 76 int SharedClipboardURIRootListHdrInit(PVBOXCLIPBOARDROOTLISTHDR pRootLstHdr) 77 { 78 AssertPtrReturn(pRootLstHdr, VERR_INVALID_POINTER); 79 80 RT_BZERO(pRootLstHdr, sizeof(VBOXCLIPBOARDROOTLISTHDR)); 52 81 53 82 return VINF_SUCCESS; 54 83 } 55 84 56 void SharedClipboardURIRootsDestroy(PVBOXCLIPBOARDROOTS pRoots) 57 { 58 if (!pRoots) 85 /** 86 * Destroys an URI root list header. 87 * 88 * @param pRootLstHdr Root list header to destroy. 89 */ 90 void SharedClipboardURIRootListHdrDestroy(PVBOXCLIPBOARDROOTLISTHDR pRootLstHdr) 91 { 92 if (!pRootLstHdr) 59 93 return; 60 94 61 if (pRoots->pszRoots) 62 RTStrFree(pRoots->pszRoots); 63 } 64 65 PVBOXCLIPBOARDROOTS SharedClipboardURIRootsDup(PVBOXCLIPBOARDROOTS pRoots) 66 { 67 AssertPtrReturn(pRoots, NULL); 95 pRootLstHdr->fRoots = 0; 96 pRootLstHdr->cRoots = 0; 97 } 98 99 /** 100 * Duplicates an URI list header. 101 * 102 * @returns Duplicated URI list header on success, or NULL on failure. 103 * @param pRootLstHdr Root list header to duplicate. 104 */ 105 PVBOXCLIPBOARDROOTLISTHDR SharedClipboardURIRootListHdrDup(PVBOXCLIPBOARDROOTLISTHDR pRootLstHdr) 106 { 107 AssertPtrReturn(pRootLstHdr, NULL); 68 108 69 109 int rc = VINF_SUCCESS; 70 110 71 PVBOXCLIPBOARDROOT S pRootsDup = (PVBOXCLIPBOARDROOTS)RTMemAlloc(sizeof(VBOXCLIPBOARDROOTS));111 PVBOXCLIPBOARDROOTLISTHDR pRootsDup = (PVBOXCLIPBOARDROOTLISTHDR)RTMemAllocZ(sizeof(VBOXCLIPBOARDROOTLISTHDR)); 72 112 if (pRootsDup) 73 113 { 74 *pRootsDup = *pRoots; 75 76 if (pRoots->pszRoots) 77 { 78 pRootsDup->pszRoots = RTStrDup(pRoots->pszRoots); 79 if (!pRootsDup->pszRoots) 80 rc = VERR_NO_MEMORY; 81 } 82 } 114 *pRootsDup = *pRootLstHdr; 115 } 116 else 117 rc = VERR_NO_MEMORY; 83 118 84 119 if (RT_FAILURE(rc)) 85 120 { 86 if (pRootsDup->pszRoots) 87 RTStrFree(pRootsDup->pszRoots); 88 89 RTMemFree(pRootsDup); 121 SharedClipboardURIRootListHdrDestroy(pRootsDup); 90 122 pRootsDup = NULL; 91 123 } … … 95 127 96 128 /** 97 * Allocates a VBOXCLIPBOARDListHdr structure. 98 * 99 * @returns VBox status code. 100 * @param ppListEntry Where to store the allocated VBOXCLIPBOARDListHdr structure on success. 129 * (Deep) Copies a clipboard root list entry structure. 130 * 131 * @returns VBox status code. 132 * @param pListEntry Clipboard root list entry to copy. 133 */ 134 int SharedClipboardURIRootListEntryCopy(PVBOXCLIPBOARDROOTLISTENTRY pDst, PVBOXCLIPBOARDROOTLISTENTRY pSrc) 135 { 136 return SharedClipboardURIListEntryCopy(pDst, pSrc); 137 } 138 139 /** 140 * Duplicates (allocates) a clipboard root list entry structure. 141 * 142 * @returns Duplicated clipboard root list entry structure on success. 143 * @param pListEntry Clipboard root list entry to duplicate. 144 */ 145 PVBOXCLIPBOARDROOTLISTENTRY SharedClipboardURIRootListEntryDup(PVBOXCLIPBOARDROOTLISTENTRY pRootListEntry) 146 { 147 return SharedClipboardURIListEntryDup(pRootListEntry); 148 } 149 150 /** 151 * Destroys a clipboard root list entry structure. 152 * 153 * @param pListEntry Clipboard root list entry structure to destroy. 154 */ 155 void SharedClipboardURIRootListEntryDestroy(PVBOXCLIPBOARDROOTLISTENTRY pRootListEntry) 156 { 157 return SharedClipboardURIListEntryDestroy(pRootListEntry); 158 } 159 160 /** 161 * Allocates a URI list header structure. 162 * 163 * @returns VBox status code. 164 * @param ppListHdr Where to store the allocated URI list header structure on success. 101 165 */ 102 166 int SharedClipboardURIListHdrAlloc(PVBOXCLIPBOARDLISTHDR *ppListHdr) … … 118 182 119 183 /** 120 * Frees a VBOXCLIPBOARDListHdr structure.121 * 122 * @param pListEntry VBOXCLIPBOARDListHdr structure to free.184 * Frees an URI list header structure. 185 * 186 * @param pListEntry URI list header structure to free. 123 187 */ 124 188 void SharedClipboardURIListHdrFree(PVBOXCLIPBOARDLISTHDR pListHdr) … … 136 200 137 201 /** 138 * Duplicates (allocates) a VBOXCLIPBOARDListHdr structure.139 * 140 * @returns Duplicated VBOXCLIPBOARDListHdr structure on success.141 * @param pListHdr VBOXCLIPBOARDListHdr to duplicate.202 * Duplicates (allocates) an URI list header structure. 203 * 204 * @returns Duplicated URI list header structure on success. 205 * @param pListHdr URI list header to duplicate. 142 206 */ 143 207 PVBOXCLIPBOARDLISTHDR SharedClipboardURIListHdrDup(PVBOXCLIPBOARDLISTHDR pListHdr) … … 243 307 } 244 308 309 /** 310 * Duplicates an URI list open parameters structure. 311 * 312 * @returns Duplicated URI list open parameters structure on success, or NULL on failure. 313 * @param pParms URI list open parameters structure to duplicate. 314 */ 245 315 PVBOXCLIPBOARDLISTOPENPARMS SharedClipboardURIListOpenParmsDup(PVBOXCLIPBOARDLISTOPENPARMS pParms) 246 316 { … … 263 333 } 264 334 335 /** 336 * Initializes an URI list open parameters structure. 337 * 338 * @returns VBox status code. 339 * @param pParms URI list open parameters structure to initialize. 340 */ 265 341 int SharedClipboardURIListOpenParmsInit(PVBOXCLIPBOARDLISTOPENPARMS pParms) 266 342 { … … 269 345 RT_BZERO(pParms, sizeof(VBOXCLIPBOARDLISTOPENPARMS)); 270 346 271 pParms->cbFilter = 64; 347 pParms->cbFilter = 64; /** @todo Make this dynamic. */ 272 348 pParms->pszFilter = RTStrAlloc(pParms->cbFilter); 273 349 … … 279 355 } 280 356 357 /** 358 * Destroys an URI list open parameters structure. 359 * 360 * @param pParms URI list open parameters structure to destroy. 361 */ 281 362 void SharedClipboardURIListOpenParmsDestroy(PVBOXCLIPBOARDLISTOPENPARMS pParms) 282 363 { … … 418 499 419 500 pListEntry->cbName = VBOXCLIPBOARDLISTENTRY_MAX_NAME; 501 pListEntry->pvInfo = NULL; 502 pListEntry->cbInfo = 0; 503 pListEntry->fInfo = 0; 420 504 421 505 return VINF_SUCCESS; … … 423 507 424 508 /** 425 * Initializes a clipboard list entry structure.509 * Destroys a clipboard list entry structure. 426 510 * 427 511 * @param pListEntry Clipboard list entry structure to destroy. … … 502 586 return ( pObjCtx 503 587 && pObjCtx->uHandle != SHAREDCLIPBOARDOBJHANDLE_INVALID); 588 } 589 590 int SharedClipboardURIObjectOpen(PSHAREDCLIPBOARDURITRANSFER pTransfer, PVBOXCLIPBOARDOBJOPENCREATEPARMS pOpenCreateParms, 591 PSHAREDCLIPBOARDOBJHANDLE phObj) 592 { 593 RT_NOREF(pTransfer, pOpenCreateParms, phObj); 594 return 0; 595 } 596 597 int SharedClipboardURIObjectClose(SHAREDCLIPBOARDOBJHANDLE hObj) 598 { 599 RT_NOREF(hObj); 600 return 0; 601 } 602 603 int SharedClipboardURIObjectRead(SHAREDCLIPBOARDOBJHANDLE hObj, void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead, uint32_t fFlags) 604 { 605 RT_NOREF(hObj, pvBuf, cbBuf, pcbRead, fFlags); 606 return 0; 607 } 608 609 int SharedClipboardURIObjectWrite(SHAREDCLIPBOARDOBJHANDLE hObj, void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten, 610 uint32_t fFlags) 611 { 612 RT_NOREF(hObj, pvBuf, cbBuf, pcbWritten, fFlags); 613 return 0; 614 } 615 616 int SharedClipboardURIObjectQueryInfo(SHAREDCLIPBOARDOBJHANDLE hObj, PSHAREDCLIPBOARDFSOBJINFO pObjInfo) 617 { 618 RT_NOREF(hObj, pObjInfo); 619 return 0; 504 620 } 505 621 … … 526 642 int rc = VINF_SUCCESS; 527 643 644 pTransfer->State.uID = 0; 528 645 pTransfer->State.enmStatus = SHAREDCLIPBOARDURITRANSFERSTATUS_NONE; 529 646 pTransfer->State.enmDir = enmDir; … … 538 655 pTransfer->Thread.fStarted = false; 539 656 pTransfer->Thread.fStop = false; 657 658 pTransfer->uListHandleNext = 1; 659 pTransfer->uObjHandleNext = 1; 660 pTransfer->uEventIDNext = 1; 661 662 pTransfer->uTimeoutMs = 30 * 1000; /* 30s timeout by default. */ 663 pTransfer->cbMaxChunkSize = _64K; /** @todo Make this configurable. */ 540 664 541 665 pTransfer->pvUser = NULL; … … 628 752 static SHAREDCLIPBOARDLISTHANDLE sharedClipboardURITransferListHandleNew(PSHAREDCLIPBOARDURITRANSFER pTransfer) 629 753 { 630 RT_NOREF(pTransfer); 631 632 return 42; /** @todo FIX !!!!! */ 754 return pTransfer->uListHandleNext++; /** @todo Good enough for now. Improve this later. */ 633 755 } 634 756 … … 658 780 if (pInfo) 659 781 { 660 LogFlowFunc(("pszPath=% RU32\n", pOpenParms->pszPath));782 LogFlowFunc(("pszPath=%s\n", pOpenParms->pszPath)); 661 783 662 784 RTFSOBJINFO objInfo; … … 851 973 switch (pDirEntry->Info.Attr.fMode & RTFS_TYPE_MASK) 852 974 { 975 #if 0 /* No recursion here (yet). */ 853 976 case RTFS_TYPE_DIRECTORY: 854 977 { … … 876 999 break; 877 1000 } 878 1001 #endif 879 1002 case RTFS_TYPE_FILE: 880 1003 { … … 963 1086 Assert(pszFileName >= pszSrcPath); 964 1087 size_t cchDstBase = pszFileName - pszSrcPath; 1088 #ifdef VBOX_STRICT 965 1089 char *pszDstPath = &pszSrcPath[cchDstBase]; 966 967 LogFlowFunc(("pszSrcPath=%s, pszFileName=%s, pszDstPath=%s\n", pszSrcPath, pszFileName, pszDstPath)); 1090 LogFlowFunc(("pszSrcPath=%s, pszFileName=%s, pszDstPath=%s\n", 1091 pszSrcPath, pszFileName, pszDstPath)); 1092 #endif 968 1093 rc = sharedClipboardURITransferListHdrFromDir(pHdr, 969 1094 pszSrcPath, pszSrcPath, pszSrcPath, cchDstBase); … … 1039 1164 * Reads a single Shared Clipboard list entry. 1040 1165 * 1041 * @returns VBox status code .1166 * @returns VBox status code or VERR_NO_MORE_FILES if the end of the list has been reached. 1042 1167 * @param pTransfer URI clipboard transfer to handle. 1043 1168 * @param hList List handle of list to read from. … … 1079 1204 case RTFS_TYPE_DIRECTORY: 1080 1205 { 1081 LogFlowFunc(("Directory: %s\n", pDirEntry->szName));1082 1083 1206 /* Skip "." and ".." entries. */ 1084 1207 if (RTDirEntryExIsStdDotLink(pDirEntry)) 1208 { 1085 1209 fSkipEntry = true; 1086 1087 RT_FALL_THROUGH(); 1210 break; 1211 } 1212 1213 LogFlowFunc(("Directory: %s\n", pDirEntry->szName)); 1214 break; 1088 1215 } 1089 1216 … … 1091 1218 { 1092 1219 LogFlowFunc(("File: %s\n", pDirEntry->szName)); 1093 1094 pEntry->pvInfo = (PSHAREDCLIPBOARDFSOBJINFO)RTMemAlloc(sizeof(SHAREDCLIPBOARDFSOBJINFO));1095 if (pEntry->pvInfo)1096 {1097 rc = RTStrCopy(pEntry->pszName, pEntry->cbName, pDirEntry->szName);1098 if (RT_SUCCESS(rc))1099 {1100 SharedClipboardFsObjFromIPRT(PSHAREDCLIPBOARDFSOBJINFO(pEntry->pvInfo), &pDirEntry->Info);1101 1102 pEntry->cbInfo = sizeof(SHAREDCLIPBOARDFSOBJINFO);1103 pEntry->fInfo = VBOX_SHAREDCLIPBOARD_INFO_FLAG_FSOBJINFO;1104 }1105 }1106 else1107 rc = VERR_NO_MEMORY;1108 1220 break; 1109 1221 } … … 1111 1223 case RTFS_TYPE_SYMLINK: 1112 1224 { 1113 /** @todo Not implemented yet. */1225 rc = VERR_NOT_IMPLEMENTED; /** @todo Not implemented yet. */ 1114 1226 break; 1115 1227 } … … 1117 1229 default: 1118 1230 break; 1231 } 1232 1233 if ( RT_SUCCESS(rc) 1234 && !fSkipEntry) 1235 { 1236 pEntry->pvInfo = (PSHAREDCLIPBOARDFSOBJINFO)RTMemAlloc(sizeof(SHAREDCLIPBOARDFSOBJINFO)); 1237 if (pEntry->pvInfo) 1238 { 1239 rc = RTStrCopy(pEntry->pszName, pEntry->cbName, pDirEntry->szName); 1240 if (RT_SUCCESS(rc)) 1241 { 1242 SharedClipboardFsObjFromIPRT(PSHAREDCLIPBOARDFSOBJINFO(pEntry->pvInfo), &pDirEntry->Info); 1243 1244 pEntry->cbInfo = sizeof(SHAREDCLIPBOARDFSOBJINFO); 1245 pEntry->fInfo = VBOX_SHAREDCLIPBOARD_INFO_FLAG_FSOBJINFO; 1246 } 1247 } 1248 else 1249 rc = VERR_NO_MEMORY; 1119 1250 } 1120 1251 … … 1277 1408 } 1278 1409 1410 /** 1411 * Clears (resets) the root list of an URI transfer. 1412 * 1413 * @param pTransfer Transfer to clear URI root list for. 1414 */ 1415 static void sharedClipboardURIListTransferRootsClear(PSHAREDCLIPBOARDURITRANSFER pTransfer) 1416 { 1417 AssertPtrReturnVoid(pTransfer); 1418 1419 pTransfer->lstRootEntries.clear(); 1420 } 1421 1422 /** 1423 * Sets URI root list entries for a given transfer. 1424 * 1425 * @returns VBox status code. 1426 * @param pTransfer Transfer to set URI list entries for. 1427 * @param pszRoots String list (separated by CRLF) of root entries to set. 1428 * @param cbRoots Size (in bytes) of string list. 1429 */ 1279 1430 int SharedClipboardURILTransferSetRoots(PSHAREDCLIPBOARDURITRANSFER pTransfer, const char *pszRoots, size_t cbRoots) 1280 1431 { … … 1288 1439 int rc = VINF_SUCCESS; 1289 1440 1290 pTransfer->lstRootEntries.clear(); 1291 1292 pTransfer->lstRootEntries = RTCString(pszRoots, cbRoots - 1).split("\r\n"); 1441 sharedClipboardURIListTransferRootsClear(pTransfer); 1442 1443 RTCList<RTCString> lstRootEntries = RTCString(pszRoots, cbRoots - 1).split("\r\n"); 1444 for (size_t i = 0; i < lstRootEntries.size(); ++i) 1445 { 1446 SHAREDCLIPBOARDURILISTROOT listRoot; 1447 1448 listRoot.strPathAbs = lstRootEntries.at(i); 1449 1450 pTransfer->lstRootEntries.append(listRoot); 1451 } 1293 1452 1294 1453 LogFlowFunc(("cRoots=%RU32\n", pTransfer->lstRootEntries.size())); … … 1309 1468 LogFlowFuncEnter(); 1310 1469 1311 /** @todo Anything else to do here? */1470 sharedClipboardURIListTransferRootsClear(pTransfer); 1312 1471 } 1313 1472 … … 1325 1484 } 1326 1485 1327 int SharedClipboardURILTransferGetRoots(PSHAREDCLIPBOARDURITRANSFER pTransfer, char **ppszRoots, uint32_t *pcRoots) 1486 /** 1487 * Returns the number of URI root list entries. 1488 * 1489 * @returns Root list entry count. 1490 * @param pTransfer URI clipboard transfer to return root entry count for. 1491 */ 1492 uint32_t SharedClipboardURILTransferRootsCount(PSHAREDCLIPBOARDURITRANSFER pTransfer) 1493 { 1494 AssertPtrReturn(pTransfer, 0); 1495 1496 return (uint32_t)pTransfer->lstRootEntries.size(); 1497 } 1498 1499 /** 1500 * Get a specific root list entry. 1501 * 1502 * @returns VBox status code. 1503 * @param pTransfer URI clipboard transfer to get root list entry of. 1504 * @param uIndex Index (zero-based) of entry to get. 1505 * @param pEntry Where to store the returned entry on success. 1506 */ 1507 int SharedClipboardURILTransferRootsEntry(PSHAREDCLIPBOARDURITRANSFER pTransfer, 1508 uint32_t uIndex, PVBOXCLIPBOARDROOTLISTENTRY pEntry) 1328 1509 { 1329 1510 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 1330 AssertPtrReturn(ppszRoots, VERR_INVALID_POINTER); 1331 1332 int rc = VINF_SUCCESS; 1333 1334 if (pTransfer->State.enmSource == SHAREDCLIPBOARDSOURCE_LOCAL) 1335 { 1336 char *pszRoots = NULL; 1337 1338 for (size_t i = 0; i < pTransfer->lstRootEntries.size(); ++i) 1339 { 1340 rc = RTStrAAppend(&pszRoots, pTransfer->lstRootEntries.at(i).c_str()); 1341 1342 /* Add separation between paths. 1343 * Note: Also do this for the last element of the list. */ 1344 if (RT_SUCCESS(rc)) 1345 rc = RTStrAAppendExN(&pszRoots, 1 /* cPairs */, "\r\n", 2 /* Bytes */); 1346 1347 if (RT_FAILURE(rc)) 1348 break; 1349 } 1350 1511 AssertPtrReturn(pEntry, VERR_INVALID_POINTER); 1512 1513 if (uIndex >= pTransfer->lstRootEntries.size()) 1514 return VERR_INVALID_PARAMETER; 1515 1516 int rc; 1517 1518 PSHAREDCLIPBOARDURILISTROOT pRoot = &pTransfer->lstRootEntries.at(uIndex); 1519 AssertPtrReturn(pRoot, VERR_INVALID_POINTER); 1520 1521 /* Make sure that we only advertise relative source paths, not absolute ones. */ 1522 const char *pcszSrcPath = pRoot->strPathAbs.c_str(); 1523 1524 char *pszFileName = RTPathFilename(pcszSrcPath); 1525 if (pszFileName) 1526 { 1527 Assert(pszFileName >= pcszSrcPath); 1528 size_t cchDstBase = pszFileName - pcszSrcPath; 1529 const char *pszDstPath = &pcszSrcPath[cchDstBase]; 1530 1531 LogFlowFunc(("pcszSrcPath=%s, pszDstPath=%s\n", pcszSrcPath, pszDstPath)); 1532 1533 rc = SharedClipboardURIListEntryInit(pEntry); 1351 1534 if (RT_SUCCESS(rc)) 1352 1535 { 1353 LogFlowFunc(("Roots (%RU32):\n%s\n", pTransfer->lstRootEntries.size(), pszRoots)); 1354 1355 *ppszRoots = pszRoots; 1356 *pcRoots = (uint32_t)pTransfer->lstRootEntries.size(); 1536 rc = RTStrCopy(pEntry->pszName, pEntry->cbName, pszDstPath); 1537 if (RT_SUCCESS(rc)) 1538 { 1539 pEntry->cbInfo = sizeof(SHAREDCLIPBOARDFSOBJINFO); 1540 pEntry->pvInfo = (PSHAREDCLIPBOARDFSOBJINFO)RTMemAlloc(pEntry->cbInfo); 1541 if (pEntry->pvInfo) 1542 { 1543 RTFSOBJINFO fsObjInfo; 1544 rc = RTPathQueryInfo(pcszSrcPath, & fsObjInfo, RTFSOBJATTRADD_NOTHING); 1545 if (RT_SUCCESS(rc)) 1546 { 1547 SharedClipboardFsObjFromIPRT(PSHAREDCLIPBOARDFSOBJINFO(pEntry->pvInfo), &fsObjInfo); 1548 1549 pEntry->fInfo = VBOX_SHAREDCLIPBOARD_INFO_FLAG_FSOBJINFO; 1550 } 1551 } 1552 else 1553 rc = VERR_NO_MEMORY; 1554 } 1555 } 1556 } 1557 else 1558 rc = VERR_INVALID_POINTER; 1559 1560 LogFlowFuncLeaveRC(rc); 1561 return rc; 1562 } 1563 1564 /** 1565 * Returns the root entries of an URI transfer. 1566 * 1567 * @returns VBox status code. 1568 * @param pTransfer URI clipboard transfer to return root entries for. 1569 * @param ppRootList Where to store the root list on success. 1570 */ 1571 int SharedClipboardURILTransferRootsAsList(PSHAREDCLIPBOARDURITRANSFER pTransfer, PVBOXCLIPBOARDROOTLIST *ppRootList) 1572 { 1573 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 1574 AssertPtrReturn(ppRootList, VERR_INVALID_POINTER); 1575 1576 int rc = VINF_SUCCESS; 1577 1578 if (pTransfer->State.enmSource == SHAREDCLIPBOARDSOURCE_LOCAL) 1579 { 1580 PVBOXCLIPBOARDROOTLIST pRootList = SharedClipboardURIRootListAlloc(); 1581 if (!pRootList) 1582 return VERR_NO_MEMORY; 1583 1584 const uint32_t cRoots = (uint32_t)pTransfer->lstRootEntries.size(); 1585 1586 LogFlowFunc(("cRoots=%RU32\n", cRoots)); 1587 1588 if (cRoots) 1589 { 1590 PVBOXCLIPBOARDROOTLISTENTRY paRootListEntries 1591 = (PVBOXCLIPBOARDROOTLISTENTRY)RTMemAllocZ(cRoots * sizeof(VBOXCLIPBOARDROOTLISTENTRY)); 1592 if (paRootListEntries) 1593 { 1594 for (uint32_t i = 0; i < cRoots; ++i) 1595 { 1596 rc = SharedClipboardURILTransferRootsEntry(pTransfer, i, &paRootListEntries[i]); 1597 if (RT_FAILURE(rc)) 1598 break; 1599 } 1600 1601 if (RT_SUCCESS(rc)) 1602 pRootList->paEntries = paRootListEntries; 1603 } 1604 else 1605 rc = VERR_NO_MEMORY; 1357 1606 } 1358 1607 else 1608 rc = VERR_NOT_FOUND; 1609 1610 if (RT_SUCCESS(rc)) 1359 1611 { 1360 if (pszRoots) 1361 RTStrFree(pszRoots); 1612 pRootList->Hdr.cRoots = cRoots; 1613 pRootList->Hdr.fRoots = 0; /** @todo Implement this. */ 1614 1615 *ppRootList = pRootList; 1362 1616 } 1363 1617 } … … 1365 1619 { 1366 1620 if (pTransfer->ProviderIface.pfnGetRoots) 1367 rc = pTransfer->ProviderIface.pfnGetRoots(&pTransfer->ProviderCtx, pp szRoots, pcRoots);1621 rc = pTransfer->ProviderIface.pfnGetRoots(&pTransfer->ProviderCtx, ppRootList); 1368 1622 else 1369 1623 rc = VERR_NOT_SUPPORTED; … … 1374 1628 } 1375 1629 1630 /** 1631 * Returns the transfer's source. 1632 * 1633 * @returns The transfer's source. 1634 * @param pTransfer URI clipboard transfer to return source for. 1635 */ 1376 1636 SHAREDCLIPBOARDSOURCE SharedClipboardURITransferGetSource(PSHAREDCLIPBOARDURITRANSFER pTransfer) 1377 1637 { … … 1447 1707 } 1448 1708 1709 /** 1710 * Allocates a new event payload. 1711 * 1712 * @returns VBox status code. 1713 * @param uID Event ID to associate payload to. 1714 * @param pvData Data block to associate to this payload. 1715 * @param cbData Size (in bytes) of data block to associate. 1716 * @param ppPayload Where to store the allocated event payload on success. 1717 */ 1449 1718 int SharedClipboardURITransferPayloadAlloc(uint32_t uID, const void *pvData, uint32_t cbData, 1450 1719 PSHAREDCLIPBOARDURITRANSFERPAYLOAD *ppPayload) … … 1472 1741 } 1473 1742 1743 /** 1744 * Frees an event payload. 1745 * 1746 * @returns VBox status code. 1747 * @param pPayload URI clipboard transfer event payload to free. 1748 */ 1474 1749 void SharedClipboardURITransferPayloadFree(PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload) 1475 1750 { … … 1490 1765 } 1491 1766 1492 int SharedClipboardURITransferEventRegister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t uID) 1767 /** 1768 * Generates a new event ID for a specific URI transfer. 1769 * 1770 * @returns New event ID generated, or 0 on error. 1771 * @param pTransfer URI clipboard transfer to generate event for. 1772 */ 1773 uint16_t SharedClipboardURITransferEventIDGenerate(PSHAREDCLIPBOARDURITRANSFER pTransfer) 1774 { 1775 LogFlowFunc(("New event %RU16\n", pTransfer->uEventIDNext)); 1776 return pTransfer->uEventIDNext++; /** @todo Improve this. */ 1777 } 1778 1779 /** 1780 * Registers an URI transfer event. 1781 * 1782 * @returns VBox status code. 1783 * @param pTransfer URI clipboard transfer to register event for. 1784 * @param uID Event ID to register. 1785 */ 1786 int SharedClipboardURITransferEventRegister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID) 1493 1787 { 1494 1788 int rc; … … 1504 1798 if (RT_SUCCESS(rc)) 1505 1799 { 1506 pTransfer->pMapEvents->insert(std::pair<uint32_t, PSHAREDCLIPBOARDURITRANSFEREVENT>(uID, pEvent)); /** @todo Can this throw? */ 1800 pTransfer->pMapEvents->insert(std::pair<uint16_t, PSHAREDCLIPBOARDURITRANSFEREVENT>(uID, pEvent)); /** @todo Can this throw? */ 1801 1802 LogFlowFunc(("Event %RU16\n", uID)); 1507 1803 } 1508 1804 } … … 1511 1807 } 1512 1808 else 1513 rc = VINF_SUCCESS; 1809 rc = VERR_ALREADY_EXISTS; 1810 1811 #ifdef DEBUG_andy 1812 AssertRC(rc); 1813 #endif 1514 1814 1515 1815 LogFlowFuncLeaveRC(rc); … … 1517 1817 } 1518 1818 1519 int SharedClipboardURITransferEventUnregister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t uID) 1819 /** 1820 * Unregisters an URI transfer event. 1821 * 1822 * @returns VBox status code. 1823 * @param pTransfer URI clipboard transfer to unregister event for. 1824 * @param uID Event ID to unregister. 1825 */ 1826 int SharedClipboardURITransferEventUnregister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID) 1520 1827 { 1521 1828 int rc; … … 1532 1839 pTransfer->pMapEvents->erase(itEvent); 1533 1840 1841 LogFlowFunc(("Event %RU16\n", uID)); 1842 1534 1843 rc = VINF_SUCCESS; 1535 1844 } … … 1537 1846 rc = VERR_NOT_FOUND; 1538 1847 1848 AssertRC(rc); 1849 1539 1850 LogFlowFuncLeaveRC(rc); 1540 1851 return rc; 1541 1852 } 1542 1853 1543 int SharedClipboardURITransferEventWait(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t uID, RTMSINTERVAL uTimeoutMs, 1854 /** 1855 * Waits for an URI transfer event to get signalled. 1856 * 1857 * @returns VBox status code. 1858 * @param pTransfer URI clipboard transfer that contains the event to wait for. 1859 * @param uID Event ID to wait for. 1860 * @param uTimeoutMs Timeout (in ms) to wait. 1861 * @param ppPayload Where to store the (allocated) event payload on success. Needs to be free'd with 1862 * SharedClipboardURITransferPayloadFree(). 1863 */ 1864 int SharedClipboardURITransferEventWait(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID, RTMSINTERVAL uTimeoutMs, 1544 1865 PSHAREDCLIPBOARDURITRANSFERPAYLOAD *ppPayload) 1545 1866 { … … 1566 1887 } 1567 1888 1568 int SharedClipboardURITransferEventSignal(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t uID, 1889 /** 1890 * Signals an URI transfer event. 1891 * 1892 * @returns VBox status code. 1893 * @param pTransfer URI clipboard transfer of event to signal. 1894 * @param uID Event ID to signal. 1895 * @param pPayload Event payload to associate. Takes ownership. Optional. 1896 */ 1897 int SharedClipboardURITransferEventSignal(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID, 1569 1898 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload) 1570 1899 { … … 1582 1911 else 1583 1912 rc = VERR_NOT_FOUND; 1913 1914 #ifdef DEBUG_andy 1915 AssertRC(rc); 1916 #endif 1584 1917 1585 1918 LogFlowFuncLeaveRC(rc); -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-internal.h
r79631 r80283 222 222 PVBOXCLIPBOARDLISTENTRY pListEntry); 223 223 224 int vboxSvcClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const char *pszPath,225 P VBOXCLIPBOARDCREATEPARMS pCreateParms, PSHAREDCLIPBOARDOBJHANDLE phObj);224 int vboxSvcClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDOBJOPENCREATEPARMS pCreateParms, 225 PSHAREDCLIPBOARDOBJHANDLE phObj); 226 226 int vboxSvcClipboardURIObjClose(PSHAREDCLIPBOARDPROVIDERCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj); 227 227 int vboxSvcClipboardURIObjRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj, -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp
r79704 r80283 25 25 #include <VBox/err.h> 26 26 27 #include <VBox/GuestHost/clipboard-helper.h> 27 28 #include <VBox/HostServices/VBoxClipboardSvc.h> 28 29 #include <VBox/HostServices/VBoxClipboardExt.h> … … 49 50 * Prototypes * 50 51 *********************************************************************************************************************************/ 51 int VBoxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],52 PVBOXCLIPBOARDLISTOPENPARMS pOpenParms);53 int VBoxSvcClipboardURISetListClose(uint32_t cParms, VBOXHGCMSVCPARM paParms[],54 SHAREDCLIPBOARDLISTHANDLE hList);52 static int vboxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 53 PVBOXCLIPBOARDLISTOPENPARMS pOpenParms); 54 static int vboxSvcClipboardURISetListClose(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 55 SHAREDCLIPBOARDLISTHANDLE hList); 55 56 56 57 … … 75 76 } 76 77 77 DECLCALLBACK(int) vboxSvcClipboardURIGetRoots(PSHAREDCLIPBOARDPROVIDERCTX pCtx, 78 char **ppapszRoots, uint32_t *pcRoots) 78 DECLCALLBACK(int) vboxSvcClipboardURIGetRoots(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDROOTLIST *ppRootList) 79 79 { 80 80 LogFlowFuncEnter(); … … 85 85 int rc; 86 86 87 size_t cbRootsRecv = 0; 88 89 char *pszRoots = NULL; 90 uint32_t cRoots = 0; 91 92 /* There might be more than one message needed for retrieving all root items. */ 93 for (;;) 94 { 95 PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOTS, 96 VBOX_SHARED_CLIPBOARD_CPARMS_ROOTS); 97 if (pMsg) 98 { 99 HGCMSvcSetU32(&pMsg->m_paParms[0], 0 /* uContextID */); 100 HGCMSvcSetU32(&pMsg->m_paParms[1], 0 /* fRoots */); 101 HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fMore */); 102 HGCMSvcSetU32(&pMsg->m_paParms[3], 0 /* cRoots */); 103 104 uint32_t cbData = _64K; 105 void *pvData = RTMemAlloc(cbData); 106 AssertPtrBreakStmt(pvData, rc = VERR_NO_MEMORY); 107 108 HGCMSvcSetU32(&pMsg->m_paParms[4], cbData); 109 HGCMSvcSetPv (&pMsg->m_paParms[5], pvData, cbData); 110 111 rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsg, true /* fAppend */); 112 if (RT_SUCCESS(rc)) 113 { 114 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, 115 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_GET_ROOTS); 116 AssertRC(rc2); 117 118 vboxSvcClipboardClientWakeup(pClient); 119 } 120 } 121 else 122 rc = VERR_NO_MEMORY; 123 124 if (RT_SUCCESS(rc)) 125 { 126 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 127 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_GET_ROOTS, 128 30 * 1000 /* Timeout in ms */, &pPayload); 129 if (RT_SUCCESS(rc)) 130 { 131 PVBOXCLIPBOARDROOTS pRoots = (PVBOXCLIPBOARDROOTS)pPayload->pvData; 132 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDROOTS)); 133 134 LogFlowFunc(("cbRoots=%RU32, fRoots=%RU32, fMore=%RTbool\n", pRoots->cbRoots, pRoots->fRoots, pRoots->fMore)); 135 136 if (!pRoots->cbRoots) 137 break; 138 AssertPtr(pRoots->pszRoots); 139 140 if (pszRoots == NULL) 141 pszRoots = (char *)RTMemDup((void *)pRoots->pszRoots, pRoots->cbRoots); 142 else 143 pszRoots = (char *)RTMemRealloc(pszRoots, cbRootsRecv + pRoots->cbRoots); 144 145 AssertPtrBreakStmt(pszRoots, rc = VERR_NO_MEMORY); 146 147 cbRootsRecv += pRoots->cbRoots; 148 149 if (cbRootsRecv > _32M) /* Don't allow more than 32MB root entries for now. */ 87 PVBOXCLIPBOARDCLIENTMSG pMsgHdr = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_READ, 88 VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_HDR_READ); 89 if (pMsgHdr) 90 { 91 uint16_t uEventHdrRead = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer); 92 93 HGCMSvcSetU32(&pMsgHdr->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEventHdrRead)); 94 HGCMSvcSetU32(&pMsgHdr->m_paParms[1], 0 /* fRoots */); 95 96 rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsgHdr, true /* fAppend */); 97 if (RT_SUCCESS(rc)) 98 { 99 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEventHdrRead); 100 AssertRC(rc2); 101 102 rc = vboxSvcClipboardClientWakeup(pClient); 103 if (RT_SUCCESS(rc)) 104 { 105 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayloadHdr; 106 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEventHdrRead, 107 pCtx->pTransfer->uTimeoutMs, &pPayloadHdr); 108 if (RT_SUCCESS(rc)) 150 109 { 151 rc = VERR_ALLOCATION_TOO_BIG; /** @todo Find a better rc. */ 152 break; 110 PVBOXCLIPBOARDROOTLISTHDR pSrcRootListHdr = (PVBOXCLIPBOARDROOTLISTHDR)pPayloadHdr->pvData; 111 Assert(pPayloadHdr->cbData == sizeof(VBOXCLIPBOARDROOTLISTHDR)); 112 113 LogFlowFunc(("cRoots=%RU32, fRoots=0x%x\n", pSrcRootListHdr->cRoots, pSrcRootListHdr->fRoots)); 114 115 PVBOXCLIPBOARDROOTLIST pRootList = SharedClipboardURIRootListAlloc(); 116 if (pRootList) 117 { 118 if (pSrcRootListHdr->cRoots) 119 { 120 pRootList->paEntries = 121 (PVBOXCLIPBOARDROOTLISTENTRY)RTMemAllocZ(pSrcRootListHdr->cRoots * sizeof(VBOXCLIPBOARDROOTLISTENTRY)); 122 123 if (pRootList->paEntries) 124 { 125 for (uint32_t i = 0; i < pSrcRootListHdr->cRoots; i++) 126 { 127 PVBOXCLIPBOARDCLIENTMSG pMsgEntry = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_ENTRY_READ, 128 VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_ENTRY_READ_REQ); 129 130 uint16_t uEventEntryRead = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer); 131 132 HGCMSvcSetU32(&pMsgEntry->m_paParms[0], 133 VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEventEntryRead)); 134 HGCMSvcSetU32(&pMsgEntry->m_paParms[1], 0 /* fRoots */); 135 HGCMSvcSetU32(&pMsgEntry->m_paParms[2], i /* uIndex */); 136 137 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEventEntryRead); 138 AssertRC(rc2); 139 140 rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsgEntry, true /* fAppend */); 141 if (RT_FAILURE(rc)) 142 break; 143 144 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayloadEntry; 145 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEventEntryRead, 146 pCtx->pTransfer->uTimeoutMs, &pPayloadEntry); 147 if (RT_FAILURE(rc)) 148 break; 149 150 PVBOXCLIPBOARDROOTLISTENTRY pSrcRootListEntry = (PVBOXCLIPBOARDROOTLISTENTRY)pPayloadEntry->pvData; 151 Assert(pPayloadEntry->cbData == sizeof(VBOXCLIPBOARDROOTLISTENTRY)); 152 153 rc = SharedClipboardURIListEntryCopy(&pRootList->paEntries[i], pSrcRootListEntry); 154 155 SharedClipboardURITransferPayloadFree(pPayloadEntry); 156 157 SharedClipboardURITransferEventUnregister(pCtx->pTransfer, uEventEntryRead); 158 159 if (RT_FAILURE(rc)) 160 break; 161 } 162 } 163 else 164 rc = VERR_NO_MEMORY; 165 } 166 167 if (RT_SUCCESS(rc)) 168 { 169 pRootList->Hdr.cRoots = pSrcRootListHdr->cRoots; 170 pRootList->Hdr.fRoots = 0; /** @todo Implement this. */ 171 172 *ppRootList = pRootList; 173 } 174 else 175 SharedClipboardURIRootListFree(pRootList); 176 177 SharedClipboardURITransferPayloadFree(pPayloadHdr); 178 } 179 else 180 rc = VERR_NO_MEMORY; 153 181 } 154 155 cRoots += pRoots->cRoots; 156 157 const bool fDone = !RT_BOOL(pRoots->fMore); /* More root entries to be retrieved? Otherwise bail out. */ 158 159 SharedClipboardURITransferPayloadFree(pPayload); 160 161 if (fDone) 162 break; 163 } 164 } 165 166 if (RT_FAILURE(rc)) 167 break; 168 } 169 170 if (RT_SUCCESS(rc)) 171 { 172 LogFlowFunc(("cRoots=%RU32\n", cRoots)); 173 174 *ppapszRoots = pszRoots; 175 *pcRoots = cRoots; 182 } 183 184 SharedClipboardURITransferEventUnregister(pCtx->pTransfer, uEventHdrRead); 185 } 176 186 } 177 187 else 178 { 179 RTMemFree(pszRoots); 180 pszRoots = NULL; 181 } 188 rc = VERR_NO_MEMORY; 182 189 183 190 LogFlowFuncLeave(); … … 199 206 if (pMsg) 200 207 { 201 rc = VBoxSvcClipboardURISetListOpen(pMsg->m_cParms, pMsg->m_paParms, pOpenParms);208 rc = vboxSvcClipboardURISetListOpen(pMsg->m_cParms, pMsg->m_paParms, pOpenParms); 202 209 if (RT_SUCCESS(rc)) 203 210 { … … 205 212 if (RT_SUCCESS(rc)) 206 213 { 207 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN); 214 uint16_t uEvent = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer); 215 216 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEvent); 208 217 AssertRC(rc2); 209 218 210 vboxSvcClipboardClientWakeup(pClient); 219 rc = vboxSvcClipboardClientWakeup(pClient); 220 if (RT_SUCCESS(rc)) 221 { 222 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 223 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload); 224 if (RT_SUCCESS(rc)) 225 { 226 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDREPLY)); 227 228 PVBOXCLIPBOARDREPLY pReply = (PVBOXCLIPBOARDREPLY)pPayload->pvData; 229 AssertPtr(pReply); 230 231 Assert(pReply->uType == VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN); 232 233 *phList = pReply->u.ListOpen.uHandle; 234 235 SharedClipboardURITransferPayloadFree(pPayload); 236 } 237 } 238 239 SharedClipboardURITransferEventUnregister(pCtx->pTransfer, uEvent); 211 240 } 212 241 } … … 214 243 else 215 244 rc = VERR_NO_MEMORY; 216 217 if (RT_SUCCESS(rc))218 {219 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;220 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN,221 30 * 1000 /* Timeout in ms */, &pPayload);222 if (RT_SUCCESS(rc))223 {224 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDREPLY));225 226 PVBOXCLIPBOARDREPLY pReply = (PVBOXCLIPBOARDREPLY)pPayload->pvData;227 AssertPtr(pReply);228 229 Assert(pReply->uType == VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN);230 231 *phList = pReply->u.ListOpen.uHandle;232 233 SharedClipboardURITransferPayloadFree(pPayload);234 }235 }236 245 237 246 LogFlowFuncLeaveRC(rc); … … 252 261 if (pMsg) 253 262 { 254 rc = VBoxSvcClipboardURISetListClose(pMsg->m_cParms, pMsg->m_paParms, hList);263 rc = vboxSvcClipboardURISetListClose(pMsg->m_cParms, pMsg->m_paParms, hList); 255 264 if (RT_SUCCESS(rc)) 256 265 { … … 258 267 if (RT_SUCCESS(rc)) 259 268 { 260 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_CLOSE); 269 uint16_t uEvent = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer); 270 271 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEvent); 261 272 AssertRC(rc2); 262 273 263 vboxSvcClipboardClientWakeup(pClient); 274 rc = vboxSvcClipboardClientWakeup(pClient); 275 if (RT_SUCCESS(rc)) 276 { 277 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 278 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload); 279 if (RT_SUCCESS(rc)) 280 SharedClipboardURITransferPayloadFree(pPayload); 281 } 282 283 SharedClipboardURITransferEventUnregister(pCtx->pTransfer, uEvent); 264 284 } 265 285 } … … 267 287 else 268 288 rc = VERR_NO_MEMORY; 269 270 if (RT_SUCCESS(rc))271 {272 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;273 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_CLOSE,274 30 * 1000 /* Timeout in ms */, &pPayload);275 if (RT_SUCCESS(rc))276 SharedClipboardURITransferPayloadFree(pPayload);277 }278 289 279 290 LogFlowFuncLeaveRC(rc); … … 302 313 if (RT_SUCCESS(rc)) 303 314 { 304 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE); 315 uint16_t uEvent = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer); 316 317 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEvent); 305 318 AssertRC(rc2); 306 319 307 vboxSvcClipboardClientWakeup(pClient); 320 rc = vboxSvcClipboardClientWakeup(pClient); 321 if (RT_SUCCESS(rc)) 322 { 323 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 324 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEvent, 325 pCtx->pTransfer->uTimeoutMs, &pPayload); 326 if (RT_SUCCESS(rc)) 327 { 328 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTHDR)); 329 330 *pListHdr = *(PVBOXCLIPBOARDLISTHDR)pPayload->pvData; 331 332 SharedClipboardURITransferPayloadFree(pPayload); 333 } 334 } 308 335 } 309 336 } … … 311 338 rc = VERR_NO_MEMORY; 312 339 313 if (RT_SUCCESS(rc))314 {315 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;316 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE,317 30 * 1000 /* Timeout in ms */, &pPayload);318 if (RT_SUCCESS(rc))319 {320 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTHDR));321 322 *pListHdr = *(PVBOXCLIPBOARDLISTHDR)pPayload->pvData;323 324 SharedClipboardURITransferPayloadFree(pPayload);325 }326 }327 328 340 LogFlowFuncLeaveRC(rc); 329 341 return rc; … … 351 363 352 364 PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ, 353 VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ _REQ);365 VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ); 354 366 if (pMsg) 355 367 { 356 HGCMSvcSetU32(&pMsg->m_paParms[0], 0 /* uContextID */); 368 uint16_t uEvent = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer); 369 370 HGCMSvcSetU32(&pMsg->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEvent)); 357 371 HGCMSvcSetU64(&pMsg->m_paParms[1], hList); 358 372 HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fInfo */); … … 361 375 if (RT_SUCCESS(rc)) 362 376 { 363 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE); 364 if (rc2 == VERR_ALREADY_EXISTS) 365 rc2 = VINF_SUCCESS; 377 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEvent); 366 378 AssertRC(rc2); 367 379 368 vboxSvcClipboardClientWakeup(pClient); 380 rc = vboxSvcClipboardClientWakeup(pClient); 381 if (RT_SUCCESS(rc)) 382 { 383 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 384 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload); 385 if (RT_SUCCESS(rc)) 386 { 387 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTENTRY)); 388 389 rc = SharedClipboardURIListEntryCopy(pListEntry, (PVBOXCLIPBOARDLISTENTRY)pPayload->pvData); 390 391 SharedClipboardURITransferPayloadFree(pPayload); 392 } 393 } 369 394 } 370 395 } … … 372 397 rc = VERR_NO_MEMORY; 373 398 374 if (RT_SUCCESS(rc))375 {376 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;377 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE,378 30 * 1000 /* Timeout in ms */, &pPayload);379 if (RT_SUCCESS(rc))380 {381 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTENTRY));382 383 rc = SharedClipboardURIListEntryCopy(pListEntry, (PVBOXCLIPBOARDLISTENTRY)pPayload->pvData);384 385 SharedClipboardURITransferPayloadFree(pPayload);386 }387 }388 389 399 LogFlowFuncLeaveRC(rc); 390 400 return rc; … … 401 411 } 402 412 403 int vboxSvcClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const char *pszPath,404 P VBOXCLIPBOARDCREATEPARMS pCreateParms, PSHAREDCLIPBOARDOBJHANDLE phObj)405 { 406 RT_NOREF(pCtx, p szPath, pCreateParms, phObj);413 int vboxSvcClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDOBJOPENCREATEPARMS pCreateParms, 414 PSHAREDCLIPBOARDOBJHANDLE phObj) 415 { 416 RT_NOREF(pCtx, pCreateParms, phObj); 407 417 408 418 LogFlowFuncEnter(); … … 413 423 AssertPtr(pThisCtx); 414 424 425 RT_NOREF(pThisCtx); 426 415 427 LogFlowFuncLeaveRC(rc); 416 428 return rc; … … 427 439 PVBOXCLIPBOARDCONTEXT pThisCtx = (PVBOXCLIPBOARDCONTEXT)pCtx->pvUser; 428 440 AssertPtr(pThisCtx); 441 442 RT_NOREF(pThisCtx); 429 443 430 444 LogFlowFuncLeaveRC(rc); … … 509 523 * @param pReply Where to store the reply. 510 524 */ 511 int VBoxSvcClipboardURIGetReply(uint32_t cParms, VBOXHGCMSVCPARM paParms[],512 PVBOXCLIPBOARDREPLY pReply)525 static int vboxSvcClipboardURIGetReply(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 526 PVBOXCLIPBOARDREPLY pReply) 513 527 { 514 528 int rc; … … 518 532 uint32_t cbPayload = 0; 519 533 520 /* Note: Context ID (paParms[0]) not used yet. */521 534 rc = HGCMSvcGetU32(&paParms[1], &pReply->uType); 522 535 if (RT_SUCCESS(rc)) … … 569 582 570 583 /** 571 * Gets the URI root entriesfrom HGCM service parameters.584 * Gets an URI root list header from HGCM service parameters. 572 585 * 573 586 * @returns VBox status code. 574 587 * @param cParms Number of HGCM parameters supplied in \a paParms. 575 588 * @param paParms Array of HGCM parameters. 576 * @param pRoot s Where to store the URI root entrieson success.577 */ 578 int VBoxSvcClipboardURIGetRoots(uint32_t cParms, VBOXHGCMSVCPARM paParms[],579 PVBOXCLIPBOARDROOTS pRoots)589 * @param pRootLstHdr Where to store the URI root list header on success. 590 */ 591 static int vboxSvcClipboardURIGetRootListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 592 PVBOXCLIPBOARDROOTLISTHDR pRootLstHdr) 580 593 { 581 594 int rc; 582 595 583 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_ROOTS) 584 { 585 /* Note: Context ID (paParms[0]) not used yet. */ 586 rc = HGCMSvcGetU32(&paParms[1], &pRoots->fRoots); 587 if (RT_SUCCESS(rc)) 588 { 589 uint32_t fMore; 590 rc = HGCMSvcGetU32(&paParms[2], &fMore); 591 if (RT_SUCCESS(rc)) 592 pRoots->fMore = RT_BOOL(fMore); 593 } 594 if (RT_SUCCESS(rc)) 595 rc = HGCMSvcGetU32(&paParms[3], &pRoots->cRoots); 596 if (RT_SUCCESS(rc)) 597 { 598 uint32_t cbRoots; 599 rc = HGCMSvcGetU32(&paParms[4], &cbRoots); 600 if (RT_SUCCESS(rc)) 601 rc = HGCMSvcGetPv(&paParms[5], (void **)&pRoots->pszRoots, &pRoots->cbRoots); 602 603 AssertReturn(cbRoots == pRoots->cbRoots, VERR_INVALID_PARAMETER); 596 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_HDR) 597 { 598 rc = HGCMSvcGetU32(&paParms[1], &pRootLstHdr->fRoots); 599 if (RT_SUCCESS(rc)) 600 rc = HGCMSvcGetU32(&paParms[2], &pRootLstHdr->cRoots); 601 } 602 else 603 rc = VERR_INVALID_PARAMETER; 604 605 LogFlowFuncLeaveRC(rc); 606 return rc; 607 } 608 609 /** 610 * Gets an URI root list entry from HGCM service parameters. 611 * 612 * @returns VBox status code. 613 * @param cParms Number of HGCM parameters supplied in \a paParms. 614 * @param paParms Array of HGCM parameters. 615 * @param pListEntry Where to store the root list entry. 616 */ 617 static int vboxSvcClipboardURIGetRootListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 618 PVBOXCLIPBOARDROOTLISTENTRY pListEntry) 619 { 620 int rc; 621 622 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_ENTRY) 623 { 624 rc = HGCMSvcGetU32(&paParms[1], &pListEntry->fInfo); 625 /* Note: paParms[2] contains the entry index, currently being ignored. */ 626 if (RT_SUCCESS(rc)) 627 rc = HGCMSvcGetPv(&paParms[3], (void **)&pListEntry->pszName, &pListEntry->cbName); 628 if (RT_SUCCESS(rc)) 629 { 630 uint32_t cbInfo; 631 rc = HGCMSvcGetU32(&paParms[4], &cbInfo); 632 if (RT_SUCCESS(rc)) 633 { 634 rc = HGCMSvcGetPv(&paParms[5], &pListEntry->pvInfo, &pListEntry->cbInfo); 635 AssertReturn(cbInfo == pListEntry->cbInfo, VERR_INVALID_PARAMETER); 636 } 604 637 } 605 638 } … … 619 652 * @param pOpenParms Where to store the open parameters of the request. 620 653 */ 621 int VBoxSvcClipboardURIGetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],622 PVBOXCLIPBOARDLISTOPENPARMS pOpenParms)654 static int vboxSvcClipboardURIGetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 655 PVBOXCLIPBOARDLISTOPENPARMS pOpenParms) 623 656 { 624 657 int rc; … … 629 662 uint32_t cbFilter = 0; 630 663 631 /* Note: Context ID (paParms[0]) not used yet. */632 664 rc = HGCMSvcGetU32(&paParms[1], &pOpenParms->fList); 633 665 if (RT_SUCCESS(rc)) … … 666 698 * @param pOpenParms List open parameters to set. 667 699 */ 668 int VBoxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],669 PVBOXCLIPBOARDLISTOPENPARMS pOpenParms)700 static int vboxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 701 PVBOXCLIPBOARDLISTOPENPARMS pOpenParms) 670 702 { 671 703 int rc; … … 698 730 * @param hList Handle of list to close. 699 731 */ 700 int VBoxSvcClipboardURISetListClose(uint32_t cParms, VBOXHGCMSVCPARM paParms[],701 SHAREDCLIPBOARDLISTHANDLE hList)732 static int vboxSvcClipboardURISetListClose(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 733 SHAREDCLIPBOARDLISTHANDLE hList) 702 734 { 703 735 int rc; … … 726 758 * @param pListHdr Where to store the list header. 727 759 */ 728 int VBoxSvcClipboardURIGetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[],729 PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTHDR pListHdr)760 static int vboxSvcClipboardURIGetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 761 PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTHDR pListHdr) 730 762 { 731 763 int rc; … … 733 765 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR) 734 766 { 735 /* Note: Context ID (paParms[0]) not used yet. */736 767 rc = HGCMSvcGetU64(&paParms[1], phList); 737 768 /* Note: Flags (paParms[2]) not used here. */ … … 768 799 * @param pListHdr Pointer to data to set to the HGCM parameters. 769 800 */ 770 int VBoxSvcClipboardURISetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDLISTHDR pListHdr)801 static int vboxSvcClipboardURISetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDLISTHDR pListHdr) 771 802 { 772 803 int rc; … … 804 835 * @param pListEntry Where to store the list entry. 805 836 */ 806 int VBoxSvcClipboardURIGetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[],807 PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTENTRY pListEntry)837 static int vboxSvcClipboardURIGetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 838 PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTENTRY pListEntry) 808 839 { 809 840 int rc; … … 811 842 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY) 812 843 { 813 /* Note: Context ID (paParms[0]) not used yet. */814 844 rc = HGCMSvcGetU64(&paParms[1], phList); 815 845 if (RT_SUCCESS(rc)) … … 849 879 * @param pListEntry Pointer to data to set to the HGCM parameters. 850 880 */ 851 int VBoxSvcClipboardURISetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDLISTENTRY pListEntry)881 static int vboxSvcClipboardURISetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDLISTENTRY pListEntry) 852 882 { 853 883 int rc; … … 879 909 * @param pRc Where to store the received error code. 880 910 */ 881 int VBoxSvcClipboardURIGetError(uint32_t cParms, VBOXHGCMSVCPARM paParms[], int *pRc)911 static int vboxSvcClipboardURIGetError(uint32_t cParms, VBOXHGCMSVCPARM paParms[], int *pRc) 882 912 { 883 913 AssertPtrReturn(paParms, VERR_INVALID_PARAMETER); … … 888 918 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_ERROR) 889 919 { 890 /* Note: Context ID (paParms[0]) not used yet. */891 920 rc = HGCMSvcGetU32(&paParms[1], (uint32_t *)pRc); /** @todo int vs. uint32_t !!! */ 892 921 } … … 907 936 * @param paParms Array function parameters supplied. 908 937 */ 909 int VBoxSvcClipboardURITransferHandleReply(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDURITRANSFER pTransfer,910 uint32_t cParms, VBOXHGCMSVCPARM paParms[])938 static int vboxSvcClipboardURITransferHandleReply(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDURITRANSFER pTransfer, 939 uint32_t cParms, VBOXHGCMSVCPARM paParms[]) 911 940 { 912 941 RT_NOREF(pClient); … … 918 947 if (pReply) 919 948 { 920 rc = VBoxSvcClipboardURIGetReply(cParms, paParms, pReply);949 rc = vboxSvcClipboardURIGetReply(cParms, paParms, pReply); 921 950 if (RT_SUCCESS(rc)) 922 951 { … … 931 960 { 932 961 case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN: 933 { 934 rc = SharedClipboardURITransferEventSignal(pTransfer, 935 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN, pPayload); 936 break; 937 } 938 962 RT_FALL_THROUGH(); 939 963 case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_CLOSE: 940 { 941 rc = SharedClipboardURITransferEventSignal(pTransfer, 942 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_CLOSE, pPayload); 943 break; 944 } 945 964 RT_FALL_THROUGH(); 946 965 case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_OBJ_OPEN: 947 { 948 rc = SharedClipboardURITransferEventSignal(pTransfer, 949 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_OBJ_OPEN, pPayload); 950 break; 951 } 952 966 RT_FALL_THROUGH(); 953 967 case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_OBJ_CLOSE: 954 968 { 955 rc = SharedClipboardURITransferEventSignal(pTransfer, 956 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_OBJ_CLOSE, pPayload); 969 uint32_t uCID; 970 rc = HGCMSvcGetU32(&paParms[0], &uCID); 971 if (RT_SUCCESS(rc)) 972 { 973 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID); 974 rc = SharedClipboardURITransferEventSignal(pTransfer, uEvent, pPayload); 975 } 957 976 break; 958 977 } … … 1007 1026 1008 1027 LogFlowFunc(("uClient=%RU32, u32Function=%RU32 (%s), cParms=%RU32, g_pfnExtension=%p\n", 1009 pClient->uClientID, u32Function, VBox SvcClipboardGuestMsgToStr(u32Function), cParms, g_pfnExtension));1028 pClient->uClientID, u32Function, VBoxClipboardGuestMsgToStr(u32Function), cParms, g_pfnExtension)); 1010 1029 1011 1030 const PVBOXCLIPBOARDCLIENTDATA pClientData = pClient->pData; … … 1193 1212 case VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY: 1194 1213 { 1195 rc = VBoxSvcClipboardURITransferHandleReply(pClient, pTransfer, cParms, paParms); 1196 break; 1197 } 1198 1199 case VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOTS: 1200 { 1201 VBOXCLIPBOARDROOTS Roots; 1202 rc = VBoxSvcClipboardURIGetRoots(cParms, paParms, &Roots); 1203 if (RT_SUCCESS(rc)) 1204 { 1205 void *pvData = SharedClipboardURIRootsDup(&Roots); 1206 uint32_t cbData = sizeof(VBOXCLIPBOARDROOTS); 1214 rc = vboxSvcClipboardURITransferHandleReply(pClient, pTransfer, cParms, paParms); 1215 break; 1216 } 1217 1218 case VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_READ: 1219 { 1220 break; 1221 } 1222 1223 case VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_WRITE: 1224 { 1225 VBOXCLIPBOARDROOTLISTHDR lstHdr; 1226 rc = vboxSvcClipboardURIGetRootListHdr(cParms, paParms, &lstHdr); 1227 if (RT_SUCCESS(rc)) 1228 { 1229 void *pvData = SharedClipboardURIRootListHdrDup(&lstHdr); 1230 uint32_t cbData = sizeof(VBOXCLIPBOARDROOTLISTHDR); 1231 1232 uint32_t uCID; 1233 rc = HGCMSvcGetU32(&paParms[0], &uCID); 1234 if (RT_SUCCESS(rc)) 1235 { 1236 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID); 1237 1238 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 1239 rc = SharedClipboardURITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload); 1240 if (RT_SUCCESS(rc)) 1241 rc = SharedClipboardURITransferEventSignal(pTransfer, uEvent, pPayload); 1242 } 1243 } 1244 break; 1245 } 1246 1247 case VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_READ: 1248 { 1249 #if 0 1250 VBOXCLIPBOARDROOTLISTENTRY lstEntry; 1251 rc = VBoxSvcClipboardURIGetRootListEntry(cParms, paParms, &lstEntry); 1252 if (RT_SUCCESS(rc)) 1253 { 1254 void *pvData = SharedClipboardURIRootListEntryDup(&lstEntry); 1255 uint32_t cbData = sizeof(VBOXCLIPBOARDROOTLISTENTRY); 1207 1256 1208 1257 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 1209 rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_ GET_ROOTS,1258 rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_ROOT_LIST_HDR_READ, 1210 1259 pvData, cbData, &pPayload); 1211 1260 if (RT_SUCCESS(rc)) 1212 rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_ GET_ROOTS,1261 rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_ROOT_LIST_HDR_READ, 1213 1262 pPayload); 1214 1263 } 1215 1264 break; 1265 #endif 1266 } 1267 1268 case VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_WRITE: 1269 { 1270 VBOXCLIPBOARDROOTLISTENTRY lstEntry; 1271 rc = vboxSvcClipboardURIGetRootListEntry(cParms, paParms, &lstEntry); 1272 if (RT_SUCCESS(rc)) 1273 { 1274 void *pvData = SharedClipboardURIRootListEntryDup(&lstEntry); 1275 uint32_t cbData = sizeof(VBOXCLIPBOARDROOTLISTENTRY); 1276 1277 uint32_t uCID; 1278 rc = HGCMSvcGetU32(&paParms[0], &uCID); 1279 if (RT_SUCCESS(rc)) 1280 { 1281 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID); 1282 1283 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 1284 rc = SharedClipboardURITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload); 1285 if (RT_SUCCESS(rc)) 1286 rc = SharedClipboardURITransferEventSignal(pTransfer, uEvent, pPayload); 1287 } 1288 } 1289 break; 1216 1290 } 1217 1291 … … 1219 1293 { 1220 1294 VBOXCLIPBOARDLISTOPENPARMS listOpenParms; 1221 rc = VBoxSvcClipboardURIGetListOpen(cParms, paParms, &listOpenParms);1295 rc = vboxSvcClipboardURIGetListOpen(cParms, paParms, &listOpenParms); 1222 1296 if (RT_SUCCESS(rc)) 1223 1297 { … … 1239 1313 1240 1314 SHAREDCLIPBOARDLISTHANDLE hList; 1241 /* Note: Context ID (paParms[0]) not used yet. */1242 1315 rc = HGCMSvcGetU64(&paParms[1], &hList); 1243 1316 if (RT_SUCCESS(rc)) … … 1254 1327 1255 1328 SHAREDCLIPBOARDLISTHANDLE hList; 1256 /* Note: Context ID (paParms[0]) not used yet. */1257 1329 rc = HGCMSvcGetU64(&paParms[1], &hList); /* Get list handle. */ 1258 1330 if (RT_SUCCESS(rc)) … … 1261 1333 rc = SharedClipboardURITransferListGetHeader(pTransfer, hList, &hdrList); 1262 1334 if (RT_SUCCESS(rc)) 1263 rc = VBoxSvcClipboardURISetListHdr(cParms, paParms, &hdrList);1335 rc = vboxSvcClipboardURISetListHdr(cParms, paParms, &hdrList); 1264 1336 } 1265 1337 break; … … 1273 1345 { 1274 1346 SHAREDCLIPBOARDLISTHANDLE hList; 1275 rc = VBoxSvcClipboardURIGetListHdr(cParms, paParms, &hList, &hdrList);1347 rc = vboxSvcClipboardURIGetListHdr(cParms, paParms, &hList, &hdrList); 1276 1348 if (RT_SUCCESS(rc)) 1277 1349 { … … 1279 1351 uint32_t cbData = sizeof(VBOXCLIPBOARDLISTHDR); 1280 1352 1281 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 1282 rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE, 1283 pvData, cbData, &pPayload); 1353 uint32_t uCID; 1354 rc = HGCMSvcGetU32(&paParms[0], &uCID); 1284 1355 if (RT_SUCCESS(rc)) 1285 1356 { 1286 rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE, 1287 pPayload); 1357 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID); 1358 1359 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 1360 rc = SharedClipboardURITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload); 1361 if (RT_SUCCESS(rc)) 1362 rc = SharedClipboardURITransferEventSignal(pTransfer, uEvent, pPayload); 1288 1363 } 1289 1364 } … … 1298 1373 1299 1374 SHAREDCLIPBOARDLISTHANDLE hList; 1300 /* Note: Context ID (paParms[0]) not used yet. */1301 1375 rc = HGCMSvcGetU64(&paParms[1], &hList); /* Get list handle. */ 1302 1376 if (RT_SUCCESS(rc)) … … 1315 1389 { 1316 1390 SHAREDCLIPBOARDLISTHANDLE hList; 1317 rc = VBoxSvcClipboardURIGetListEntry(cParms, paParms, &hList, &entryList);1391 rc = vboxSvcClipboardURIGetListEntry(cParms, paParms, &hList, &entryList); 1318 1392 if (RT_SUCCESS(rc)) 1319 1393 { … … 1321 1395 uint32_t cbData = sizeof(VBOXCLIPBOARDLISTENTRY); 1322 1396 1323 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 1324 rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE, 1325 pvData, cbData, &pPayload); 1397 uint32_t uCID; 1398 rc = HGCMSvcGetU32(&paParms[0], &uCID); 1326 1399 if (RT_SUCCESS(rc)) 1327 1400 { 1328 rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE, 1329 pPayload); 1401 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID); 1402 1403 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 1404 rc = SharedClipboardURITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload); 1405 if (RT_SUCCESS(rc)) 1406 rc = SharedClipboardURITransferEventSignal(pTransfer, uEvent, pPayload); 1330 1407 } 1331 1332 1408 } 1333 1409 } … … 1514 1590 { 1515 1591 int rcGuest; 1516 rc = VBoxSvcClipboardURIGetError(cParms,paParms, &rcGuest);1592 rc = vboxSvcClipboardURIGetError(cParms,paParms, &rcGuest); 1517 1593 if (RT_SUCCESS(rc)) 1518 1594 LogRel(("Shared Clipboard: Transfer error: %Rrc\n", rcGuest)); … … 1581 1657 int vboxSvcClipboardURIAreaRegister(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer) 1582 1658 { 1659 RT_NOREF(pClientState); 1660 1583 1661 LogFlowFuncEnter(); 1584 1662 … … 1628 1706 int vboxSvcClipboardURIAreaUnregister(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer) 1629 1707 { 1708 RT_NOREF(pClientState); 1709 1630 1710 LogFlowFuncEnter(); 1631 1711 … … 1675 1755 SHAREDCLIPBOARDAREAID uID) 1676 1756 { 1757 RT_NOREF(pClientState); 1758 1677 1759 LogFlowFuncEnter(); 1678 1760 … … 1720 1802 int vboxSvcClipboardURIAreaDetach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer) 1721 1803 { 1804 RT_NOREF(pClientState); 1805 1722 1806 LogFlowFuncEnter(); 1723 1807 -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-utils.cpp
r79630 r80283 143 143 } 144 144 145 #if 1 146 int rc = 0; 147 #else 148 /* Sanity. */ 149 Assert(pTransfer->State.enmDir == SHAREDCLIPBOARDURITRANSFERDIR_READ); 150 151 int rc; 152 153 /* Note: Message priority / order is taken into account here. */ 154 if (pTransfer->State.pHeader) 155 { 156 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_HDR\n")); 157 rc = VBoxSvcClipboardURIWriteListHdr(cParms, paParms, pTransfer->State.pHeader); 158 if (RT_SUCCESS(rc)) 159 { 160 /* We're done witht the data header, destroy it. */ 161 SharedClipboardURIListHdrFree(pTransfer->State.pHeader); 162 pTransfer->State.pHeader = NULL; 163 164 fHandled = true; 165 } 166 } 167 else if (pTransfer->State.pMeta) 168 { 169 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_CHUNK\n")); 170 171 uint32_t cbBuf = _64K; 172 uint8_t pvBuf[_64K]; /** @todo Improve */ 173 174 uint32_t cbRead; 175 rc = SharedClipboardMetaDataRead(pTransfer->State.pMeta, pvBuf, cbBuf, &cbRead); 176 if (RT_SUCCESS(rc)) 177 { 178 Assert(cbRead <= cbBuf); 179 180 VBOXCLIPBOARDListEntry ListEntry; 181 RT_ZERO(ListEntry); 182 ListEntry.pvData = pvBuf; 183 ListEntry.cbData = cbRead; 184 185 rc = VBoxSvcClipboardURIWriteListEntry(cParms, paParms, &ListEntry); 186 } 187 188 /* Has all meta data been read? */ 189 if (RT_SUCCESS(rc)) 190 { 191 if (SharedClipboardMetaDataGetUsed(pTransfer->State.pMeta) == 0) 192 { 193 SharedClipboardMetaDataFree(pTransfer->State.pMeta); 194 pTransfer->State.pMeta = NULL; 195 } 196 197 fHandled = true; 198 } 199 } 200 else if (pTransfer->pURIList) 201 { 202 PSHAREDCLIPBOARDCLIENTURIOBJCTX pObjCtx = SharedClipboardURITransferGetCurrentObjCtx(pTransfer); 203 if (!SharedClipboardURIObjCtxIsValid(pObjCtx)) 204 { 205 if (!pTransfer->pURIList->IsEmpty()) 206 pObjCtx->pObj = pTransfer->pURIList->First(); 207 } 208 209 if ( pObjCtx 210 && pObjCtx->pObj) 211 { 212 switch (pObjCtx->pObj->GetType()) 213 { 214 case SharedClipboardURIObject::Type_Directory: 215 { 216 rc = VBoxSvcClipboardURIWriteDir(cParms, paParms, &ListEntry); 217 break; 218 } 219 } 220 } 221 222 if (0) 223 { 224 delete pTransfer->pURIList; 225 pTransfer->pURIList = NULL; 226 } 227 228 fHandled = true; 229 } 230 else 231 rc = VERR_WRONG_ORDER; 232 #endif 233 234 LogFlowFunc(("rc=%Rrc, fHandled=%RTbool\n", rc, fHandled)); 145 LogFlowFunc(("fHandled=%RTbool\n", fHandled)); 235 146 return fHandled; 236 147 } -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp
r79705 r80283 177 177 178 178 #include <VBox/AssertGuest.h> 179 #include <VBox/GuestHost/clipboard-helper.h> 179 180 #include <VBox/HostServices/Service.h> 180 181 #include <VBox/HostServices/VBoxClipboardSvc.h> … … 471 472 vboxSvcClipboardMsgSetPeekReturn(pFirstMsg, paParms, cParms); 472 473 LogFlowFunc(("[Client %RU32] VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_XXX -> VINF_SUCCESS (idMsg=%u (%s), cParms=%u)\n", 473 pClient->uClientID, pFirstMsg->m_uMsg, VBox SvcClipboardHostMsgToStr(pFirstMsg->m_uMsg),474 pClient->uClientID, pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg), 474 475 pFirstMsg->m_cParms)); 475 476 return VINF_SUCCESS; … … 535 536 { 536 537 LogFlowFunc(("First message is: %RU32 %s (%RU32 parms)\n", 537 pFirstMsg->m_uMsg, VBox SvcClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms));538 pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms)); 538 539 539 540 ASSERT_GUEST_MSG_RETURN(pFirstMsg->m_uMsg == idMsgExpected || idMsgExpected == UINT32_MAX, 540 541 ("idMsg=%u (%s) cParms=%u, caller expected %u (%s) and %u\n", 541 pFirstMsg->m_uMsg, VBox SvcClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms,542 idMsgExpected, VBox SvcClipboardHostMsgToStr(idMsgExpected), cParms),542 pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms, 543 idMsgExpected, VBoxClipboardHostMsgToStr(idMsgExpected), cParms), 543 544 VERR_MISMATCH); 544 545 ASSERT_GUEST_MSG_RETURN(pFirstMsg->m_cParms == cParms, 545 546 ("idMsg=%u (%s) cParms=%u, caller expected %u (%s) and %u\n", 546 pFirstMsg->m_uMsg, VBox SvcClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms,547 idMsgExpected, VBox SvcClipboardHostMsgToStr(idMsgExpected), cParms),547 pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms, 548 idMsgExpected, VBoxClipboardHostMsgToStr(idMsgExpected), cParms), 548 549 VERR_WRONG_PARAMETER_COUNT); 549 550 … … 552 553 ASSERT_GUEST_MSG_RETURN(pFirstMsg->m_paParms[i].type == paParms[i].type, 553 554 ("param #%u: type %u, caller expected %u (idMsg=%u %s)\n", i, pFirstMsg->m_paParms[i].type, 554 paParms[i].type, pFirstMsg->m_uMsg, VBox SvcClipboardHostMsgToStr(pFirstMsg->m_uMsg)),555 paParms[i].type, pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg)), 555 556 VERR_WRONG_PARAMETER_TYPE); 556 557 /*
Note:
See TracChangeset
for help on using the changeset viewer.