Changeset 80444 in vbox
- Timestamp:
- Aug 27, 2019 5:47:44 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 132934
- Location:
- trunk
- Files:
-
- 29 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/GuestHost/SharedClipboard-uri.h
r80359 r80444 434 434 /** Total size (in bytes) returned. */ 435 435 uint64_t cbTotalSize; 436 /** Compression being method used. Not implemented yet. */437 uint32_t enmCompression;438 /** Checksum type being used. Not implemented yet. */439 uint32_t enmChecksumType;440 436 } VBOXCLIPBOARDLISTHDR, *PVBOXCLIPBOARDLISTHDR; 441 437 … … 700 696 701 697 /** 702 * Structure for an (optional) URI transfer event payload.703 */704 typedef struct _SHAREDCLIPBOARDURITRANSFERPAYLOAD705 {706 /** Payload ID; currently unused. */707 uint32_t uID;708 /** Pointer to actual payload data. */709 void *pvData;710 /** Size (in bytes) of actual payload data. */711 uint32_t cbData;712 } SHAREDCLIPBOARDURITRANSFERPAYLOAD, *PSHAREDCLIPBOARDURITRANSFERPAYLOAD;713 714 /**715 * Structure for maintaining an URI transfer event.716 */717 typedef struct _SHAREDCLIPBOARDURITRANSFEREVENT718 {719 /** Event semaphore for signalling the event. */720 RTSEMEVENT hEventSem;721 /** Payload to this event. Optional and can be NULL. */722 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;723 } SHAREDCLIPBOARDURITRANSFEREVENT, *PSHAREDCLIPBOARDURITRANSFEREVENT;724 725 /** Map of URI transfer events.726 * The key specifies the event type of SHAREDCLIPBOARDURITRANSFEREVENTTYPE. */727 typedef std::map<uint16_t, SHAREDCLIPBOARDURITRANSFEREVENT *> SharedClipboardURITransferEventMap;728 729 /**730 698 * Enumeration for specifying a Shared Clipboard object type. 731 699 */ … … 750 718 typedef struct _SHAREDCLIPBOARDURILISTHANDLEINFO 751 719 { 720 /** The list node. */ 721 RTLISTNODE Node; 722 /** The list's handle. */ 723 SHAREDCLIPBOARDLISTHANDLE hList; 752 724 /** Type of list handle. */ 753 SHAREDCLIPBOARDURIOBJTYPE enmType;725 SHAREDCLIPBOARDURIOBJTYPE enmType; 754 726 /** Absolute local path of the list object. */ 755 char *pszPathLocalAbs;727 char *pszPathLocalAbs; 756 728 union 757 729 { … … 768 740 } SHAREDCLIPBOARDURILISTHANDLEINFO, *PSHAREDCLIPBOARDURILISTHANDLEINFO; 769 741 770 /** Map of URI list handles.771 * The key specifies the list handle. */772 typedef std::map<SHAREDCLIPBOARDLISTHANDLE, SHAREDCLIPBOARDURILISTHANDLEINFO *> SharedClipboardURIListMap;773 774 742 /** 775 743 * Structure for keeping URI object handle information. … … 778 746 typedef struct _SHAREDCLIPBOARDURIOBJHANDLEINFO 779 747 { 748 /** The list node. */ 749 RTLISTNODE Node; 750 /** The object's handle. */ 751 SHAREDCLIPBOARDOBJHANDLE hObj; 780 752 /** Type of object handle. */ 781 753 SHAREDCLIPBOARDURIOBJTYPE enmType; … … 796 768 } SHAREDCLIPBOARDURIOBJHANDLEINFO, *PSHAREDCLIPBOARDURIOBJHANDLEINFO; 797 769 798 /** Map of URI object handles.799 * The key specifies the object handle. */800 typedef std::map<SHAREDCLIPBOARDOBJHANDLE, SHAREDCLIPBOARDURIOBJHANDLEINFO *> SharedClipboardURIObjMap;801 802 770 /** 803 771 * Structure for keeping a single root list entry. 804 *805 * Warning: Contains non-POD types.806 772 */ 807 773 typedef struct _SHAREDCLIPBOARDURILISTROOT 808 774 { 775 /** The list node. */ 776 RTLISTNODE Node; 809 777 /** Absolute path of entry. */ 810 RTCString strPathAbs;778 char *pszPathAbs; 811 779 } SHAREDCLIPBOARDURILISTROOT, *PSHAREDCLIPBOARDURILISTROOT; 812 813 /** List of URI list root entries. */814 typedef RTCList<SHAREDCLIPBOARDURILISTROOT> SharedClipboardURIListRootEntries;815 780 816 781 /** … … 866 831 SHAREDCLIPBOARDPROVIDERFUNCDECLVOID(TRANSFEROPEN) 867 832 SHAREDCLIPBOARDPROVIDERFUNCDECLVOID(TRANSFERCLOSE) 868 SHAREDCLIPBOARDPROVIDERFUNCDECL(GETROOTS, PVBOXCLIPBOARDROOTLIST *ppRootList) ;833 SHAREDCLIPBOARDPROVIDERFUNCDECL(GETROOTS, PVBOXCLIPBOARDROOTLIST *ppRootList) 869 834 SHAREDCLIPBOARDPROVIDERFUNCDECL(LISTOPEN, PVBOXCLIPBOARDLISTOPENPARMS pOpenParms, PSHAREDCLIPBOARDLISTHANDLE phList) 870 SHAREDCLIPBOARDPROVIDERFUNCDECL(LISTCLOSE, SHAREDCLIPBOARDLISTHANDLE hList) ;835 SHAREDCLIPBOARDPROVIDERFUNCDECL(LISTCLOSE, SHAREDCLIPBOARDLISTHANDLE hList) 871 836 SHAREDCLIPBOARDPROVIDERFUNCDECL(LISTHDRREAD, SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr) 872 837 SHAREDCLIPBOARDPROVIDERFUNCDECL(LISTHDRWRITE, SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr) … … 883 848 typedef struct _SHAREDCLIPBOARDPROVIDERINTERFACE 884 849 { 885 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(TRANSFEROPEN, pfnTransferOpen) ;886 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(TRANSFERCLOSE, pfnTransferClose) ;887 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(GETROOTS, pfnGetRoots) ;888 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTOPEN, pfnListOpen) ;889 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTCLOSE, pfnListClose) ;890 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTHDRREAD, pfnListHdrRead) ;891 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTHDRWRITE, pfnListHdrWrite) ;892 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTENTRYREAD, pfnListEntryRead) ;893 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTENTRYWRITE, pfnListEntryWrite) ;894 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(OBJOPEN, pfnObjOpen) ;895 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(OBJCLOSE, pfnObjClose) ;896 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(OBJREAD, pfnObjRead) ;897 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(OBJWRITE, pfnObjWrite) ;850 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(TRANSFEROPEN, pfnTransferOpen) 851 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(TRANSFERCLOSE, pfnTransferClose) 852 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(GETROOTS, pfnGetRoots) 853 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTOPEN, pfnListOpen) 854 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTCLOSE, pfnListClose) 855 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTHDRREAD, pfnListHdrRead) 856 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTHDRWRITE, pfnListHdrWrite) 857 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTENTRYREAD, pfnListEntryRead) 858 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(LISTENTRYWRITE, pfnListEntryWrite) 859 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(OBJOPEN, pfnObjOpen) 860 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(OBJCLOSE, pfnObjClose) 861 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(OBJREAD, pfnObjRead) 862 SHAREDCLIPBOARDPROVIDERFUNCMEMBER(OBJWRITE, pfnObjWrite) 898 863 } SHAREDCLIPBOARDPROVIDERINTERFACE, *PSHAREDCLIPBOARDPROVIDERINTERFACE; 899 864 … … 953 918 void *pvUser; 954 919 /** Function pointer, called when the transfer is going to be prepared. */ 955 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(TRANSFERPREPARE, pfnTransferPrepare) ;920 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(TRANSFERPREPARE, pfnTransferPrepare) 956 921 /** Function pointer, called when the transfer has been started. */ 957 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(TRANSFERSTARTED, pfnTransferStarted) ;922 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(TRANSFERSTARTED, pfnTransferStarted) 958 923 /** Function pointer, called when reading / writing the list header is complete. */ 959 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(LISTHEADERCOMPLETE, pfnListHeaderComplete) ;924 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(LISTHEADERCOMPLETE, pfnListHeaderComplete) 960 925 /** Function pointer, called when reading / writing a list entry is complete. */ 961 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(LISTENTRYCOMPLETE, pfnListEntryComplete) ;926 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(LISTENTRYCOMPLETE, pfnListEntryComplete) 962 927 /** Function pointer, called when the transfer is complete. */ 963 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(TRANSFERCOMPLETE, pfnTransferComplete) ;928 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(TRANSFERCOMPLETE, pfnTransferComplete) 964 929 /** Function pointer, called when the transfer has been canceled. */ 965 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(TRANSFERCANCELED, pfnTransferCanceled) ;930 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(TRANSFERCANCELED, pfnTransferCanceled) 966 931 /** Function pointer, called when transfer resulted in an unrecoverable error. */ 967 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(TRANSFERERROR, pfnTransferError) ;932 SHAREDCLIPBOARDTRANSFERCALLBACKMEMBER(TRANSFERERROR, pfnTransferError) 968 933 } SHAREDCLIPBOARDURITRANSFERCALLBACKS, *PSHAREDCLIPBOARDURITRANSFERCALLBACKS; 969 934 … … 1003 968 /** Maximum data chunk size (in bytes) to transfer. Default is 64K. */ 1004 969 uint32_t cbMaxChunkSize; 1005 /** Events related to this transfer. */1006 S haredClipboardURITransferEventMap *pMapEvents;970 /** The transfer's own event source. */ 971 SHAREDCLIPBOARDEVENTSOURCE Events; 1007 972 /** Next upcoming list handle. */ 1008 973 SHAREDCLIPBOARDLISTHANDLE uListHandleNext; 1009 /** Map of all lists related to this transfer. */ 1010 SharedClipboardURIListMap *pMapLists; 974 /** List of all list handles elated to this transfer. */ 975 RTLISTANCHOR lstList; 976 /** Number of root entries in list. */ 977 uint64_t cRoots; 1011 978 /** List of root entries of this transfer. */ 1012 SharedClipboardURIListRootEntries lstRootEntries;979 RTLISTANCHOR lstRoots; 1013 980 /** Next upcoming object handle. */ 1014 981 SHAREDCLIPBOARDOBJHANDLE uObjHandleNext; 1015 /** Next upcoming event ID. 1016 * 0 is reserved for invalid event IDs. */ 1017 uint16_t uEventIDNext; 1018 /** Map of all objects related to this transfer. */ 1019 SharedClipboardURIObjMap *pMapObj; 982 /** Map of all objects handles related to this transfer. */ 983 RTLISTANCHOR lstObj; 1020 984 /** The transfer's own (local) area, if any (can be NULL if not needed). 1021 985 * The area itself has a clipboard area ID assigned. … … 1093 1057 1094 1058 int SharedClipboardURITransferPrepare(PSHAREDCLIPBOARDURITRANSFER pTransfer); 1095 int SharedClipboardURITransferSetData(PSHAREDCLIPBOARDURITRANSFER pTransfer, SharedClipboardURIListRootEntries *pEntries);1096 1059 int SharedClipboardURITransferSetInterface(PSHAREDCLIPBOARDURITRANSFER pTransfer, 1097 1060 PSHAREDCLIPBOARDPROVIDERCREATIONCTX pCreationCtx); … … 1101 1064 1102 1065 uint32_t SharedClipboardURILTransferRootsCount(PSHAREDCLIPBOARDURITRANSFER pTransfer); 1103 int SharedClipboardURILTransferRootsEntry(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint 32_t uIndex, PVBOXCLIPBOARDLISTENTRY pEntry);1066 int SharedClipboardURILTransferRootsEntry(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint64_t uIndex, PVBOXCLIPBOARDROOTLISTENTRY pEntry); 1104 1067 int SharedClipboardURILTransferRootsAsList(PSHAREDCLIPBOARDURITRANSFER pTransfer, PVBOXCLIPBOARDROOTLIST *ppRootList); 1105 1068 … … 1110 1073 void SharedClipboardURITransferSetCallbacks(PSHAREDCLIPBOARDURITRANSFER pTransfer, 1111 1074 PSHAREDCLIPBOARDURITRANSFERCALLBACKS pCallbacks); 1112 1113 int SharedClipboardURITransferPayloadAlloc(uint32_t uID, const void *pvData, uint32_t cbData,1114 PSHAREDCLIPBOARDURITRANSFERPAYLOAD *ppPayload);1115 void SharedClipboardURITransferPayloadFree(PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload);1116 1117 uint16_t SharedClipboardURITransferEventIDGenerate(PSHAREDCLIPBOARDURITRANSFER pTransfer);1118 int SharedClipboardURITransferEventRegister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID);1119 int SharedClipboardURITransferEventUnregister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID);1120 int SharedClipboardURITransferEventWait(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID, RTMSINTERVAL uTimeoutMs,1121 PSHAREDCLIPBOARDURITRANSFERPAYLOAD *ppPayload);1122 int SharedClipboardURITransferEventSignal(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID, PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload);1123 1075 1124 1076 int SharedClipboardURITransferRead(PSHAREDCLIPBOARDURITRANSFER pTransfer); -
trunk/include/VBox/GuestHost/SharedClipboard-win.h
r80374 r80444 130 130 131 131 VBOXCLIPBOARDFORMAT VBoxClipboardWinClipboardFormatToVBox(UINT uFormat); 132 int VBoxClipboardWinGetFormats(PVBOXCLIPBOARDWINCTX pCtx, P VBOXCLIPBOARDFORMAT pfFormats);132 int VBoxClipboardWinGetFormats(PVBOXCLIPBOARDWINCTX pCtx, PSHAREDCLIPBOARDFORMATDATA pFormats); 133 133 134 134 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST -
trunk/include/VBox/GuestHost/SharedClipboard.h
r79630 r80444 31 31 32 32 #include <iprt/cdefs.h> 33 #include <iprt/list.h> 33 34 #include <iprt/types.h> 34 35 … … 60 61 61 62 /** 63 * Structure for keeping a generic Shared Clipboard data block. 64 */ 65 typedef struct _SHAREDCLIPBOARDDATABLOCK 66 { 67 /** Clipboard format this data block represents. */ 68 VBOXCLIPBOARDFORMAT uFormat; 69 /** Pointer to actual data block. */ 70 void *pvData; 71 /** Size (in bytes) of actual data block. */ 72 uint32_t cbData; 73 } SHAREDCLIPBOARDDATABLOCK, *PSHAREDCLIPBOARDDATABLOCK; 74 75 /** 76 * Structure for keeping a Shared Clipboard data read request. 77 */ 78 typedef struct _SHAREDCLIPBOARDDATAREQ 79 { 80 /** In which format the data needs to be sent. */ 81 VBOXCLIPBOARDFORMAT uFmt; 82 /** Read flags; currently unused. */ 83 uint32_t fFlags; 84 /** Maximum data (in byte) can be sent. */ 85 uint32_t cbSize; 86 } SHAREDCLIPBOARDDATAREQ, *PSHAREDCLIPBOARDDATAREQ; 87 88 /** 89 * Structure for keeping Shared Clipboard formats specifications. 90 */ 91 typedef struct _SHAREDCLIPBOARDFORMATDATA 92 { 93 /** Available format(s) as bit map. */ 94 VBOXCLIPBOARDFORMATS uFormats; 95 /** Formats flags. Currently unused. */ 96 uint32_t fFlags; 97 } SHAREDCLIPBOARDFORMATDATA, *PSHAREDCLIPBOARDFORMATDATA; 98 99 /** 100 * Structure for an (optional) Shared Clipboard event payload. 101 */ 102 typedef struct _SHAREDCLIPBOARDEVENTPAYLOAD 103 { 104 /** Payload ID; currently unused. */ 105 uint32_t uID; 106 /** Pointer to actual payload data. */ 107 void *pvData; 108 /** Size (in bytes) of actual payload data. */ 109 uint32_t cbData; 110 } SHAREDCLIPBOARDEVENTPAYLOAD, *PSHAREDCLIPBOARDEVENTPAYLOAD; 111 112 /** 113 * Structure for maintaining a Shared Clipboard event. 114 */ 115 typedef struct _SHAREDCLIPBOARDEVENT 116 { 117 /** List node. */ 118 RTLISTNODE Node; 119 /** The event's ID, for self-reference. */ 120 uint16_t uID; 121 /** Event semaphore for signalling the event. */ 122 RTSEMEVENT hEventSem; 123 /** Payload to this event. Optional and can be NULL. */ 124 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 125 } SHAREDCLIPBOARDEVENT, *PSHAREDCLIPBOARDEVENT; 126 127 /** 128 * Structure for maintaining a Shared Clipboard event source. 129 * 130 * Each event source maintains an own counter for events, so that 131 * it can be used in different contexts. 132 */ 133 typedef struct _SHAREDCLIPBOARDEVENTSOURCE 134 { 135 /** The event source' ID. */ 136 uint16_t uID; 137 /** Next upcoming event ID. 138 * 0 is reserved for invalid event IDs. */ 139 uint16_t uEventIDNext; 140 /** List of events (PSHAREDCLIPBOARDEVENT). */ 141 RTLISTANCHOR lstEvents; 142 } SHAREDCLIPBOARDEVENTSOURCE, *PSHAREDCLIPBOARDEVENTSOURCE; 143 144 int SharedClipboardPayloadAlloc(uint32_t uID, const void *pvData, uint32_t cbData, 145 PSHAREDCLIPBOARDEVENTPAYLOAD *ppPayload); 146 void SharedClipboardPayloadFree(PSHAREDCLIPBOARDEVENTPAYLOAD pPayload); 147 148 int SharedClipboardEventSourceCreate(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID); 149 void SharedClipboardEventSourceDestroy(PSHAREDCLIPBOARDEVENTSOURCE pSource); 150 151 uint16_t SharedClipboardEventIDGenerate(PSHAREDCLIPBOARDEVENTSOURCE pSource); 152 int SharedClipboardEventRegister(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID); 153 int SharedClipboardEventUnregister(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID); 154 int SharedClipboardEventWait(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID, RTMSINTERVAL uTimeoutMs, 155 PSHAREDCLIPBOARDEVENTPAYLOAD* ppPayload); 156 int SharedClipboardEventSignal(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID, PSHAREDCLIPBOARDEVENTPAYLOAD pPayload); 157 void SharedClipboardEventPayloadDetach(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID); 158 159 /** 62 160 * Enumeration to specify the Shared Clipboard URI source type. 63 161 */ -
trunk/include/VBox/HostServices/VBoxClipboardSvc.h
r80359 r80444 69 69 * The host messages for the guest. 70 70 */ 71 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT 1 72 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA 2 73 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS 3 71 /** Asks the client to quit / terminate. */ 72 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT 1 73 /** Reads (simple) data from the guest. */ 74 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA 2 75 /** Reports available clipboard format from host to the guest. 76 * Formerly known as VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS. */ 77 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE 3 78 /** Reports available clipboard format from host to the guest. */ 79 #define VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_READ 4 74 80 75 81 /** Initiates a new transfer (read / write) on the guest side. */ … … 114 120 * Note: This is the old message which still is being used for the non-URI Shared Clipboard transfers, 115 121 * to not break compatibility with older Guest Additions / VBox versions. */ 116 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG_OLD 1 117 /** Sends a list of available formats to the host. */ 118 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_REPORT_FORMATS 2 122 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG_OLD 1 123 /** Sends a list of available formats to the host. 124 * Formely known as VBOX_SHARED_CLIPBOARD_GUEST_FN_REPORT_FORMATS. */ 125 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_FORMATS_WRITE 2 119 126 /** Reads data in specified format from the host. */ 120 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ READ_DATA3127 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_DATA_READ 3 121 128 /** Writes data in requested format to the host. */ 122 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA 4 123 129 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_DATA_WRITE 4 130 131 /** */ 132 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_CONNECT 5 124 133 /** Peeks at the next message, returning immediately. 125 * New since URI handling was implemented. */126 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT 5134 * New since protocol v1. */ 135 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT 6 127 136 /** Peeks at the next message, waiting for one to arrive. 128 * New since URI handling was implemented. */129 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT 6137 * New since protocol v1. */ 138 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT 7 130 139 /** Gets the next message, returning immediately. 131 * New since URI handling was implemented. */132 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET 7140 * New since protocol v1. */ 141 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET 8 133 142 /** Sends a transfer status to the host. 134 * New since URI handling was implemented. */135 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS 8143 * New since protocol v1. */ 144 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS 9 136 145 /** Replies to a function from the host. 137 * New since URI handling was implemented. */138 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY 9146 * New since protocol v1. */ 147 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY 10 139 148 /** Reports the available root entries of a transfer. 140 * New since URI handling was implemented. */141 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_READ 1 0149 * New since protocol v1. */ 150 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_READ 11 142 151 /** 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 1 1152 * New since protocol v1. */ 153 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_WRITE 12 145 154 /** 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 1 2155 * New since protocol v1. */ 156 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_READ 13 148 157 /** 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 1 3158 * New since protocol v1. */ 159 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_WRITE 14 151 160 /** Opens / gets a list handle from the host. 152 * New since URI handling was implemented. */153 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN 1 4161 * New since protocol v1. */ 162 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN 15 154 163 /** Closes a list handle from the host. 155 * New since URI handling was implemented. */156 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE 1 5164 * New since protocol v1. */ 165 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE 16 157 166 /** Reads a list header from the host. 158 * New since URI handling was implemented. */159 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_READ 1 6167 * New since protocol v1. */ 168 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_READ 17 160 169 /** Writes a list header to the host. 161 * New since URI handling was implemented. */162 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE 1 7163 /** New since URI handling was implemented. */164 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_READ 1 8165 /** New since URI handling was implemented. */166 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE 19167 /** New since URI handling was implemented. */168 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_OPEN 2 0169 /** New since URI handling was implemented. */170 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_CLOSE 2 1171 /** New since URI handling was implemented. */172 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_READ 2 2173 /** New since URI handling was implemented. */174 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_WRITE 2 3170 * New since protocol v1. */ 171 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE 18 172 /** New since protocol v1. */ 173 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_READ 19 174 /** New since protocol v1. */ 175 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE 20 176 /** New since protocol v1. */ 177 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_OPEN 21 178 /** New since protocol v1. */ 179 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_CLOSE 22 180 /** New since protocol v1. */ 181 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_READ 23 182 /** New since protocol v1. */ 183 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_WRITE 24 175 184 /** Reports cancellation of the current operation to the host. 176 * New since URI handling was implemented. */177 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL 2 4185 * New since protocol v1. */ 186 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL 25 178 187 /** Reports an error to the host. 179 * New since URI handling was implemented. */180 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR 2 5188 * New since protocol v1. */ 189 #define VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR 26 181 190 182 191 /** The maximum default chunk size for a single data transfer. */ 183 192 #define VBOX_SHARED_CLIPBOARD_MAX_CHUNK_SIZE _64K 184 193 185 /** Maximum number of concurrent Shared Clipboard transfers a VM can have. */ 186 #define VBOX_SHARED_CLIPBOARD_MAX_TRANSFERS UINT16_MAX 194 /** Maximum number of concurrent Shared Clipboard transfers a VM can have. 195 * Number 0 always is reserved for the client itself. */ 196 #define VBOX_SHARED_CLIPBOARD_MAX_TRANSFERS UINT16_MAX - 1 187 197 /** Maximum number of concurrent events a transfer can have. */ 188 198 #define VBOX_SHARED_CLIPBOARD_MAX_EVENTS UINT16_MAX 189 199 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) 200 /** 201 * Creates a context ID out of a source ID. 202 * 203 * ID 0 *always* is reserved for the client itself, whereas 204 * IDs > 0 are being used for transfers of this client. 205 */ 206 #define VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(uID, uEvent) \ 207 RT_MAKE_U32(uEvent, uID) 193 208 /** Gets the transfer ID out of a context ID. */ 194 #define VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_ TRANSFER(uContextID) \209 #define VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_SOURCE(uContextID) \ 195 210 RT_HI_U16(uContextID) 196 211 /** Gets the event ID out of a context ID. */ … … 202 217 */ 203 218 #pragma pack(1) 219 /** 220 * Waits (blocking) for a new host message to arrive. 221 * Deprecated; do not use anymore. 222 * Kept for maintaining compatibility with older Guest Additions. 223 */ 204 224 typedef struct _VBoxClipboardGetHostMsgOld 205 225 { 206 226 VBGLIOCHGCMCALL hdr; 207 227 208 /* VBOX_SHARED_CLIPBOARD_HOST_MSG_**/209 HGCMFunctionParameter msg; /* OUT uint32_t */210 211 /* VBOX_SHARED_CLIPBOARD_FMT_*, depends on the 'msg'. */228 /** uint32_t, out: Host message type. */ 229 HGCMFunctionParameter msg; 230 /** uint32_t, out: VBOX_SHARED_CLIPBOARD_FMT_*, depends on the 'msg'. 231 * r=andy This actual can have *different* meanings, depending on the host message type. */ 212 232 HGCMFunctionParameter formats; /* OUT uint32_t */ 213 233 } VBoxClipboardGetHostMsgOld; … … 215 235 #define VBOX_SHARED_CLIPBOARD_CPARMS_GET_HOST_MSG_OLD 2 216 236 217 typedef struct _VBoxClipboardReportFormatsMsg 218 { 219 VBGLIOCHGCMCALL hdr; 220 221 /* VBOX_SHARED_CLIPBOARD_FMT_* */ 222 HGCMFunctionParameter formats; /* OUT uint32_t */ 223 } VBoxClipboardReportFormatsMsg; 224 225 #define VBOX_SHARED_CLIPBOARD_CPARMS_REPORT_FORMATS 1 237 /** 238 * Message for doing the protocol negotiation between the host 239 * and the guest. Not available on older (VBox <= 6.0) hosts. 240 */ 241 typedef struct _VBoxClipboardConnect 242 { 243 VBGLIOCHGCMCALL hdr; 244 245 /** uint32_t, out: Protocol version. */ 246 HGCMFunctionParameter uProtocolVer; 247 /** uint32_t, out: Protocol flags, unused at the moment. */ 248 HGCMFunctionParameter uProtocolFlags; 249 /** uint32_t, out: Maximum chunk size for data transfers. */ 250 HGCMFunctionParameter cbChunkSize; 251 /** uint32_t, in/out: Compression type. Currently unused. */ 252 HGCMFunctionParameter enmCompression; 253 /** uint32_t, in/out: Checksum type used for data transfer. Currently unused. */ 254 HGCMFunctionParameter enmChecksumType; 255 } VBoxClipboardConnect; 256 257 #define VBOX_SHARED_CLIPBOARD_CPARMS_CONNECT 5 258 259 typedef struct _VBoxClipboardFormatsMsg 260 { 261 VBGLIOCHGCMCALL hdr; 262 263 /** uint32_t, in: Context ID. */ 264 HGCMFunctionParameter uContext; 265 /** uint32_t, out: VBOX_SHARED_CLIPBOARD_FMT_*. */ 266 HGCMFunctionParameter uFormats; 267 /** uint32_t, in: Format flags. */ 268 HGCMFunctionParameter fFlags; 269 } VBoxClipboardFormatsMsg; 270 271 typedef struct _VBoxClipboardReadDataReqMsg 272 { 273 VBGLIOCHGCMCALL hdr; 274 275 /** uint32_t, out: Context ID. */ 276 HGCMFunctionParameter uContext; 277 /** uint32_t, out: Requested format to read data in. */ 278 HGCMFunctionParameter uFormat; 279 /** uint32_t, out: Maximum size (in bytes) to read. */ 280 HGCMFunctionParameter cbSize; 281 } VBoxClipboardReadDataReqMsg; 282 283 #define VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA_REQ 2 226 284 227 285 typedef struct _VBoxClipboardReadDataMsg … … 229 287 VBGLIOCHGCMCALL hdr; 230 288 231 /* Requested format. */289 /** uint32_t, out: Requested format. */ 232 290 HGCMFunctionParameter format; /* IN uint32_t */ 233 234 /* The data buffer. */ 291 /** ptr, out: The data buffer. */ 235 292 HGCMFunctionParameter ptr; /* IN linear pointer. */ 236 237 /* Size of returned data, if > ptr->cb, then no data was 238 * actually transferred and the guest must repeat the call. 293 /** uint32_t, out: Size of returned data, if > ptr->cb, then no data was 294 * actually transferred and the guest must repeat the call. 239 295 */ 240 296 HGCMFunctionParameter size; /* OUT uint32_t */ … … 248 304 VBGLIOCHGCMCALL hdr; 249 305 250 /* Returned format as requested in the VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA message. */ 251 HGCMFunctionParameter format; /* IN uint32_t */ 252 253 /* Data. */ 254 HGCMFunctionParameter ptr; /* IN linear pointer. */ 306 union 307 { 308 struct 309 { 310 /** Returned format as requested in the VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA message. */ 311 HGCMFunctionParameter format; /* IN uint32_t */ 312 /** Data. */ 313 HGCMFunctionParameter ptr; /* IN linear pointer. */ 314 } v0; 315 struct 316 { 317 /** uint32_t, out: Context ID. */ 318 HGCMFunctionParameter uContext; 319 /** uint32_t, out: Requested format to read data in. */ 320 HGCMFunctionParameter uFormat; 321 /** uint32_t, out: Size of data (in bytes). */ 322 HGCMFunctionParameter cbData; 323 /** ptr, out: Actual data. */ 324 HGCMFunctionParameter pvData; 325 } v1; 326 }; 255 327 } VBoxClipboardWriteDataMsg; 256 328 257 #define VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA 2329 #define VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA 4 258 330 259 331 typedef struct _VBoxClipboardTransferReport … … 394 466 /** uint64_t, in/out: Number of total root list entries. */ 395 467 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 468 } VBoxClipboardRootListHdrMsg; 401 469 402 #define VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_HDR 5470 #define VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_HDR 2 403 471 404 472 typedef struct _VBoxClipboardRootListEntryParms … … 521 589 /** uint64_t, in/out: Number of total bytes to transfer. */ 522 590 HGCMFunctionParameter cbTotalSize; 523 /** uint32_t, in/out: Compression type. */524 HGCMFunctionParameter enmCompression;525 /** uint32_t, in/out: Checksum type used for data transfer. */526 HGCMFunctionParameter enmChecksumType;527 591 } VBoxClipboardListHdrMsg; 528 592 529 #define VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR 8593 #define VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR 6 530 594 531 595 typedef struct _VBoxClipboardListEntryReqParms -
trunk/include/VBox/VBoxGuestLib.h
r80374 r80444 595 595 uint32_t uContextID; 596 596 /** IN: Protocol version to use. */ 597 uint32_t uProtocol; 597 uint32_t uProtocolVer; 598 /** IN: Protocol flags. Currently unused. */ 599 uint32_t uProtocolFlags; 598 600 /** IN: Maximum chunk size (in bytes). */ 599 601 uint32_t cbChunkSize; … … 602 604 } VBGLR3SHCLCMDCTX, *PVBGLR3SHCLCMDCTX; 603 605 604 # ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST605 606 /** 606 607 * Enumeration specifying a Shared Clipboard event type. … … 609 610 { 610 611 VBGLR3CLIPBOARDEVENTTYPE_INVALID = 0, 612 VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS, 613 VBGLR3CLIPBOARDEVENTTYPE_READ_DATA, 614 VBGLR3CLIPBOARDEVENTTYPE_QUIT, 611 615 VBGLR3CLIPBOARDEVENTTYPE_URI_LIST_HDR_READ, 612 616 VBGLR3CLIPBOARDEVENTTYPE_URI_LIST_HDR_WRITE, … … 623 627 } VBGLR3CLIPBOARDEVENTTYPE; 624 628 629 /** 630 * Structure for keeping a Shared Clipboard VbglR3 event. 631 */ 625 632 typedef struct _VBGLR3CLIPBOARDEVENT 626 633 { 627 634 /** The event type the union contains. */ 628 635 VBGLR3CLIPBOARDEVENTTYPE enmType; 636 /** Command context bound to this event. */ 637 VBGLR3SHCLCMDCTX cmdCtx; 629 638 union 630 639 { 631 struct632 {633 PVBOXCLIPBOARDLISTHDR pHdr;634 } ListHdrRead, ListHdrWrite;640 /** Reports available formats from the host. */ 641 SHAREDCLIPBOARDFORMATDATA ReportFormats; 642 /** Requests data to be read from the guest. */ 643 SHAREDCLIPBOARDDATAREQ ReadData; 635 644 } u; 636 645 } VBGLR3CLIPBOARDEVENT, *PVBGLR3CLIPBOARDEVENT; 637 646 typedef const PVBGLR3CLIPBOARDEVENT CPVBGLR3CLIPBOARDEVENT; 638 # endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */639 647 640 648 VBGLR3DECL(int) VbglR3ClipboardConnect(HGCMCLIENTID *pidClient); … … 642 650 VBGLR3DECL(int) VbglR3ClipboardGetHostMsgOld(HGCMCLIENTID idClient, uint32_t *pMsg, uint32_t *pfFormats); 643 651 VBGLR3DECL(int) VbglR3ClipboardReadData(HGCMCLIENTID idClient, uint32_t fFormat, void *pv, uint32_t cb, uint32_t *pcb); 652 VBGLR3DECL(int) VbglR3ClipboardWriteData(HGCMCLIENTID idClient, uint32_t fFormat, void *pv, uint32_t cb); 653 VBGLR3DECL(int) VbglR3ClipboardWriteDataEx(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDDATABLOCK pData); 654 VBGLR3DECL(int) VbglR3ClipboardFormatsSend(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDFORMATDATA pFormats); 644 655 VBGLR3DECL(int) VbglR3ClipboardReportFormats(HGCMCLIENTID idClient, uint32_t fFormats); 645 VBGLR3DECL(int) VbglR3ClipboardWriteData(HGCMCLIENTID idClient, uint32_t fFormat, void *pv, uint32_t cb); 646 647 # ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 656 648 657 VBGLR3DECL(int) VbglR3ClipboardConnectEx(PVBGLR3SHCLCMDCTX pCtx); 649 658 VBGLR3DECL(int) VbglR3ClipboardDisconnectEx(PVBGLR3SHCLCMDCTX pCtx); 650 VBGLR3DECL(int) VbglR3ClipboardEventGetNext(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDURITRANSFER pTransfer, 651 PVBGLR3CLIPBOARDEVENT *ppEvent); 659 VBGLR3DECL(int) VbglR3ClipboardEventGetNext(PVBGLR3SHCLCMDCTX pCtx, PVBGLR3CLIPBOARDEVENT *ppEvent); 652 660 VBGLR3DECL(void) VbglR3ClipboardEventFree(PVBGLR3CLIPBOARDEVENT pEvent); 653 661 654 VBGLR3DECL(int) VbglR3ClipboardTransferSendStatus(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDURITRANSFERSTATUS uStatus); 662 VBGLR3DECL(int) VbglR3ClipboardWriteError(HGCMCLIENTID idClient, int rcErr); 663 664 # ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 665 VBGLR3DECL(int) VbglR3ClipboardTransferEvent(PVBGLR3SHCLCMDCTX pCtx, uint32_t uMsg, uint32_t cParms, 666 PSHAREDCLIPBOARDURITRANSFER pTransfer); 667 VBGLR3DECL(int) VbglR3ClipboardTransferSendStatus(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDURITRANSFER pTransfer, 668 SHAREDCLIPBOARDURITRANSFERSTATUS uStatus); 655 669 656 670 VBGLR3DECL(int) VbglR3ClipboardRootListRead(PVBGLR3SHCLCMDCTX pCtx, PVBOXCLIPBOARDROOTLIST *ppRootList); … … 685 699 VBGLR3DECL(int) VbglR3ClipboardObjWrite(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj, void *pvBuf, uint32_t cbBuf, 686 700 uint32_t *pcbWritten); 687 688 VBGLR3DECL(int) VbglR3ClipboardWriteError(HGCMCLIENTID idClient, int rcErr);689 701 # endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 690 702 /** @} */ -
trunk/src/VBox/Additions/WINNT/VBoxTray/Makefile.kmk
r80324 r80444 51 51 VBoxTray_SOURCES += \ 52 52 VBoxClipboard.cpp \ 53 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-win.cpp 53 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-win.cpp \ 54 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-common.cpp 54 55 ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 55 56 VBoxTray_DEFS += VBOX_WITH_SHARED_CLIPBOARD_GUEST … … 60 61 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardPath.cpp \ 61 62 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardStreamImpl-win.cpp \ 62 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-common.cpp \63 63 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-uri.cpp 64 64 endif -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp
r80374 r80444 27 27 28 28 #include <iprt/asm.h> 29 #include <iprt/errcore.h> 30 #include <iprt/mem.h> 29 31 #include <iprt/ldr.h> 30 32 31 #include <iprt/errcore.h>32 33 33 34 #include <VBox/GuestHost/SharedClipboard.h> 35 #include <VBox/GuestHost/SharedClipboard-win.h> 36 #include <VBox/GuestHost/clipboard-helper.h> 34 37 #include <VBox/HostServices/VBoxClipboardSvc.h> /* Temp, remove. */ 35 #include <VBox/GuestHost/SharedClipboard-win.h>36 38 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 37 39 # include <VBox/GuestHost/SharedClipboard-uri.h> … … 118 120 if (RT_SUCCESS(rc)) 119 121 { 120 rc = VbglR3ClipboardTransferSendStatus(&cmdCtx, SHAREDCLIPBOARDURITRANSFERSTATUS_RUNNING);122 rc = VbglR3ClipboardTransferSendStatus(&cmdCtx, pTransfer, SHAREDCLIPBOARDURITRANSFERSTATUS_RUNNING); 121 123 if (RT_SUCCESS(rc)) 122 124 { … … 127 129 { 128 130 PVBGLR3CLIPBOARDEVENT pEvent = NULL; 129 rc = VbglR3ClipboardEventGetNext(&cmdCtx, pTransfer,&pEvent);131 rc = VbglR3ClipboardEventGetNext(&cmdCtx, &pEvent); 130 132 if (RT_SUCCESS(rc)) 131 133 { … … 425 427 /* Clipboard was updated by another application. 426 428 * Report available formats to the host. */ 427 VBOXCLIPBOARDFORMATS fFormats;428 int rc = VBoxClipboardWinGetFormats(&pCtx->Win, & fFormats);429 SHAREDCLIPBOARDFORMATDATA Formats; 430 int rc = VBoxClipboardWinGetFormats(&pCtx->Win, &Formats); 429 431 if (RT_SUCCESS(rc)) 430 432 { 431 LogFunc(("WM_CLIPBOARDUPDATE: Reporting formats 0x%x\n", fFormats));432 rc = VbglR3Clipboard ReportFormats(pCtx->CmdCtx.uClientID, fFormats);433 LogFunc(("WM_CLIPBOARDUPDATE: Reporting formats 0x%x\n", Formats.uFormats)); 434 rc = VbglR3ClipboardFormatsSend(&pCtx->CmdCtx, &Formats); 433 435 } 434 436 } … … 452 454 /* Clipboard was updated by another application. */ 453 455 /* WM_DRAWCLIPBOARD always expects a return code of 0, so don't change "rc" here. */ 454 VBOXCLIPBOARDFORMATS fFormats;455 int rc = VBoxClipboardWinGetFormats(pWinCtx, & fFormats);456 SHAREDCLIPBOARDFORMATDATA Formats; 457 int rc = VBoxClipboardWinGetFormats(pWinCtx, &Formats); 456 458 if (RT_SUCCESS(rc)) 457 rc = VbglR3Clipboard ReportFormats(pCtx->CmdCtx.uClientID, fFormats);459 rc = VbglR3ClipboardFormatsSend(&pCtx->CmdCtx, &Formats); 458 460 } 459 461 … … 641 643 642 644 /* Announce available formats. Do not insert data -- will be inserted in WM_RENDERFORMAT. */ 643 VBOXCLIPBOARDFORMATS fFormats = (uint32_t)lParam; 645 PVBGLR3CLIPBOARDEVENT pEvent = (PVBGLR3CLIPBOARDEVENT)lParam; 646 AssertPtr(pEvent); 647 Assert(pEvent->enmType == VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS); 648 649 const VBOXCLIPBOARDFORMATS fFormats = pEvent->u.ReportFormats.uFormats; 650 644 651 if (fFormats != VBOX_SHARED_CLIPBOARD_FMT_NONE) /* Could arrive with some older GA versions. */ 645 652 { … … 687 694 { 688 695 /* Send data in the specified format to the host. */ 689 VBOXCLIPBOARDFORMAT uFormat = (uint32_t)lParam; 696 PVBGLR3CLIPBOARDEVENT pEvent = (PVBGLR3CLIPBOARDEVENT)lParam; 697 AssertPtr(pEvent); 698 Assert(pEvent->enmType == VBGLR3CLIPBOARDEVENTTYPE_READ_DATA); 699 700 const VBOXCLIPBOARDFORMAT uFormat = (uint32_t)pEvent->u.ReadData.uFmt; 701 690 702 HANDLE hClip = NULL; 691 703 … … 703 715 if (lp != NULL) 704 716 { 705 rc = VbglR3ClipboardWriteData(pCtx->CmdCtx.uClientID, VBOX_SHARED_CLIPBOARD_FMT_BITMAP, 706 lp, GlobalSize(hClip)); 717 SHAREDCLIPBOARDDATABLOCK dataBlock = { uFormat, lp, (uint32_t)GlobalSize(hClip) }; 718 719 rc = VbglR3ClipboardWriteDataEx(&pEvent->cmdCtx, &dataBlock); 720 707 721 GlobalUnlock(hClip); 708 722 } … … 721 735 if (uniString != NULL) 722 736 { 723 rc = VbglR3ClipboardWriteData(pCtx->CmdCtx.uClientID, VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT, 724 uniString, (lstrlenW(uniString) + 1) * 2); 737 SHAREDCLIPBOARDDATABLOCK dataBlock = { uFormat, uniString, ((uint32_t)lstrlenW(uniString) + 1) * 2 }; 738 739 rc = VbglR3ClipboardWriteDataEx(&pEvent->cmdCtx, &dataBlock); 740 725 741 GlobalUnlock(hClip); 726 742 } … … 743 759 if (lp != NULL) 744 760 { 745 rc = VbglR3ClipboardWriteData(pCtx->CmdCtx.uClientID, VBOX_SHARED_CLIPBOARD_FMT_HTML, 746 lp, GlobalSize(hClip)); 761 SHAREDCLIPBOARDDATABLOCK dataBlock = { uFormat, lp, (uint32_t)GlobalSize(hClip) }; 762 763 rc = VbglR3ClipboardWriteDataEx(&pEvent->cmdCtx, &dataBlock); 764 747 765 GlobalUnlock(hClip); 748 766 } … … 754 772 } 755 773 } 774 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 775 else if (uFormat == VBOX_SHARED_CLIPBOARD_FMT_URI_LIST) 776 { 777 LogFunc(("cTransfersRunning=%RU32\n", SharedClipboardURICtxGetRunningTransfers(&pCtx->URI))); 778 779 int rc = VBoxClipboardWinOpen(hwnd); 780 if (RT_SUCCESS(rc)) 781 { 782 PSHAREDCLIPBOARDURITRANSFER pTransfer; 783 rc = SharedClipboardURITransferCreate(SHAREDCLIPBOARDURITRANSFERDIR_WRITE, 784 SHAREDCLIPBOARDSOURCE_LOCAL, 785 &pTransfer); 786 if (RT_SUCCESS(rc)) 787 { 788 rc = SharedClipboardURICtxTransferAdd(&pCtx->URI, pTransfer); 789 if (RT_SUCCESS(rc)) 790 { 791 /* The data data in CF_HDROP format, as the files are locally present and don't need to be 792 * presented as a IDataObject or IStream. */ 793 HANDLE hClip = hClip = GetClipboardData(CF_HDROP); 794 if (hClip) 795 { 796 HDROP hDrop = (HDROP)GlobalLock(hClip); 797 if (hDrop) 798 { 799 char *papszList; 800 uint32_t cbList; 801 rc = VBoxClipboardWinDropFilesToStringList((DROPFILES *)hDrop, &papszList, &cbList); 802 803 GlobalUnlock(hClip); 804 805 if (RT_SUCCESS(rc)) 806 { 807 rc = SharedClipboardURILTransferSetRoots(pTransfer, 808 papszList, cbList + 1 /* Include termination */); 809 if (RT_SUCCESS(rc)) 810 { 811 PVBOXCLIPBOARDURIWRITETHREADCTX pThreadCtx 812 = (PVBOXCLIPBOARDURIWRITETHREADCTX)RTMemAllocZ(sizeof(VBOXCLIPBOARDURIWRITETHREADCTX)); 813 if (pThreadCtx) 814 { 815 pThreadCtx->pClipboardCtx = pCtx; 816 pThreadCtx->pTransfer = pTransfer; 817 818 rc = SharedClipboardURITransferPrepare(pTransfer); 819 if (RT_SUCCESS(rc)) 820 { 821 rc = SharedClipboardURITransferRun(pTransfer, vboxClipboardURIWriteThread, 822 pThreadCtx /* pvUser */); 823 /* pThreadCtx now is owned by vboxClipboardURIWriteThread(). */ 824 } 825 } 826 else 827 rc = VERR_NO_MEMORY; 828 } 829 830 if (papszList) 831 RTStrFree(papszList); 832 } 833 } 834 else 835 { 836 hClip = NULL; 837 } 838 } 839 } 840 } 841 842 VBoxClipboardWinClose(); 843 } 844 845 if (RT_FAILURE(rc)) 846 LogFunc(("Failed with rc=%Rrc\n", rc)); 847 } 848 #endif 756 849 757 850 if (hClip == NULL) … … 771 864 } 772 865 773 #if def VBOX_WITH_SHARED_CLIPBOARD_URI_LIST866 #if 0 774 867 /* The host wants to read URI data. */ 775 868 case VBOX_CLIPBOARD_WM_URI_START_READ: … … 1055 1148 /* ignore rc */ VBoxClipboardWinCheckAndInitNewAPI(&pCtx->Win.newAPI); 1056 1149 1057 rc = VbglR3ClipboardConnect (&pCtx->CmdCtx.uClientID);1150 rc = VbglR3ClipboardConnectEx(&pCtx->CmdCtx); 1058 1151 if (RT_SUCCESS(rc)) 1059 1152 { 1060 pCtx->CmdCtx.uProtocol = 0;1061 1062 1153 rc = vboxClipboardCreateWindow(pCtx); 1063 1154 if (RT_SUCCESS(rc)) … … 1071 1162 else 1072 1163 { 1073 VbglR3ClipboardDisconnect (pCtx->CmdCtx.uClientID);1164 VbglR3ClipboardDisconnectEx(&pCtx->CmdCtx); 1074 1165 } 1075 1166 } … … 1098 1189 int rc; 1099 1190 1191 LogFlowFunc(("Using protocol %RU32\n", pCtx->CmdCtx.uProtocolVer)); 1192 1193 uint32_t uMsg; 1194 uint32_t uFormats; 1195 1100 1196 /* The thread waits for incoming messages from the host. */ 1101 1197 for (;;) 1102 1198 { 1103 LogFlowFunc(("Waiting for host message ...\n")); 1104 1105 uint32_t u32Msg; 1106 uint32_t u32Formats; 1107 rc = VbglR3ClipboardGetHostMsgOld(pCtx->CmdCtx.uClientID, &u32Msg, &u32Formats); 1199 PVBGLR3CLIPBOARDEVENT pEvent = NULL; 1200 1201 LogFlowFunc(("Waiting for host message (protocol v%RU32) ...\n", pCtx->CmdCtx.uProtocolVer)); 1202 1203 if (pCtx->CmdCtx.uProtocolVer == 0) /* Legacy protocol */ 1204 { 1205 rc = VbglR3ClipboardGetHostMsgOld(pCtx->CmdCtx.uClientID, &uMsg, &uFormats); 1206 if (RT_FAILURE(rc)) 1207 { 1208 if (rc == VERR_INTERRUPTED) 1209 break; 1210 1211 LogFunc(("Error getting host message, rc=%Rrc\n", rc)); 1212 } 1213 else 1214 { 1215 PVBGLR3CLIPBOARDEVENT pEvent = (PVBGLR3CLIPBOARDEVENT)RTMemAllocZ(sizeof(VBGLR3CLIPBOARDEVENT)); 1216 if (!pEvent) 1217 { 1218 rc = VERR_NO_MEMORY; 1219 break; 1220 } 1221 1222 switch (uMsg) 1223 { 1224 case VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE: 1225 { 1226 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS; 1227 pEvent->u.ReportFormats.uFormats = uFormats; 1228 break; 1229 } 1230 1231 case VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA: 1232 { 1233 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_READ_DATA; 1234 pEvent->u.ReadData.uFmt = uFormats; 1235 break; 1236 } 1237 1238 default: 1239 rc = VERR_NOT_SUPPORTED; 1240 break; 1241 } 1242 } 1243 } 1244 else /* Protocol >= v1. */ 1245 { 1246 rc = VbglR3ClipboardEventGetNext(&pCtx->CmdCtx, &pEvent); 1247 } 1248 1108 1249 if (RT_FAILURE(rc)) 1109 1250 { 1110 if (rc == VERR_INTERRUPTED)1111 break;1112 1113 LogFunc(("Error getting host message, rc=%Rrc\n", rc));1114 1115 1251 if (*pfShutdown) 1116 1252 break; … … 1122 1258 else 1123 1259 { 1124 LogFlowFunc(("u32Msg=%RU32, u32Formats=0x%x\n", u32Msg, u32Formats)); 1125 switch (u32Msg) 1260 AssertPtr(pEvent); 1261 LogFlowFunc(("Event uType=%RU32\n", pEvent->enmType)); 1262 1263 switch (pEvent->enmType) 1126 1264 { 1127 case VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS: 1128 { 1129 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS\n")); 1130 1265 case VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS: 1266 { 1131 1267 /* The host has announced available clipboard formats. 1132 1268 * Forward the information to the window, so it can later 1133 1269 * respond to WM_RENDERFORMAT message. */ 1134 ::PostMessage(pWinCtx->hWnd, VBOX_CLIPBOARD_WM_REPORT_FORMATS, 0, u32Formats); 1270 ::PostMessage(pWinCtx->hWnd, VBOX_CLIPBOARD_WM_REPORT_FORMATS, 1271 0 /* wParam */, (LPARAM)pEvent /* lParam */); 1135 1272 break; 1136 1273 } 1137 1274 1138 case VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA: 1139 { 1140 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA\n")); 1141 1275 case VBGLR3CLIPBOARDEVENTTYPE_READ_DATA: 1276 { 1142 1277 /* The host needs data in the specified format. */ 1143 ::PostMessage(pWinCtx->hWnd, VBOX_CLIPBOARD_WM_READ_DATA, 0, u32Formats); 1278 ::PostMessage(pWinCtx->hWnd, VBOX_CLIPBOARD_WM_READ_DATA, 1279 0 /* wParam */, (LPARAM)pEvent /* lParam */); 1144 1280 break; 1145 1281 } 1146 1147 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 1282 #if 0 1148 1283 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START: 1149 1284 { 1150 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START\n"));1151 1152 1285 const UINT uMsg = u32Formats == 0 ? 1153 1286 VBOX_CLIPBOARD_WM_URI_START_READ : VBOX_CLIPBOARD_WM_URI_START_WRITE; … … 1157 1290 } 1158 1291 #endif 1159 case VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT: 1160 { 1161 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT\n")); 1162 1292 case VBGLR3CLIPBOARDEVENTTYPE_QUIT: 1293 { 1163 1294 /* The host is terminating. */ 1164 1295 LogRel(("Clipboard: Terminating ...\n")); … … 1169 1300 default: 1170 1301 { 1171 LogFlowFunc(("Unsupported message from host, message=%RU32\n", u32Msg));1172 1173 1302 /* Wait a bit before retrying. */ 1174 1303 RTThreadSleep(1000); … … 1176 1305 } 1177 1306 } 1307 1308 if (RT_FAILURE(rc)) 1309 VbglR3ClipboardEventFree(pEvent); 1178 1310 } 1179 1311 -
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibClipboard.cpp
r80374 r80444 54 54 55 55 /** 56 * Connects to the Shared Clipboard service .56 * Connects to the Shared Clipboard service, legacy version, do not use anymore. 57 57 * 58 58 * @returns VBox status code … … 82 82 if (RT_SUCCESS(rc)) 83 83 { 84 pCtx->uProtocol = 0; /** @todo Makke this dynamic. */ 85 pCtx->cbChunkSize = _64K; /** @todo Makke this dynamic. */ 84 VBoxClipboardConnect Msg; 85 RT_ZERO(Msg); 86 87 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 88 VBOX_SHARED_CLIPBOARD_GUEST_FN_CONNECT, VBOX_SHARED_CLIPBOARD_CPARMS_CONNECT); 89 90 VbglHGCMParmUInt32Set(&Msg.uProtocolVer, 0); 91 VbglHGCMParmUInt32Set(&Msg.uProtocolFlags, 0); 92 VbglHGCMParmUInt32Set(&Msg.cbChunkSize, 0); 93 VbglHGCMParmUInt32Set(&Msg.enmCompression, 0); 94 VbglHGCMParmUInt32Set(&Msg.enmChecksumType, 0); 95 96 rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 97 if (RT_SUCCESS(rc)) 98 { 99 rc = VbglHGCMParmUInt32Get(&Msg.uProtocolVer, &pCtx->uProtocolVer); 100 if (RT_SUCCESS(rc)) 101 rc = VbglHGCMParmUInt32Get(&Msg.uProtocolFlags, &pCtx->uProtocolFlags); 102 if (RT_SUCCESS(rc)) 103 rc = VbglHGCMParmUInt32Get(&Msg.cbChunkSize, &pCtx->cbChunkSize); 104 105 /** @todo Add / handle checksum + compression type. */ 106 } 107 else 108 { 109 /* If the above call fails, make sure to use some sane defaults for 110 * the old (legacy) protocol. */ 111 pCtx->uProtocolVer = 0; 112 pCtx->uProtocolFlags = 0; 113 pCtx->cbChunkSize = _64K; 114 115 rc = VINF_SUCCESS; /* Failing above is not fatal. */ 116 } 117 118 LogFlowFunc(("uProtocolVer=%RU32, cbChunkSize=%RU32\n", pCtx->uProtocolVer, pCtx->cbChunkSize)); 86 119 } 87 120 … … 92 125 93 126 /** 94 * Disconnects from the Shared Clipboard service .127 * Disconnects from the Shared Clipboard service, legacy version, do not use anymore. 95 128 * 96 129 * @returns VBox status code. … … 122 155 123 156 157 VBGLR3DECL(int) VbglR3ClipboardFormatsWriteRecv(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDFORMATDATA pFormats) 158 { 159 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 160 AssertPtrReturn(pFormats, VERR_INVALID_POINTER); 161 162 VBoxClipboardFormatsMsg Msg; 163 RT_ZERO(Msg); 164 165 if (pCtx->uProtocolVer >= 1) 166 { 167 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 168 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, 3); 169 170 Msg.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE); 171 Msg.uFormats.SetUInt32(0); 172 Msg.fFlags.SetUInt32(0); 173 } 174 175 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 176 if (RT_SUCCESS(rc)) 177 { 178 rc = Msg.uContext.GetUInt32(&pCtx->uContextID); 179 if (RT_SUCCESS(rc)) 180 rc = Msg.uFormats.GetUInt32(&pFormats->uFormats); 181 if (RT_SUCCESS(rc)) 182 rc = Msg.fFlags.GetUInt32(&pFormats->fFlags); 183 } 184 185 LogFlowFuncLeaveRC(rc); 186 return rc; 187 } 188 189 190 VBGLR3DECL(int) VbglR3ClipboardReadDataRecv(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDDATAREQ pDataReq) 191 { 192 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 193 AssertPtrReturn(pDataReq, VERR_INVALID_POINTER); 194 195 VBoxClipboardReadDataReqMsg Msg; 196 197 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 198 VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET, VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA); 199 200 Msg.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); 201 Msg.uFormat.SetUInt32(0); 202 Msg.cbSize.SetUInt32(0); 203 204 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 205 if (RT_SUCCESS(rc)) 206 { 207 rc = Msg.uContext.GetUInt32(&pCtx->uContextID); 208 if (RT_SUCCESS(rc)) 209 rc = Msg.uFormat.GetUInt32(&pDataReq->uFmt); 210 if (RT_SUCCESS(rc)) 211 rc = Msg.cbSize.GetUInt32(&pDataReq->cbSize); 212 } 213 214 LogFlowFuncLeaveRC(rc); 215 return rc; 216 } 217 218 124 219 /** 125 * Get a host message, old version.220 * Get a host message, legacy version (protocol v0). Do not use anymore. 126 221 * 127 222 * Note: This is the old message which still is being used for the non-URI Shared Clipboard transfers, … … 179 274 VBoxClipboardReadDataMsg Msg; 180 275 181 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_ READ_DATA, VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA);276 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_DATA_READ, VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA); 182 277 VbglHGCMParmUInt32Set(&Msg.format, fFormat); 183 278 VbglHGCMParmPtrSet(&Msg.ptr, pv, cb); … … 201 296 } 202 297 203 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST204 #if 0205 static int vbglR3ClipboardPeekMsg(HGCMCLIENTID idClient, uint32_t *puMsg, uint32_t *pcParms, bool fWait)206 {207 AssertPtrReturn(puMsg, VERR_INVALID_POINTER);208 AssertPtrReturn(pcParms, VERR_INVALID_POINTER);209 210 VBoxClipboardPeekMsg Msg;211 RT_ZERO(Msg);212 213 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient,214 VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG, VBOX_SHARED_CLIPBOARD_CPARMS_GET_HOST_MSG);215 216 Msg.uMsg.SetUInt32(0);217 Msg.cParms.SetUInt32(0);218 Msg.fBlock.SetUInt32(fWait ? 1 : 0);219 220 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));221 if (RT_SUCCESS(rc))222 {223 rc = Msg.uMsg.GetUInt32(puMsg);224 if (RT_SUCCESS(rc))225 rc = Msg.cParms.GetUInt32(pcParms);226 }227 228 LogFlowFuncLeaveRC(rc);229 return rc;230 }231 #else232 298 /** 233 299 * Peeks at the next host message, waiting for one to turn up. … … 264 330 VbglHGCMParmUInt32Set(&Msg.cParameters, 0); 265 331 rc = VbglR3HGCMCall(&Msg.Hdr, sizeof(Msg)); 266 Log Rel2(("VbglR3GuestCtrlMsgPeekWait-> %Rrc\n", rc));332 LogFlowFunc(("VbglR3HGCMCall -> %Rrc\n", rc)); 267 333 if (RT_SUCCESS(rc)) 268 334 { … … 297 363 return rc; 298 364 } 299 #endif 300 301 VBGLR3DECL(int) VbglR3ClipboardTransferSendStatus(PVBGLR3SHCLCMDCTX pCtx, SHAREDCLIPBOARDURITRANSFERSTATUS uStatus) 302 { 303 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 365 366 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 367 VBGLR3DECL(int) VbglR3ClipboardTransferSendStatus(PVBGLR3SHCLCMDCTX pCtx, 368 PSHAREDCLIPBOARDURITRANSFER pTransfer, SHAREDCLIPBOARDURITRANSFERSTATUS uStatus) 369 { 370 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 371 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 304 372 305 373 VBoxClipboardStatusMsg Msg; … … 309 377 VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS, VBOX_SHARED_CLIPBOARD_CPARMS_STATUS); 310 378 311 Msg.uContext.SetUInt32( pCtx->uContextID);379 Msg.uContext.SetUInt32(VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pTransfer->State.uID, 0 /* Event, ignored */)); 312 380 Msg.uStatus.SetUInt32(uStatus); 313 381 Msg.cbPayload.SetUInt32(0); … … 332 400 333 401 Msg.ReqParms.uContext.SetUInt32(pCtx->uContextID); 334 Msg.ReqParms.fRoots.SetUInt32( pRootListHdr->fRoots);402 Msg.ReqParms.fRoots.SetUInt32(0); 335 403 336 404 Msg.cRoots.SetUInt32(0); 337 Msg.enmCompression.SetUInt32(0); /** @todo Not implemented yet. */338 Msg.enmChecksumType.SetUInt32(0); /** @todo Not implemented yet. */339 405 340 406 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); … … 375 441 if (RT_SUCCESS(rc)) 376 442 { 377 uint32_t cbInfo ;443 uint32_t cbInfo = 0; 378 444 rc = Msg.cbInfo.GetUInt32(&cbInfo); AssertRC(rc); 379 445 if (pRootListEntry->cbInfo != cbInfo) … … 476 542 477 543 Msg.cRoots.SetUInt32(pRootListHdr->cRoots); 478 Msg.enmCompression.SetUInt32(0); /** @todo Not implemented yet. */479 Msg.enmChecksumType.SetUInt32(0); /** @todo Not implemented yet. */480 544 481 545 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); … … 515 579 } 516 580 517 VBGLR3DECL(int) VbglR3ClipboardRootListEntryReadReply(PVBGLR3SHCLCMDCTX pCtx, uint32_t uIndex, PVBOXCLIPBOARD LISTENTRY pEntry)581 VBGLR3DECL(int) VbglR3ClipboardRootListEntryReadReply(PVBGLR3SHCLCMDCTX pCtx, uint32_t uIndex, PVBOXCLIPBOARDROOTLISTENTRY pEntry) 518 582 { 519 583 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); … … 619 683 Msg.rc.SetUInt32((uint32_t)rcReply); /** int vs. uint32_t */ 620 684 Msg.cbPayload.SetUInt32(0); 621 Msg.pvPayload.SetPtr( 0, NULL);685 Msg.pvPayload.SetPtr(NULL, 0); 622 686 623 687 Msg.u.ListOpen.uHandle.SetUInt64(hList); … … 669 733 Msg.rc.SetUInt32((uint32_t)rcReply); /** int vs. uint32_t */ 670 734 Msg.cbPayload.SetUInt32(0); 671 Msg.pvPayload.SetPtr( 0, NULL);735 Msg.pvPayload.SetPtr(NULL, 0); 672 736 673 737 Msg.u.ListOpen.uHandle.SetUInt64(hList); … … 719 783 Msg.cTotalObjects.SetUInt64(0); 720 784 Msg.cbTotalSize.SetUInt64(0); 721 Msg.enmCompression.SetUInt32(0);722 Msg.enmChecksumType.SetUInt32(0);723 785 724 786 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); … … 730 792 if (RT_SUCCESS(rc)) 731 793 rc = Msg.cbTotalSize.GetUInt64(&pListHdr->cbTotalSize); 732 if (RT_SUCCESS(rc))733 rc = Msg.enmCompression.GetUInt32(&pListHdr->enmCompression);734 if (RT_SUCCESS(rc))735 rc = Msg.enmChecksumType.GetUInt32(&pListHdr->enmChecksumType);736 794 } 737 795 … … 790 848 Msg.cTotalObjects.SetUInt64(pListHdr->cTotalObjects); 791 849 Msg.cbTotalSize.SetUInt64(pListHdr->cbTotalSize); 792 Msg.enmCompression.SetUInt32(pListHdr->enmCompression);793 Msg.enmChecksumType.SetUInt32(pListHdr->enmChecksumType);794 850 795 851 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); … … 930 986 Msg.rc.SetUInt32((uint32_t)rcReply); /** int vs. uint32_t */ 931 987 Msg.cbPayload.SetUInt32(0); 932 Msg.pvPayload.SetPtr( 0, NULL);988 Msg.pvPayload.SetPtr(NULL, 0); 933 989 934 990 Msg.u.ObjOpen.uHandle.SetUInt64(hObj); … … 1009 1065 Msg.rc.SetUInt32((uint32_t)rcReply); /** int vs. uint32_t */ 1010 1066 Msg.cbPayload.SetUInt32(0); 1011 Msg.pvPayload.SetPtr( 0, NULL);1067 Msg.pvPayload.SetPtr(NULL, 0); 1012 1068 1013 1069 Msg.u.ObjClose.uHandle.SetUInt64(hObj); … … 1144 1200 } 1145 1201 1146 VBGLR3DECL(int) VbglR3ClipboardEventGetNext(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDURITRANSFER pTransfer, 1147 PVBGLR3CLIPBOARDEVENT *ppEvent) 1202 VBGLR3DECL(int) VbglR3ClipboardTransferEvent(PVBGLR3SHCLCMDCTX pCtx, uint32_t uMsg, uint32_t cParms, 1203 PSHAREDCLIPBOARDURITRANSFER pTransfer) 1204 { 1205 RT_NOREF(cParms); 1206 1207 LogFunc(("Handling uMsg=%RU32 (%s), cParms=%RU32\n", uMsg, VBoxClipboardHostMsgToStr(uMsg), cParms)); 1208 1209 int rc; 1210 1211 switch (uMsg) 1212 { 1213 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_READ: 1214 { 1215 uint32_t fRoots; 1216 rc = VbglR3ClipboardRootListHdrReadReq(pCtx, &fRoots); 1217 1218 /** @todo Validate / handle fRoots. */ 1219 1220 if (RT_SUCCESS(rc)) 1221 { 1222 VBOXCLIPBOARDROOTLISTHDR rootListHdr; 1223 RT_ZERO(rootListHdr); 1224 1225 rootListHdr.cRoots = SharedClipboardURILTransferRootsCount(pTransfer); 1226 1227 LogFlowFunc(("cRoots=%RU32\n", rootListHdr.cRoots)); 1228 1229 rc = VbglR3ClipboardRootListHdrReadReply(pCtx, &rootListHdr); 1230 } 1231 break; 1232 } 1233 1234 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_ENTRY_READ: 1235 { 1236 uint32_t uIndex; 1237 uint32_t fInfo; 1238 rc = VbglR3ClipboardRootListEntryReadReq(pCtx, &uIndex, &fInfo); 1239 if (RT_SUCCESS(rc)) 1240 { 1241 VBOXCLIPBOARDROOTLISTENTRY rootListEntry; 1242 rc = SharedClipboardURILTransferRootsEntry(pTransfer, uIndex, &rootListEntry); 1243 if (RT_SUCCESS(rc)) 1244 rc = VbglR3ClipboardRootListEntryReadReply(pCtx, uIndex, &rootListEntry); 1245 } 1246 break; 1247 } 1248 1249 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN: 1250 { 1251 VBOXCLIPBOARDLISTOPENPARMS openParmsList; 1252 rc = SharedClipboardURIListOpenParmsInit(&openParmsList); 1253 if (RT_SUCCESS(rc)) 1254 { 1255 rc = VbglR3ClipboardListOpenRecv(pCtx, &openParmsList); 1256 if (RT_SUCCESS(rc)) 1257 { 1258 LogFlowFunc(("pszPath=%s\n", openParmsList.pszPath)); 1259 1260 SHAREDCLIPBOARDLISTHANDLE hList = SHAREDCLIPBOARDLISTHANDLE_INVALID; 1261 rc = SharedClipboardURITransferListOpen(pTransfer, &openParmsList, &hList); 1262 1263 /* Reply in any case. */ 1264 int rc2 = VbglR3ClipboardListOpenReply(pCtx, rc, hList); 1265 AssertRC(rc2); 1266 } 1267 1268 SharedClipboardURIListOpenParmsDestroy(&openParmsList); 1269 } 1270 1271 break; 1272 } 1273 1274 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE: 1275 { 1276 SHAREDCLIPBOARDLISTHANDLE hList; 1277 rc = VbglR3ClipboardListCloseRecv(pCtx, &hList); 1278 if (RT_SUCCESS(rc)) 1279 { 1280 rc = SharedClipboardURITransferListClose(pTransfer, hList); 1281 1282 /* Reply in any case. */ 1283 int rc2 = VbglR3ClipboardListCloseReply(pCtx, rc, hList); 1284 AssertRC(rc2); 1285 } 1286 1287 break; 1288 } 1289 1290 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ: 1291 { 1292 /** @todo Handle filter + list features. */ 1293 1294 SHAREDCLIPBOARDLISTHANDLE hList = SHAREDCLIPBOARDLISTHANDLE_INVALID; 1295 uint32_t fFlags = 0; 1296 rc = VbglR3ClipboardListHdrReadRecvReq(pCtx, &hList, &fFlags); 1297 if (RT_SUCCESS(rc)) 1298 { 1299 VBOXCLIPBOARDLISTHDR hdrList; 1300 rc = SharedClipboardURITransferListGetHeader(pTransfer, hList, &hdrList); 1301 if (RT_SUCCESS(rc)) 1302 { 1303 rc = VbglR3ClipboardListHdrWrite(pCtx, hList, &hdrList); 1304 1305 SharedClipboardURIListHdrDestroy(&hdrList); 1306 } 1307 } 1308 1309 break; 1310 } 1311 1312 #if 0 1313 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_WRITE: 1314 { 1315 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_WRITE\n")); 1316 1317 VBOXCLIPBOARDLISTHDR hdrList; 1318 rc = SharedClipboardURIListHdrInit(&hdrList); 1319 if (RT_SUCCESS(rc)) 1320 { 1321 rc = VBglR3ClipboardListHdrRecv(pCtx, ) 1322 } 1323 break; 1324 } 1325 #endif 1326 1327 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ: 1328 { 1329 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ\n")); 1330 1331 VBOXCLIPBOARDLISTENTRY entryList; 1332 rc = SharedClipboardURIListEntryInit(&entryList); 1333 if (RT_SUCCESS(rc)) 1334 { 1335 SHAREDCLIPBOARDLISTHANDLE hList; 1336 uint32_t fInfo; 1337 rc = VbglR3ClipboardListEntryReadRecvReq(pCtx, &hList, &fInfo); 1338 if (RT_SUCCESS(rc)) 1339 { 1340 rc = SharedClipboardURITransferListRead(pTransfer, hList, &entryList); 1341 if (RT_SUCCESS(rc)) 1342 { 1343 PSHAREDCLIPBOARDFSOBJINFO pObjInfo = (PSHAREDCLIPBOARDFSOBJINFO)entryList.pvInfo; 1344 Assert(entryList.cbInfo == sizeof(SHAREDCLIPBOARDFSOBJINFO)); 1345 1346 RT_NOREF(pObjInfo); 1347 1348 LogFlowFunc(("\t%s (%RU64 bytes)\n", entryList.pszName, pObjInfo->cbObject)); 1349 1350 rc = VbglR3ClipboardListEntryWrite(pCtx, hList, &entryList); 1351 } 1352 } 1353 1354 SharedClipboardURIListEntryDestroy(&entryList); 1355 } 1356 1357 break; 1358 } 1359 1360 #if 0 1361 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_WRITE: 1362 { 1363 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_WRITE\n")); 1364 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_LIST_ENTRY_WRITE; 1365 break; 1366 } 1367 #endif 1368 1369 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN: 1370 { 1371 VBOXCLIPBOARDOBJOPENCREATEPARMS openParms; 1372 rc = SharedClipboardURIObjectOpenParmsInit(&openParms); 1373 if (RT_SUCCESS(rc)) 1374 { 1375 rc = VbglR3ClipboardObjOpenRecv(pCtx, &openParms); 1376 if (RT_SUCCESS(rc)) 1377 { 1378 SHAREDCLIPBOARDOBJHANDLE hObj; 1379 rc = SharedClipboardURIObjectOpen(pTransfer, &openParms, &hObj); 1380 1381 /* Reply in any case. */ 1382 int rc2 = VbglR3ClipboardObjOpenReply(pCtx, rc, hObj); 1383 AssertRC(rc2); 1384 } 1385 1386 SharedClipboardURIObjectOpenParmsDestroy(&openParms); 1387 } 1388 1389 break; 1390 } 1391 1392 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_CLOSE: 1393 { 1394 SHAREDCLIPBOARDOBJHANDLE hObj; 1395 rc = VbglR3ClipboardObjCloseRecv(pCtx, &hObj); 1396 if (RT_SUCCESS(rc)) 1397 { 1398 rc = SharedClipboardURIObjectClose(pTransfer, hObj); 1399 1400 /* Reply in any case. */ 1401 int rc2 = VbglR3ClipboardObjCloseReply(pCtx, rc, hObj); 1402 AssertRC(rc2); 1403 } 1404 1405 break; 1406 } 1407 1408 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_READ: 1409 { 1410 SHAREDCLIPBOARDOBJHANDLE hObj; 1411 uint32_t cbBuf; 1412 uint32_t fFlags; 1413 rc = VbglR3ClipboardObjReadRecv(pCtx, &hObj, &cbBuf, &fFlags); 1414 if (RT_SUCCESS(rc)) 1415 { 1416 AssertBreakStmt(pCtx->cbChunkSize, rc = VERR_INVALID_PARAMETER); 1417 1418 const uint32_t cbToRead = RT_MIN(cbBuf, pCtx->cbChunkSize); 1419 1420 LogFlowFunc(("hObj=%RU64, cbBuf=%RU32, fFlags=0x%x -> cbChunkSize=%RU32, cbToRead=%RU32\n", 1421 hObj, cbBuf, fFlags, pCtx->cbChunkSize, cbToRead)); 1422 1423 void *pvBuf = RTMemAlloc(cbToRead); 1424 if (pvBuf) 1425 { 1426 uint32_t cbRead; 1427 rc = SharedClipboardURIObjectRead(pTransfer, hObj, pvBuf, cbToRead, &cbRead, fFlags); 1428 if (RT_SUCCESS(rc)) 1429 rc = VbglR3ClipboardObjWrite(pCtx, hObj, pvBuf, cbRead, NULL /* pcbWritten */); 1430 1431 RTMemFree(pvBuf); 1432 } 1433 else 1434 rc = VERR_NO_MEMORY; 1435 } 1436 1437 break; 1438 } 1439 1440 #if 0 1441 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE: 1442 { 1443 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE\n")); 1444 break; 1445 } 1446 #endif 1447 1448 default: 1449 rc = VERR_NOT_SUPPORTED; 1450 break; 1451 } 1452 1453 LogFlowFuncLeaveRC(rc); 1454 return rc; 1455 } 1456 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 1457 1458 VBGLR3DECL(int) VbglR3ClipboardEventGetNext(PVBGLR3SHCLCMDCTX pCtx, PVBGLR3CLIPBOARDEVENT *ppEvent) 1148 1459 { 1149 1460 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 1150 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER);1151 1461 AssertPtrReturn(ppEvent, VERR_INVALID_POINTER); 1152 1462 … … 1155 1465 return VERR_NO_MEMORY; 1156 1466 1467 pEvent->cmdCtx = *pCtx; /* Use the handed-in context as the base. */ 1468 1157 1469 uint32_t uMsg = 0; 1158 1470 uint32_t cParms = 0; 1159 int rc = vbglR3ClipboardMsgPeekWait( pCtx, &uMsg, &cParms, NULL /* pidRestoreCheck */);1471 int rc = vbglR3ClipboardMsgPeekWait(&pEvent->cmdCtx, &uMsg, &cParms, NULL /* pidRestoreCheck */); 1160 1472 if (RT_SUCCESS(rc)) 1161 1473 { … … 1165 1477 switch (uMsg) 1166 1478 { 1167 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 1168 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_READ: 1479 case VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE: 1169 1480 { 1170 uint32_t fRoots; 1171 rc = VbglR3ClipboardRootListHdrReadReq(pCtx, &fRoots); 1172 1173 /** @todo Validate / handle fRoots. */ 1174 1481 rc = VbglR3ClipboardFormatsWriteRecv(&pEvent->cmdCtx, &pEvent->u.ReportFormats); 1175 1482 if (RT_SUCCESS(rc)) 1176 { 1177 VBOXCLIPBOARDROOTLISTHDR rootListHdr; 1178 RT_ZERO(rootListHdr); 1179 1180 rootListHdr.cRoots = SharedClipboardURILTransferRootsCount(pTransfer); 1181 1182 LogFlowFunc(("cRoots=%RU32\n", rootListHdr.cRoots)); 1183 1184 rc = VbglR3ClipboardRootListHdrReadReply(pCtx, &rootListHdr); 1185 } 1483 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_REPORT_FORMATS; 1186 1484 break; 1187 1485 } 1188 1486 1189 case VBOX_SHARED_CLIPBOARD_HOST_MSG_ URI_ROOT_LIST_ENTRY_READ:1487 case VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA: 1190 1488 { 1191 uint32_t uIndex; 1192 uint32_t fInfo; 1193 rc = VbglR3ClipboardRootListEntryReadReq(pCtx, &uIndex, &fInfo); 1489 rc = VbglR3ClipboardReadDataRecv(&pEvent->cmdCtx, &pEvent->u.ReadData); 1194 1490 if (RT_SUCCESS(rc)) 1195 { 1196 VBOXCLIPBOARDLISTENTRY rootListEntry; 1197 rc = SharedClipboardURILTransferRootsEntry(pTransfer, uIndex, &rootListEntry); 1198 if (RT_SUCCESS(rc)) 1199 rc = VbglR3ClipboardRootListEntryReadReply(pCtx, uIndex, &rootListEntry); 1200 } 1491 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_READ_DATA; 1201 1492 break; 1202 1493 } 1203 1494 1204 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN:1495 default: 1205 1496 { 1206 VBOXCLIPBOARDLISTOPENPARMS openParmsList; 1207 rc = SharedClipboardURIListOpenParmsInit(&openParmsList); 1208 if (RT_SUCCESS(rc)) 1209 { 1210 rc = VbglR3ClipboardListOpenRecv(pCtx, &openParmsList); 1211 if (RT_SUCCESS(rc)) 1212 { 1213 LogFlowFunc(("pszPath=%s\n", openParmsList.pszPath)); 1214 1215 SHAREDCLIPBOARDLISTHANDLE hList = SHAREDCLIPBOARDLISTHANDLE_INVALID; 1216 rc = SharedClipboardURITransferListOpen(pTransfer, &openParmsList, &hList); 1217 1218 /* Reply in any case. */ 1219 int rc2 = VbglR3ClipboardListOpenReply(pCtx, rc, hList); 1220 AssertRC(rc2); 1221 } 1222 1223 SharedClipboardURIListOpenParmsDestroy(&openParmsList); 1224 } 1225 1497 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 1498 rc = VbglR3ClipboardTransferEvent(&pEvent->cmdCtx, uMsg, cParms, NULL /* pTransfer */ ); /**** @todo FIX !!! */ 1499 #endif 1500 rc = VERR_NOT_SUPPORTED; 1226 1501 break; 1227 1502 } 1228 1229 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_CLOSE:1230 {1231 SHAREDCLIPBOARDLISTHANDLE hList;1232 rc = VbglR3ClipboardListCloseRecv(pCtx, &hList);1233 if (RT_SUCCESS(rc))1234 {1235 rc = SharedClipboardURITransferListClose(pTransfer, hList);1236 1237 /* Reply in any case. */1238 int rc2 = VbglR3ClipboardListCloseReply(pCtx, rc, hList);1239 AssertRC(rc2);1240 }1241 1242 break;1243 }1244 1245 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ:1246 {1247 /** @todo Handle filter + list features. */1248 1249 SHAREDCLIPBOARDLISTHANDLE hList = SHAREDCLIPBOARDLISTHANDLE_INVALID;1250 uint32_t fFlags = 0;1251 rc = VbglR3ClipboardListHdrReadRecvReq(pCtx, &hList, &fFlags);1252 if (RT_SUCCESS(rc))1253 {1254 VBOXCLIPBOARDLISTHDR hdrList;1255 rc = SharedClipboardURITransferListGetHeader(pTransfer, hList, &hdrList);1256 if (RT_SUCCESS(rc))1257 {1258 rc = VbglR3ClipboardListHdrWrite(pCtx, hList, &hdrList);1259 1260 SharedClipboardURIListHdrDestroy(&hdrList);1261 }1262 }1263 1264 break;1265 }1266 1267 #if 01268 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_WRITE:1269 {1270 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_WRITE\n"));1271 1272 VBOXCLIPBOARDLISTHDR hdrList;1273 rc = SharedClipboardURIListHdrInit(&hdrList);1274 if (RT_SUCCESS(rc))1275 {1276 rc = VBglR3ClipboardListHdrRecv(pCtx, )1277 }1278 break;1279 }1280 #endif1281 1282 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ:1283 {1284 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ\n"));1285 1286 VBOXCLIPBOARDLISTENTRY entryList;1287 rc = SharedClipboardURIListEntryInit(&entryList);1288 if (RT_SUCCESS(rc))1289 {1290 SHAREDCLIPBOARDLISTHANDLE hList;1291 uint32_t fInfo;1292 rc = VbglR3ClipboardListEntryReadRecvReq(pCtx, &hList, &fInfo);1293 if (RT_SUCCESS(rc))1294 {1295 rc = SharedClipboardURITransferListRead(pTransfer, hList, &entryList);1296 if (RT_SUCCESS(rc))1297 {1298 PSHAREDCLIPBOARDFSOBJINFO pObjInfo = (PSHAREDCLIPBOARDFSOBJINFO)entryList.pvInfo;1299 Assert(entryList.cbInfo == sizeof(SHAREDCLIPBOARDFSOBJINFO));1300 1301 RT_NOREF(pObjInfo);1302 1303 LogFlowFunc(("\t%s (%RU64 bytes)\n", entryList.pszName, pObjInfo->cbObject));1304 1305 rc = VbglR3ClipboardListEntryWrite(pCtx, hList, &entryList);1306 }1307 }1308 1309 SharedClipboardURIListEntryDestroy(&entryList);1310 }1311 1312 break;1313 }1314 1315 #if 01316 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_WRITE:1317 {1318 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_WRITE\n"));1319 pEvent->enmType = VBGLR3CLIPBOARDEVENTTYPE_URI_LIST_ENTRY_WRITE;1320 break;1321 }1322 #endif1323 1324 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_OPEN:1325 {1326 VBOXCLIPBOARDOBJOPENCREATEPARMS openParms;1327 rc = SharedClipboardURIObjectOpenParmsInit(&openParms);1328 if (RT_SUCCESS(rc))1329 {1330 rc = VbglR3ClipboardObjOpenRecv(pCtx, &openParms);1331 if (RT_SUCCESS(rc))1332 {1333 SHAREDCLIPBOARDOBJHANDLE hObj;1334 rc = SharedClipboardURIObjectOpen(pTransfer, &openParms, &hObj);1335 1336 /* Reply in any case. */1337 int rc2 = VbglR3ClipboardObjOpenReply(pCtx, rc, hObj);1338 AssertRC(rc2);1339 }1340 1341 SharedClipboardURIObjectOpenParmsDestroy(&openParms);1342 }1343 1344 break;1345 }1346 1347 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_CLOSE:1348 {1349 SHAREDCLIPBOARDOBJHANDLE hObj;1350 rc = VbglR3ClipboardObjCloseRecv(pCtx, &hObj);1351 if (RT_SUCCESS(rc))1352 {1353 rc = SharedClipboardURIObjectClose(pTransfer, hObj);1354 1355 /* Reply in any case. */1356 int rc2 = VbglR3ClipboardObjCloseReply(pCtx, rc, hObj);1357 AssertRC(rc2);1358 }1359 break;1360 }1361 1362 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_READ:1363 {1364 SHAREDCLIPBOARDOBJHANDLE hObj;1365 uint32_t cbBuf;1366 uint32_t fFlags;1367 rc = VbglR3ClipboardObjReadRecv(pCtx, &hObj, &cbBuf, &fFlags);1368 if (RT_SUCCESS(rc))1369 {1370 AssertBreakStmt(pCtx->cbChunkSize, rc = VERR_INVALID_PARAMETER);1371 1372 const uint32_t cbToRead = RT_MIN(cbBuf, pCtx->cbChunkSize);1373 1374 LogFlowFunc(("hObj=%RU64, cbBuf=%RU32, fFlags=0x%x -> cbChunkSize=%RU32, cbToRead=%RU32\n",1375 hObj, cbBuf, fFlags, pCtx->cbChunkSize, cbToRead));1376 1377 void *pvBuf = RTMemAlloc(cbToRead);1378 if (pvBuf)1379 {1380 uint32_t cbRead;1381 rc = SharedClipboardURIObjectRead(pTransfer, hObj, pvBuf, cbToRead, &cbRead, fFlags);1382 if (RT_SUCCESS(rc))1383 rc = VbglR3ClipboardObjWrite(pCtx, hObj, pvBuf, cbRead, NULL /* pcbWritten */);1384 1385 RTMemFree(pvBuf);1386 }1387 else1388 rc = VERR_NO_MEMORY;1389 }1390 break;1391 }1392 1393 #if 01394 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE:1395 {1396 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_OBJ_WRITE\n"));1397 break;1398 }1399 #endif1400 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */1401 1402 default:1403 rc = VERR_NOT_SUPPORTED;1404 break;1405 1503 } 1406 1504 } … … 1537 1635 } 1538 1636 #endif 1539 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 1637 1638 /** 1639 * Sends (reports) guest clipboard formats to the host. 1640 * 1641 * @returns VBox status code. 1642 * @param pCtx The command context returned by VbglR3ClipboardConnect(). 1643 * @param pFormats The formats to send (report). 1644 */ 1645 VBGLR3DECL(int) VbglR3ClipboardFormatsSend(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDFORMATDATA pFormats) 1646 { 1647 VBoxClipboardFormatsMsg Msg; 1648 1649 if (pCtx->uProtocolVer == 0) 1650 { 1651 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, VBOX_SHARED_CLIPBOARD_GUEST_FN_FORMATS_WRITE, 1); 1652 VbglHGCMParmUInt32Set(&Msg.uFormats, pFormats->uFormats); 1653 } 1654 else 1655 { 1656 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, VBOX_SHARED_CLIPBOARD_GUEST_FN_FORMATS_WRITE, 3); 1657 1658 Msg.uContext.SetUInt32(pCtx->uContextID); 1659 Msg.uFormats.SetUInt32(pFormats->uFormats); 1660 Msg.fFlags.SetUInt32(pFormats->fFlags); 1661 } 1662 1663 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 1664 1665 LogFlowFuncLeaveRC(rc); 1666 return rc; 1667 } 1540 1668 1541 1669 /** 1542 1670 * Reports (advertises) guest clipboard formats to the host. 1671 * 1672 * Legacy function, do not use anymore. 1543 1673 * 1544 1674 * @returns VBox status code. … … 1548 1678 VBGLR3DECL(int) VbglR3ClipboardReportFormats(HGCMCLIENTID idClient, uint32_t fFormats) 1549 1679 { 1550 VBoxClipboard ReportFormatsMsg Msg;1551 1552 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_ REPORT_FORMATS, VBOX_SHARED_CLIPBOARD_CPARMS_REPORT_FORMATS);1553 VbglHGCMParmUInt32Set(&Msg. formats, fFormats);1680 VBoxClipboardFormatsMsg Msg; 1681 1682 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_FORMATS_WRITE, 1); 1683 VbglHGCMParmUInt32Set(&Msg.uFormats, fFormats); 1554 1684 1555 1685 return VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); … … 1557 1687 1558 1688 /** 1559 * Sends guest clipboard data to the host. 1560 * 1561 * This is usually called in reply to a VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA message 1562 * from the host. 1563 * 1564 * @returns VBox status code. 1565 * @param idClient The client id returned by VbglR3ClipboardConnect(). 1566 * @param fFormat The format of the data. 1567 * @param pv The data. 1568 * @param cb The size of the data. 1569 */ 1570 static int vbglR3ClipboardWriteDataRaw(HGCMCLIENTID idClient, uint32_t fFormat, void *pv, uint32_t cb) 1571 { 1572 VBoxClipboardWriteDataMsg Msg; 1573 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA, VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA); 1574 VbglHGCMParmUInt32Set(&Msg.format, fFormat); 1575 VbglHGCMParmPtrSet(&Msg.ptr, pv, cb); 1576 1577 return VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 1578 } 1579 1580 /** 1581 * Send guest clipboard data to the host. 1689 * Sends guest clipboard data to the host. Legacy function kept for compatibility, do not use anymore. 1582 1690 * 1583 1691 * This is usually called in reply to a VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA message … … 1592 1700 VBGLR3DECL(int) VbglR3ClipboardWriteData(HGCMCLIENTID idClient, uint32_t fFormat, void *pv, uint32_t cb) 1593 1701 { 1594 int rc = vbglR3ClipboardWriteDataRaw(idClient, fFormat, pv, cb); 1595 1596 return rc; 1597 } 1598 1599 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 1702 VBoxClipboardWriteDataMsg Msg; 1703 RT_ZERO(Msg); 1704 1705 VBGL_HGCM_HDR_INIT(&Msg.hdr, idClient, 1706 VBOX_SHARED_CLIPBOARD_GUEST_FN_DATA_WRITE, 2); 1707 1708 VbglHGCMParmUInt32Set(&Msg.v0.format, fFormat); 1709 VbglHGCMParmPtrSet(&Msg.v0.ptr, pv, cb); 1710 1711 int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 1712 1713 LogFlowFuncLeaveRC(rc); 1714 return rc; 1715 } 1716 1717 /** 1718 * Sends guest clipboard data to the host. 1719 * 1720 * This is usually called in reply to a VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA message 1721 * from the host. 1722 * 1723 * @returns VBox status code. 1724 * @param pCtx The command context returned by VbglR3ClipboardConnect(). 1725 * @param pData Clipboard data to send. 1726 */ 1727 VBGLR3DECL(int) VbglR3ClipboardWriteDataEx(PVBGLR3SHCLCMDCTX pCtx, PSHAREDCLIPBOARDDATABLOCK pData) 1728 { 1729 int rc; 1730 1731 if (pCtx->uProtocolVer == 0) 1732 { 1733 rc = VbglR3ClipboardWriteData(pCtx->uClientID, pData->uFormat, pData->pvData, pData->cbData); 1734 } 1735 else 1736 { 1737 VBoxClipboardWriteDataMsg Msg; 1738 RT_ZERO(Msg); 1739 1740 VBGL_HGCM_HDR_INIT(&Msg.hdr, pCtx->uClientID, 1741 VBOX_SHARED_CLIPBOARD_GUEST_FN_DATA_WRITE, VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA); 1742 1743 LogFlowFunc(("CID=%RU32\n", pCtx->uContextID)); 1744 1745 Msg.v1.uContext.SetUInt32(pCtx->uContextID); 1746 Msg.v1.uFormat.SetUInt32(pData->uFormat); 1747 Msg.v1.cbData.SetUInt32(pData->cbData); 1748 Msg.v1.pvData.SetPtr(pData->pvData, pData->cbData); 1749 1750 rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg)); 1751 } 1752 1753 LogFlowFuncLeaveRC(rc); 1754 return rc; 1755 } 1756 1600 1757 /** 1601 1758 * Writes an error to the host. … … 1629 1786 return rc; 1630 1787 } 1631 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 1632 1788 -
trunk/src/VBox/Additions/common/VBoxService/VBoxServiceClipboard-os2.cpp
r79497 r80444 775 775 * Listener message - the host has new formats to offer. 776 776 */ 777 case WM_USER + VBOX_SHARED_CLIPBOARD_HOST_MSG_ REPORT_FORMATS:777 case WM_USER + VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE: 778 778 vgsvcClipboardOs2AdvertiseHostFormats(LONGFROMMP(mp1)); 779 779 break; … … 895 895 * respond do WM_RENDERFORMAT message. 896 896 */ 897 case VBOX_SHARED_CLIPBOARD_HOST_MSG_ REPORT_FORMATS:898 if (!WinPostMsg(g_hwndWorker, WM_USER + VBOX_SHARED_CLIPBOARD_HOST_MSG_ REPORT_FORMATS,897 case VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE: 898 if (!WinPostMsg(g_hwndWorker, WM_USER + VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE, 899 899 MPFROMLONG(fFormats), 0)) 900 900 VGSvcError("WinPostMsg(%lx, FORMATS,,) failed, lasterr=%#lx\n", -
trunk/src/VBox/Additions/haiku/VBoxTray/VBoxClipboard.cpp
r79497 r80444 380 380 switch (u32Msg) 381 381 { 382 case VBOX_SHARED_CLIPBOARD_HOST_MSG_ REPORT_FORMATS:382 case VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE: 383 383 { 384 384 /* -
trunk/src/VBox/Additions/x11/VBoxClient/Makefile.kmk
r80378 r80444 99 99 VBoxClient_DEFS += VBOX_WITH_SHARED_CLIPBOARD_GUEST 100 100 VBoxClient_SOURCES += \ 101 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardURIList.cpp \ 102 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardURIObject.cpp \ 103 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardPath.cpp \ 104 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardProvider.cpp \ 105 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardProvider-VbglR3.cpp 101 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-uri.cpp \ 102 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardPath.cpp 106 103 ifdef VBOX_WITH_LIBFUSE_DISABLED 107 104 VBoxClient_SOURCES += \ -
trunk/src/VBox/Additions/x11/VBoxClient/clipboard.cpp
r79497 r80444 145 145 * Tell the host that new clipboard formats are available. 146 146 * 147 * @param pCtx Our context information148 * @param u32Formats The formats to advertise147 * @param pCtx Our context information. 148 * @param u32Formats The formats to report. 149 149 */ 150 150 void ClipReportX11Formats(VBOXCLIPBOARDCONTEXT *pCtx, uint32_t u32Formats) … … 229 229 switch (Msg) 230 230 { 231 case VBOX_SHARED_CLIPBOARD_HOST_MSG_ REPORT_FORMATS:231 case VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE: 232 232 { 233 233 /* The host has announced available clipboard formats. … … 235 235 * future requests from guest applications. 236 236 */ 237 LogRelFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_ REPORT_FORMATSfFormats=%x\n", fFormats));237 LogRelFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE fFormats=%x\n", fFormats)); 238 238 ClipAnnounceFormatToX11(g_ctx.pBackend, fFormats); 239 239 break; -
trunk/src/VBox/Devices/USB/VUSBDevice.cpp
r79500 r80444 1666 1666 PRTREQ hReq = NULL; 1667 1667 1668 Assert(pDev->hUrbIoThread != NIL_RTTHREAD);1668 // Assert(pDev->hUrbIoThread != NIL_RTTHREAD); 1669 1669 if (RT_LIKELY(pDev->hUrbIoThread != NIL_RTTHREAD)) 1670 1670 { -
trunk/src/VBox/Frontends/VirtualBox/src/logviewer/UIVMLogPage.cpp
r80339 r80444 193 193 if (m_bookmarkVector.size() <= index) 194 194 return; 195 m_bookmarkVector.remove(index, 1);195 //m_bookmarkVector.remove(index, 1); 196 196 updateTextEditBookmarkLineSet(); 197 197 } -
trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerIndicator.cpp
r79365 r80444 117 117 118 118 /* Delete corresponding network-request: */ 119 m_ids.remove(iIndexOfRequiredElement); 120 m_data.remove(iIndexOfRequiredElement); 119 RT_NOREF(iIndexOfRequiredElement); 120 //m_ids.remove(iIndexOfRequiredElement); 121 //m_data.remove(iIndexOfRequiredElement); 121 122 122 123 /* Update appearance: */ -
trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIMediaComboBox.cpp
r79365 r80444 49 49 { 50 50 removeItem(0); 51 m_media.erase(m_media.begin());51 //m_media.erase(m_media.begin()); 52 52 } 53 53 … … 165 165 /* Replace medium from combo-box: */ 166 166 removeItem(iIndex); 167 m_media.erase(m_media.begin() + iIndex);167 //m_media.erase(m_media.begin() + iIndex); 168 168 169 169 /* If no real medium left, add the NULL medium: */ -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-common.cpp
r80285 r80444 22 22 #include <iprt/alloc.h> 23 23 #include <iprt/assert.h> 24 #include <iprt/semaphore.h> 24 25 #include <iprt/path.h> 25 26 … … 28 29 #include <VBox/GuestHost/clipboard-helper.h> 29 30 #include <VBox/HostServices/VBoxClipboardSvc.h> 31 32 33 /** 34 * Allocates a new event payload. 35 * 36 * @returns VBox status code. 37 * @param uID Event ID to associate payload to. 38 * @param pvData Data block to associate to this payload. 39 * @param cbData Size (in bytes) of data block to associate. 40 * @param ppPayload Where to store the allocated event payload on success. 41 */ 42 int SharedClipboardPayloadAlloc(uint32_t uID, const void *pvData, uint32_t cbData, 43 PSHAREDCLIPBOARDEVENTPAYLOAD *ppPayload) 44 { 45 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 46 AssertReturn (cbData, VERR_INVALID_PARAMETER); 47 48 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload = 49 (PSHAREDCLIPBOARDEVENTPAYLOAD)RTMemAlloc(sizeof(SHAREDCLIPBOARDEVENTPAYLOAD)); 50 if (!pPayload) 51 return VERR_NO_MEMORY; 52 53 pPayload->pvData = RTMemAlloc(cbData); 54 if (pPayload->pvData) 55 { 56 memcpy(pPayload->pvData, pvData, cbData); 57 58 pPayload->cbData = cbData; 59 pPayload->uID = uID; 60 61 *ppPayload = pPayload; 62 63 return VINF_SUCCESS; 64 } 65 66 RTMemFree(pPayload); 67 return VERR_NO_MEMORY; 68 } 69 70 /** 71 * Frees an event payload. 72 * 73 * @returns VBox status code. 74 * @param pPayload Event payload to free. 75 */ 76 void SharedClipboardPayloadFree(PSHAREDCLIPBOARDEVENTPAYLOAD pPayload) 77 { 78 if (!pPayload) 79 return; 80 81 if (pPayload->pvData) 82 { 83 Assert(pPayload->cbData); 84 RTMemFree(pPayload->pvData); 85 pPayload->pvData = NULL; 86 } 87 88 pPayload->cbData = 0; 89 90 RTMemFree(pPayload); 91 pPayload = NULL; 92 } 93 94 int SharedClipboardEventCreate(PSHAREDCLIPBOARDEVENT pEvent, uint16_t uID) 95 { 96 AssertPtrReturn(pEvent, VERR_INVALID_POINTER); 97 98 LogFlowFunc(("Event %RU16\n", uID)); 99 100 int rc = RTSemEventCreate(&pEvent->hEventSem); 101 if (RT_SUCCESS(rc)) 102 { 103 pEvent->uID = uID; 104 pEvent->pPayload = NULL; 105 } 106 107 return rc; 108 } 109 110 void SharedClipboardEventDestroy(PSHAREDCLIPBOARDEVENT pEvent) 111 { 112 if (!pEvent) 113 return; 114 115 LogFlowFunc(("Event %RU16\n", pEvent->uID)); 116 117 if (pEvent->hEventSem != NIL_RTSEMEVENT) 118 { 119 RTSemEventDestroy(pEvent->hEventSem); 120 pEvent->hEventSem = NIL_RTSEMEVENT; 121 } 122 123 SharedClipboardPayloadFree(pEvent->pPayload); 124 125 pEvent->uID = 0; 126 } 127 128 int SharedClipboardEventSourceCreate(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID) 129 { 130 AssertPtrReturn(pSource, VERR_INVALID_POINTER); 131 132 LogFlowFunc(("pSource=%p, uID=%RU16\n", pSource, uID)); 133 134 int rc = VINF_SUCCESS; 135 136 RTListInit(&pSource->lstEvents); 137 138 pSource->uID = uID; 139 pSource->uEventIDNext = 1; /* Event ID 0 always is reserved (marks "unused"). */ 140 141 LogFlowFuncLeaveRC(rc); 142 return rc; 143 } 144 145 void SharedClipboardEventSourceDestroy(PSHAREDCLIPBOARDEVENTSOURCE pSource) 146 { 147 if (!pSource) 148 return; 149 150 LogFlowFunc(("ID=%RU16\n", pSource->uID)); 151 152 PSHAREDCLIPBOARDEVENT pEvIt; 153 PSHAREDCLIPBOARDEVENT pEvItNext; 154 RTListForEachSafe(&pSource->lstEvents, pEvIt, pEvItNext, SHAREDCLIPBOARDEVENT, Node) 155 { 156 SharedClipboardEventDestroy(pEvIt); 157 RTMemFree(pEvIt); 158 } 159 } 160 161 /** 162 * Generates a new event ID for a specific event source. 163 * 164 * @returns New event ID generated, or 0 on error. 165 * @param pSource Event source to generate event for. 166 */ 167 uint16_t SharedClipboardEventIDGenerate(PSHAREDCLIPBOARDEVENTSOURCE pSource) 168 { 169 AssertPtrReturn(pSource, 0); 170 171 LogFlowFunc(("uSource=%RU16: New event: %RU16\n", pSource->uID, pSource->uEventIDNext)); 172 return pSource->uEventIDNext++; /** @todo Improve this. */ 173 } 174 175 /** 176 * Returns a specific event of a event source. 177 * 178 * @returns Pointer to event if found, or NULL if not found. 179 * @param pSource Event source to get event from. 180 * @param uID Event ID to get. 181 */ 182 inline PSHAREDCLIPBOARDEVENT sharedClipboardEventGet(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID) 183 { 184 PSHAREDCLIPBOARDEVENT pEvIt; 185 RTListForEach(&pSource->lstEvents, pEvIt, SHAREDCLIPBOARDEVENT, Node) 186 { 187 if (pEvIt->uID == uID) 188 return pEvIt; 189 } 190 191 return NULL; 192 } 193 194 /** 195 * Registers an event. 196 * 197 * @returns VBox status code. 198 * @param pSource Event source to register event for. 199 * @param uID Event ID to register. 200 */ 201 int SharedClipboardEventRegister(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID) 202 { 203 AssertPtrReturn(pSource, VERR_INVALID_POINTER); 204 205 int rc; 206 207 LogFlowFunc(("uSource=%RU16, uEvent=%RU16\n", pSource->uID, uID)); 208 209 if (sharedClipboardEventGet(pSource, uID) == NULL) 210 { 211 PSHAREDCLIPBOARDEVENT pEvent 212 = (PSHAREDCLIPBOARDEVENT)RTMemAllocZ(sizeof(SHAREDCLIPBOARDEVENT)); 213 if (pEvent) 214 { 215 rc = SharedClipboardEventCreate(pEvent, uID); 216 if (RT_SUCCESS(rc)) 217 { 218 RTListAppend(&pSource->lstEvents, &pEvent->Node); 219 220 LogFlowFunc(("Event %RU16\n", uID)); 221 } 222 } 223 else 224 rc = VERR_NO_MEMORY; 225 } 226 else 227 rc = VERR_ALREADY_EXISTS; 228 229 #ifdef DEBUG_andy 230 AssertRC(rc); 231 #endif 232 233 LogFlowFuncLeaveRC(rc); 234 return rc; 235 } 236 237 /** 238 * Unregisters an event. 239 * 240 * @returns VBox status code. 241 * @param pSource Event source to unregister event for. 242 * @param uID Event ID to unregister. 243 */ 244 int SharedClipboardEventUnregister(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID) 245 { 246 AssertPtrReturn(pSource, VERR_INVALID_POINTER); 247 248 int rc; 249 250 LogFlowFunc(("uSource=%RU16, uEvent=%RU16\n", pSource->uID, uID)); 251 252 PSHAREDCLIPBOARDEVENT pEvent = sharedClipboardEventGet(pSource, uID); 253 if (pEvent) 254 { 255 LogFlowFunc(("Event %RU16\n", pEvent->uID)); 256 257 SharedClipboardEventDestroy(pEvent); 258 RTMemFree(pEvent); 259 260 RTListNodeRemove(&pEvent->Node); 261 262 rc = VINF_SUCCESS; 263 } 264 else 265 rc = VERR_NOT_FOUND; 266 267 AssertRC(rc); 268 269 LogFlowFuncLeaveRC(rc); 270 return rc; 271 } 272 273 /** 274 * Waits for an event to get signalled. 275 * 276 * @returns VBox status code. 277 * @param pSource Event source that contains the event to wait for. 278 * @param uID Event ID to wait for. 279 * @param uTimeoutMs Timeout (in ms) to wait. 280 * @param ppPayload Where to store the (allocated) event payload on success. Needs to be free'd with 281 * SharedClipboardPayloadFree(). 282 */ 283 int SharedClipboardEventWait(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID, RTMSINTERVAL uTimeoutMs, 284 PSHAREDCLIPBOARDEVENTPAYLOAD* ppPayload) 285 { 286 AssertPtrReturn(pSource, VERR_INVALID_POINTER); 287 288 LogFlowFuncEnter(); 289 290 int rc; 291 292 PSHAREDCLIPBOARDEVENT pEvent = sharedClipboardEventGet(pSource, uID); 293 if (pEvent) 294 { 295 rc = RTSemEventWait(pEvent->hEventSem, uTimeoutMs); 296 if (RT_SUCCESS(rc)) 297 { 298 *ppPayload = pEvent->pPayload; 299 300 pEvent->pPayload = NULL; 301 } 302 } 303 else 304 rc = VERR_NOT_FOUND; 305 306 LogFlowFuncLeaveRC(rc); 307 return rc; 308 } 309 310 /** 311 * Signals an event. 312 * 313 * @returns VBox status code. 314 * @param pSource Event source of event to signal. 315 * @param uID Event ID to signal. 316 * @param pPayload Event payload to associate. Takes ownership. Optional. 317 */ 318 int SharedClipboardEventSignal(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID, 319 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload) 320 { 321 AssertPtrReturn(pSource, VERR_INVALID_POINTER); 322 323 int rc; 324 325 LogFlowFunc(("uSource=%RU16, uEvent=%RU16\n", pSource->uID, uID)); 326 327 PSHAREDCLIPBOARDEVENT pEvent = sharedClipboardEventGet(pSource, uID); 328 if (pEvent) 329 { 330 Assert(pEvent->pPayload == NULL); 331 332 pEvent->pPayload = pPayload; 333 334 rc = RTSemEventSignal(pEvent->hEventSem); 335 } 336 else 337 rc = VERR_NOT_FOUND; 338 339 #ifdef DEBUG_andy 340 AssertRC(rc); 341 #endif 342 343 LogFlowFuncLeaveRC(rc); 344 return rc; 345 } 346 347 /** 348 * Detaches a payload from an event. 349 * 350 * @returns VBox status code. 351 * @param pSource Event source of event to detach payload for. 352 * @param uID Event ID to detach payload for. 353 */ 354 void SharedClipboardEventPayloadDetach(PSHAREDCLIPBOARDEVENTSOURCE pSource, uint16_t uID) 355 { 356 AssertPtrReturnVoid(pSource); 357 358 LogFlowFunc(("uSource=%RU16, uEvent=%RU16\n", pSource->uID, uID)); 359 360 PSHAREDCLIPBOARDEVENT pEvent = sharedClipboardEventGet(pSource, uID); 361 if (pEvent) 362 { 363 pEvent->pPayload = NULL; 364 } 365 #ifdef DEBUG_andy 366 else 367 AssertMsgFailed(("uSource=%RU16, uEvent=%RU16\n", pSource->uID, uID)); 368 #endif 369 } 30 370 31 371 /** @todo use const where appropriate; delinuxify the code (*Lin* -> *Host*); use AssertLogRel*. */ … … 421 761 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT); 422 762 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); 423 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_ REPORT_FORMATS);763 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE); 424 764 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START); 425 765 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_READ); … … 453 793 switch (uMsg) 454 794 { 455 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_REPORT_FORMATS); 456 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA); 457 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA); 795 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG_OLD); 796 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_FORMATS_WRITE); 797 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_DATA_READ); 798 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_DATA_WRITE); 799 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_CONNECT); 458 800 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT); 459 801 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT); … … 477 819 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL); 478 820 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR); 479 RT_CASE_RET_STR(VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT);480 821 } 481 822 return "Unknown"; 482 823 } 824 -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-uri.cpp
r80374 r80444 21 21 #include <iprt/dir.h> 22 22 #include <iprt/file.h> 23 #include <iprt/list.h> 23 24 #include <iprt/path.h> 24 25 #include <iprt/semaphore.h> … … 31 32 static int sharedClipboardURITransferThreadCreate(PSHAREDCLIPBOARDURITRANSFER pTransfer, PFNRTTHREAD pfnThreadFunc, void *pvUser); 32 33 static int sharedClipboardURITransferThreadDestroy(PSHAREDCLIPBOARDURITRANSFER pTransfer, RTMSINTERVAL uTimeoutMs); 33 static int sharedClipboardURITransferWriteThread(RTTHREAD hThread, void *pvUser);34 34 static PSHAREDCLIPBOARDURITRANSFER sharedClipboardURICtxGetTransferInternal(PSHAREDCLIPBOARDURICTX pURI, uint32_t uIdx); 35 35 static int sharedClipboardConvertFileCreateFlags(bool fWritable, unsigned fShClFlags, RTFMODE fMode, … … 695 695 pParms->pszPath = NULL; 696 696 } 697 } 698 699 /** 700 * Returns a specific object handle info of a transfer. 701 * 702 * @returns Pointer to object handle info if found, or NULL if not found. 703 * @param pTransfer URI clipboard transfer to get object handle info from. 704 * @param hObj Object handle of the object to get handle info for. 705 */ 706 inline PSHAREDCLIPBOARDURIOBJHANDLEINFO sharedClipboardURIObjectGet(PSHAREDCLIPBOARDURITRANSFER pTransfer, 707 SHAREDCLIPBOARDOBJHANDLE hObj) 708 { 709 PSHAREDCLIPBOARDURIOBJHANDLEINFO pIt; 710 RTListForEach(&pTransfer->lstObj, pIt, SHAREDCLIPBOARDURIOBJHANDLEINFO, Node) 711 { 712 if (pIt->hObj == hObj) 713 return pIt; 714 } 715 716 return NULL; 697 717 } 698 718 … … 744 764 if (RT_SUCCESS(rc)) 745 765 { 746 const SHAREDCLIPBOARDOBJHANDLE hObj = pTransfer->uObjHandleNext++; 747 766 pInfo->hObj = pTransfer->uObjHandleNext++; 748 767 pInfo->enmType = SHAREDCLIPBOARDURIOBJTYPE_FILE; 749 768 750 pTransfer->pMapObj->insert( 751 std::pair<SHAREDCLIPBOARDOBJHANDLE, PSHAREDCLIPBOARDURIOBJHANDLEINFO>(hObj, pInfo)); 752 753 *phObj = hObj; 769 RTListAppend(&pTransfer->lstObj, &pInfo->Node); 770 771 *phObj = pInfo->hObj; 754 772 } 755 773 … … 789 807 if (pTransfer->State.enmSource == SHAREDCLIPBOARDSOURCE_LOCAL) 790 808 { 791 SharedClipboardURIObjMap::iterator itObj = pTransfer->pMapObj->find(hObj); 792 if (itObj != pTransfer->pMapObj->end()) 793 { 794 PSHAREDCLIPBOARDURIOBJHANDLEINFO pInfo = itObj->second; 795 AssertPtr(pInfo); 796 809 PSHAREDCLIPBOARDURIOBJHANDLEINFO pInfo = sharedClipboardURIObjectGet(pTransfer, hObj); 810 if (pInfo) 811 { 797 812 switch (pInfo->enmType) 798 813 { … … 820 835 RTMemFree(pInfo); 821 836 822 pTransfer->pMapObj->erase(itObj);837 RTListNodeRemove(&pInfo->Node); 823 838 } 824 839 else … … 862 877 if (pTransfer->State.enmSource == SHAREDCLIPBOARDSOURCE_LOCAL) 863 878 { 864 SharedClipboardURIObjMap::iterator itObj = pTransfer->pMapObj->find(hObj); 865 if (itObj != pTransfer->pMapObj->end()) 866 { 867 PSHAREDCLIPBOARDURIOBJHANDLEINFO pInfo = itObj->second; 868 AssertPtr(pInfo); 869 879 PSHAREDCLIPBOARDURIOBJHANDLEINFO pInfo = sharedClipboardURIObjectGet(pTransfer, hObj); 880 if (pInfo) 881 { 870 882 switch (pInfo->enmType) 871 883 { … … 927 939 if (pTransfer->State.enmSource == SHAREDCLIPBOARDSOURCE_LOCAL) 928 940 { 929 SharedClipboardURIObjMap::iterator itObj = pTransfer->pMapObj->find(hObj); 930 if (itObj != pTransfer->pMapObj->end()) 931 { 932 PSHAREDCLIPBOARDURIOBJHANDLEINFO pInfo = itObj->second; 933 AssertPtr(pInfo); 934 941 PSHAREDCLIPBOARDURIOBJHANDLEINFO pInfo = sharedClipboardURIObjectGet(pTransfer, hObj); 942 if (pInfo) 943 { 935 944 switch (pInfo->enmType) 936 945 { … … 1070 1079 pTransfer->uListHandleNext = 1; 1071 1080 pTransfer->uObjHandleNext = 1; 1072 pTransfer->uEventIDNext = 1;1073 1081 1074 1082 pTransfer->uTimeoutMs = 30 * 1000; /* 30s timeout by default. */ … … 1080 1088 RT_ZERO(pTransfer->Callbacks); 1081 1089 1082 pTransfer->pMapEvents = new SharedClipboardURITransferEventMap(); 1083 if (pTransfer->pMapEvents) 1084 { 1085 pTransfer->pMapLists = new SharedClipboardURIListMap(); 1086 if (pTransfer->pMapLists) 1087 { 1088 pTransfer->pMapObj = new SharedClipboardURIObjMap(); 1089 if (pTransfer->pMapObj) 1090 *ppTransfer = pTransfer; 1091 } 1092 } 1093 else 1094 rc = VERR_NO_MEMORY; 1090 RTListInit(&pTransfer->lstList); 1091 RTListInit(&pTransfer->lstObj); 1092 1093 pTransfer->cRoots = 0; 1094 RTListInit(&pTransfer->lstRoots); 1095 1096 *ppTransfer = pTransfer; 1095 1097 1096 1098 if (RT_FAILURE(rc)) … … 1126 1128 RTStrFree(pTransfer->pszPathRootAbs); 1127 1129 1128 if (pTransfer->pMapEvents) 1129 { 1130 SharedClipboardURITransferEventMap::iterator itEvent = pTransfer->pMapEvents->begin(); 1131 while (itEvent != pTransfer->pMapEvents->end()) 1132 { 1133 1134 itEvent = pTransfer->pMapEvents->begin(); 1135 } 1136 1137 delete pTransfer->pMapEvents; 1138 pTransfer->pMapEvents = NULL; 1139 } 1140 1141 if (pTransfer->pMapLists) 1142 { 1143 SharedClipboardURIListMap::iterator itList = pTransfer->pMapLists->begin(); 1144 while (itList != pTransfer->pMapLists->end()) 1145 { 1146 SharedClipboardURIListHandleInfoDestroy(itList->second); 1147 pTransfer->pMapLists->erase(itList); 1148 itList = pTransfer->pMapLists->begin(); 1149 } 1150 1151 Assert(pTransfer->pMapLists->size() == 0); 1152 1153 delete pTransfer->pMapLists; 1154 pTransfer->pMapLists = NULL; 1155 } 1156 1157 if (pTransfer->pMapObj) 1158 { 1159 SharedClipboardURIObjMap::iterator itObj = pTransfer->pMapObj->begin(); 1160 while (itObj != pTransfer->pMapObj->end()) 1161 { 1162 SharedClipboardURIObjectHandleInfoDestroy(itObj->second); 1163 pTransfer->pMapObj->erase(itObj); 1164 itObj = pTransfer->pMapObj->begin(); 1165 } 1166 1167 Assert(pTransfer->pMapObj->size() == 0); 1168 1169 delete pTransfer->pMapObj; 1170 pTransfer->pMapObj = NULL; 1130 SharedClipboardEventSourceDestroy(&pTransfer->Events); 1131 1132 PSHAREDCLIPBOARDURILISTHANDLEINFO pItList, pItListNext; 1133 RTListForEachSafe(&pTransfer->lstList, pItList, pItListNext, SHAREDCLIPBOARDURILISTHANDLEINFO, Node) 1134 { 1135 SharedClipboardURIListHandleInfoDestroy(pItList); 1136 1137 RTListNodeRemove(&pItList->Node); 1138 1139 RTMemFree(pItList); 1140 } 1141 1142 PSHAREDCLIPBOARDURIOBJHANDLEINFO pItObj, pItObjNext; 1143 RTListForEachSafe(&pTransfer->lstObj, pItObj, pItObjNext, SHAREDCLIPBOARDURIOBJHANDLEINFO, Node) 1144 { 1145 SharedClipboardURIObjectHandleInfoDestroy(pItObj); 1146 1147 RTListNodeRemove(&pItObj->Node); 1148 1149 RTMemFree(pItObj); 1171 1150 } 1172 1151 … … 1198 1177 1199 1178 /** 1179 * Returns a specific list handle info of a transfer. 1180 * 1181 * @returns Pointer to list handle info if found, or NULL if not found. 1182 * @param pTransfer URI clipboard transfer to get list handle info from. 1183 * @param hList List handle of the list to get handle info for. 1184 */ 1185 inline PSHAREDCLIPBOARDURILISTHANDLEINFO sharedClipboardURITransferListGet(PSHAREDCLIPBOARDURITRANSFER pTransfer, 1186 SHAREDCLIPBOARDLISTHANDLE hList) 1187 { 1188 PSHAREDCLIPBOARDURILISTHANDLEINFO pIt; 1189 RTListForEach(&pTransfer->lstList, pIt, SHAREDCLIPBOARDURILISTHANDLEINFO, Node) 1190 { 1191 if (pIt->hList == hList) 1192 return pIt; 1193 } 1194 1195 return NULL; 1196 } 1197 1198 /** 1200 1199 * Creates a new list handle (local only). 1201 1200 * … … 1203 1202 * @param pTransfer URI clipboard transfer to create new list handle for. 1204 1203 */ 1205 staticSHAREDCLIPBOARDLISTHANDLE sharedClipboardURITransferListHandleNew(PSHAREDCLIPBOARDURITRANSFER pTransfer)1204 inline SHAREDCLIPBOARDLISTHANDLE sharedClipboardURITransferListHandleNew(PSHAREDCLIPBOARDURITRANSFER pTransfer) 1206 1205 { 1207 1206 return pTransfer->uListHandleNext++; /** @todo Good enough for now. Improve this later. */ … … 1244 1243 { 1245 1244 rc = RTDirOpen(&pInfo->u.Local.hDir, pOpenParms->pszPath); 1245 break; 1246 1246 } 1247 1247 … … 1260 1260 if (RT_SUCCESS(rc)) 1261 1261 { 1262 hList = sharedClipboardURITransferListHandleNew(pTransfer); 1263 1264 pTransfer->pMapLists->insert( 1265 std::pair<SHAREDCLIPBOARDLISTHANDLE, PSHAREDCLIPBOARDURILISTHANDLEINFO>(hList, pInfo)); /** @todo Can this throw? */ 1262 pInfo->hList = sharedClipboardURITransferListHandleNew(pTransfer); 1263 1264 RTListAppend(&pTransfer->lstList, &pInfo->Node); 1266 1265 } 1267 1266 else … … 1323 1322 if (pTransfer->State.enmSource == SHAREDCLIPBOARDSOURCE_LOCAL) 1324 1323 { 1325 SharedClipboardURIListMap::iterator itList = pTransfer->pMapLists->find(hList); 1326 if (itList != pTransfer->pMapLists->end()) 1327 { 1328 PSHAREDCLIPBOARDURILISTHANDLEINFO pInfo = itList->second; 1329 AssertPtr(pInfo); 1330 1324 PSHAREDCLIPBOARDURILISTHANDLEINFO pInfo = sharedClipboardURITransferListGet(pTransfer, hList); 1325 if (pInfo) 1326 { 1331 1327 switch (pInfo->enmType) 1332 1328 { … … 1343 1339 } 1344 1340 1341 RTListNodeRemove(&pInfo->Node); 1342 1345 1343 RTMemFree(pInfo); 1346 1347 pTransfer->pMapLists->erase(itList);1348 1344 } 1349 1345 else … … 1559 1555 if (pTransfer->State.enmSource == SHAREDCLIPBOARDSOURCE_LOCAL) 1560 1556 { 1561 SharedClipboardURIListMap::iterator itList = pTransfer->pMapLists->find(hList);1562 if ( itList != pTransfer->pMapLists->end())1557 PSHAREDCLIPBOARDURILISTHANDLEINFO pInfo = sharedClipboardURITransferListGet(pTransfer, hList); 1558 if (pInfo) 1563 1559 { 1564 1560 rc = SharedClipboardURIListHdrInit(pHdr); 1565 1561 if (RT_SUCCESS(rc)) 1566 1562 { 1567 PSHAREDCLIPBOARDURILISTHANDLEINFO pInfo = itList->second;1568 AssertPtr(pInfo);1569 1570 1563 switch (pInfo->enmType) 1571 1564 { … … 1666 1659 if (pTransfer->State.enmSource == SHAREDCLIPBOARDSOURCE_LOCAL) 1667 1660 { 1668 SharedClipboardURIListMap::iterator itList = pTransfer->pMapLists->find(hList); 1669 if (itList != pTransfer->pMapLists->end()) 1670 { 1671 PSHAREDCLIPBOARDURILISTHANDLEINFO pInfo = itList->second; 1672 AssertPtr(pInfo); 1673 1661 PSHAREDCLIPBOARDURILISTHANDLEINFO pInfo = sharedClipboardURITransferListGet(pTransfer, hList); 1662 if (pInfo) 1663 { 1674 1664 switch (pInfo->enmType) 1675 1665 { … … 1826 1816 if (pTransfer->State.enmSource == SHAREDCLIPBOARDSOURCE_LOCAL) 1827 1817 { 1828 SharedClipboardURIListMap::iterator itList = pTransfer->pMapLists->find(hList); 1829 fIsValid = itList != pTransfer->pMapLists->end(); 1818 fIsValid = sharedClipboardURITransferListGet(pTransfer, hList) != NULL; 1830 1819 } 1831 1820 else if (pTransfer->State.enmSource == SHAREDCLIPBOARDSOURCE_REMOTE) … … 1927 1916 } 1928 1917 1929 pTransfer->lstRootEntries.clear(); 1918 PSHAREDCLIPBOARDURILISTROOT pListRoot, pListRootNext; 1919 RTListForEachSafe(&pTransfer->lstRoots, pListRoot, pListRootNext, SHAREDCLIPBOARDURILISTROOT, Node) 1920 { 1921 RTStrFree(pListRoot->pszPathAbs); 1922 1923 RTListNodeRemove(&pListRoot->Node); 1924 1925 RTMemFree(pListRoot); 1926 pListRoot = NULL; 1927 } 1928 1929 pTransfer->cRoots = 0; 1930 1930 } 1931 1931 … … 1952 1952 sharedClipboardURIListTransferRootsClear(pTransfer); 1953 1953 1954 char *pszPathRootAbs = NULL;1954 char *pszPathRootAbs = NULL; 1955 1955 1956 1956 RTCList<RTCString> lstRootEntries = RTCString(pszRoots, cbRoots - 1).split("\r\n"); 1957 1957 for (size_t i = 0; i < lstRootEntries.size(); ++i) 1958 1958 { 1959 SHAREDCLIPBOARDURILISTROOT listRoot; 1960 listRoot.strPathAbs = lstRootEntries.at(i); 1959 PSHAREDCLIPBOARDURILISTROOT pListRoot = (PSHAREDCLIPBOARDURILISTROOT)RTMemAlloc(sizeof(SHAREDCLIPBOARDURILISTROOT)); 1960 AssertPtrBreakStmt(pListRoot, rc = VERR_NO_MEMORY); 1961 1962 pListRoot->pszPathAbs = RTStrDup(lstRootEntries.at(i).c_str()); 1963 AssertPtrBreakStmt(pListRoot->pszPathAbs, rc = VERR_NO_MEMORY); 1961 1964 1962 1965 if (!pszPathRootAbs) 1963 1966 { 1964 pszPathRootAbs = RTStrDup( listRoot.strPathAbs.c_str());1967 pszPathRootAbs = RTStrDup(pListRoot->pszPathAbs); 1965 1968 if (pszPathRootAbs) 1966 1969 { … … 1976 1979 1977 1980 /* Make sure all entries have the same root path. */ 1978 if (!RTStrStartsWith( listRoot.strPathAbs.c_str(), pszPathRootAbs))1981 if (!RTStrStartsWith(pListRoot->pszPathAbs, pszPathRootAbs)) 1979 1982 { 1980 1983 rc = VERR_INVALID_PARAMETER; … … 1982 1985 } 1983 1986 1984 pTransfer->lstRootEntries.append(listRoot); 1987 RTListAppend(&pTransfer->lstRoots, &pListRoot->Node); 1988 1989 pTransfer->cRoots++; 1985 1990 } 1986 1991 … … 1990 1995 { 1991 1996 pTransfer->pszPathRootAbs = pszPathRootAbs; 1992 LogFlowFunc(("pszPathRootAbs=%s, cRoots=%zu\n", pTransfer->pszPathRootAbs, pTransfer-> lstRootEntries.size()));1997 LogFlowFunc(("pszPathRootAbs=%s, cRoots=%zu\n", pTransfer->pszPathRootAbs, pTransfer->cRoots)); 1993 1998 } 1994 1999 … … 2034 2039 AssertPtrReturn(pTransfer, 0); 2035 2040 2036 return (uint32_t)pTransfer->lstRootEntries.size(); 2041 return (uint32_t)pTransfer->cRoots; 2042 } 2043 2044 /** 2045 * Returns a specific root list entry of a transfer. 2046 * 2047 * @returns Pointer to root list entry if found, or NULL if not found. 2048 * @param pTransfer URI clipboard transfer to get root list entry from. 2049 * @param uIdx Index of root list entry to return. 2050 */ 2051 inline PSHAREDCLIPBOARDURILISTROOT sharedClipboardURILTransferRootsGet(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint32_t uIdx) 2052 { 2053 if (uIdx >= pTransfer->cRoots) 2054 return NULL; 2055 2056 PSHAREDCLIPBOARDURILISTROOT pIt = RTListGetFirst(&pTransfer->lstRoots, SHAREDCLIPBOARDURILISTROOT, Node); 2057 while (uIdx--) 2058 pIt = RTListGetNext(&pTransfer->lstRoots, pIt, SHAREDCLIPBOARDURILISTROOT, Node); 2059 2060 return pIt; 2037 2061 } 2038 2062 … … 2046 2070 */ 2047 2071 int SharedClipboardURILTransferRootsEntry(PSHAREDCLIPBOARDURITRANSFER pTransfer, 2048 uint 32_t uIndex, PVBOXCLIPBOARDROOTLISTENTRY pEntry)2072 uint64_t uIndex, PVBOXCLIPBOARDROOTLISTENTRY pEntry) 2049 2073 { 2050 2074 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 2051 2075 AssertPtrReturn(pEntry, VERR_INVALID_POINTER); 2052 2076 2053 if (uIndex >= pTransfer-> lstRootEntries.size())2077 if (uIndex >= pTransfer->cRoots) 2054 2078 return VERR_INVALID_PARAMETER; 2055 2079 2056 2080 int rc; 2057 2081 2058 PSHAREDCLIPBOARDURILISTROOT pRoot = &pTransfer->lstRootEntries.at(uIndex);2059 AssertPtrReturn(pRoot, VERR_INVALID_P OINTER);2082 PSHAREDCLIPBOARDURILISTROOT pRoot = sharedClipboardURILTransferRootsGet(pTransfer, uIndex); 2083 AssertPtrReturn(pRoot, VERR_INVALID_PARAMETER); 2060 2084 2061 2085 /* Make sure that we only advertise relative source paths, not absolute ones. */ 2062 const char *pcszSrcPath = pRoot-> strPathAbs.c_str();2086 const char *pcszSrcPath = pRoot->pszPathAbs; 2063 2087 2064 2088 char *pszFileName = RTPathFilename(pcszSrcPath); … … 2124 2148 return VERR_NO_MEMORY; 2125 2149 2126 const uint 32_t cRoots = (uint32_t)pTransfer->lstRootEntries.size();2127 2128 LogFlowFunc(("cRoots=%RU 32\n", cRoots));2150 const uint64_t cRoots = (uint32_t)pTransfer->cRoots; 2151 2152 LogFlowFunc(("cRoots=%RU64\n", cRoots)); 2129 2153 2130 2154 if (cRoots) … … 2134 2158 if (paRootListEntries) 2135 2159 { 2136 for (uint 32_t i = 0; i < cRoots; ++i)2160 for (uint64_t i = 0; i < cRoots; ++i) 2137 2161 { 2138 2162 rc = SharedClipboardURILTransferRootsEntry(pTransfer, i, &paRootListEntries[i]); … … 2250 2274 2251 2275 /** 2252 * Allocates a new event payload.2253 *2254 * @returns VBox status code.2255 * @param uID Event ID to associate payload to.2256 * @param pvData Data block to associate to this payload.2257 * @param cbData Size (in bytes) of data block to associate.2258 * @param ppPayload Where to store the allocated event payload on success.2259 */2260 int SharedClipboardURITransferPayloadAlloc(uint32_t uID, const void *pvData, uint32_t cbData,2261 PSHAREDCLIPBOARDURITRANSFERPAYLOAD *ppPayload)2262 {2263 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload =2264 (PSHAREDCLIPBOARDURITRANSFERPAYLOAD)RTMemAlloc(sizeof(SHAREDCLIPBOARDURITRANSFERPAYLOAD));2265 if (!pPayload)2266 return VERR_NO_MEMORY;2267 2268 pPayload->pvData = RTMemAlloc(cbData);2269 if (pPayload->pvData)2270 {2271 memcpy(pPayload->pvData, pvData, cbData);2272 2273 pPayload->cbData = cbData;2274 pPayload->uID = uID;2275 2276 *ppPayload = pPayload;2277 2278 return VINF_SUCCESS;2279 }2280 2281 RTMemFree(pPayload);2282 return VERR_NO_MEMORY;2283 }2284 2285 /**2286 * Frees an event payload.2287 *2288 * @returns VBox status code.2289 * @param pPayload URI clipboard transfer event payload to free.2290 */2291 void SharedClipboardURITransferPayloadFree(PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload)2292 {2293 if (!pPayload)2294 return;2295 2296 if (pPayload->pvData)2297 {2298 Assert(pPayload->cbData);2299 RTMemFree(pPayload->pvData);2300 pPayload->pvData = NULL;2301 }2302 2303 pPayload->cbData = 0;2304 2305 RTMemFree(pPayload);2306 pPayload = NULL;2307 }2308 2309 /**2310 * Generates a new event ID for a specific URI transfer.2311 *2312 * @returns New event ID generated, or 0 on error.2313 * @param pTransfer URI clipboard transfer to generate event for.2314 */2315 uint16_t SharedClipboardURITransferEventIDGenerate(PSHAREDCLIPBOARDURITRANSFER pTransfer)2316 {2317 LogFlowFunc(("New event %RU16\n", pTransfer->uEventIDNext));2318 return pTransfer->uEventIDNext++; /** @todo Improve this. */2319 }2320 2321 /**2322 * Registers an URI transfer event.2323 *2324 * @returns VBox status code.2325 * @param pTransfer URI clipboard transfer to register event for.2326 * @param uID Event ID to register.2327 */2328 int SharedClipboardURITransferEventRegister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID)2329 {2330 int rc;2331 2332 SharedClipboardURITransferEventMap::iterator itEvent = pTransfer->pMapEvents->find(uID);2333 if (itEvent == pTransfer->pMapEvents->end())2334 {2335 PSHAREDCLIPBOARDURITRANSFEREVENT pEvent2336 = (PSHAREDCLIPBOARDURITRANSFEREVENT)RTMemAllocZ(sizeof(SHAREDCLIPBOARDURITRANSFEREVENT));2337 if (pEvent)2338 {2339 rc = RTSemEventCreate(&pEvent->hEventSem);2340 if (RT_SUCCESS(rc))2341 {2342 pTransfer->pMapEvents->insert(std::pair<uint16_t, PSHAREDCLIPBOARDURITRANSFEREVENT>(uID, pEvent)); /** @todo Can this throw? */2343 2344 LogFlowFunc(("Event %RU16\n", uID));2345 }2346 }2347 else2348 rc = VERR_NO_MEMORY;2349 }2350 else2351 rc = VERR_ALREADY_EXISTS;2352 2353 #ifdef DEBUG_andy2354 AssertRC(rc);2355 #endif2356 2357 LogFlowFuncLeaveRC(rc);2358 return rc;2359 }2360 2361 /**2362 * Unregisters an URI transfer event.2363 *2364 * @returns VBox status code.2365 * @param pTransfer URI clipboard transfer to unregister event for.2366 * @param uID Event ID to unregister.2367 */2368 int SharedClipboardURITransferEventUnregister(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID)2369 {2370 int rc;2371 2372 SharedClipboardURITransferEventMap::const_iterator itEvent = pTransfer->pMapEvents->find(uID);2373 if (itEvent != pTransfer->pMapEvents->end())2374 {2375 SharedClipboardURITransferPayloadFree(itEvent->second->pPayload);2376 2377 RTSemEventDestroy(itEvent->second->hEventSem);2378 2379 RTMemFree(itEvent->second);2380 2381 pTransfer->pMapEvents->erase(itEvent);2382 2383 LogFlowFunc(("Event %RU16\n", uID));2384 2385 rc = VINF_SUCCESS;2386 }2387 else2388 rc = VERR_NOT_FOUND;2389 2390 AssertRC(rc);2391 2392 LogFlowFuncLeaveRC(rc);2393 return rc;2394 }2395 2396 /**2397 * Waits for an URI transfer event to get signalled.2398 *2399 * @returns VBox status code.2400 * @param pTransfer URI clipboard transfer that contains the event to wait for.2401 * @param uID Event ID to wait for.2402 * @param uTimeoutMs Timeout (in ms) to wait.2403 * @param ppPayload Where to store the (allocated) event payload on success. Needs to be free'd with2404 * SharedClipboardURITransferPayloadFree().2405 */2406 int SharedClipboardURITransferEventWait(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID, RTMSINTERVAL uTimeoutMs,2407 PSHAREDCLIPBOARDURITRANSFERPAYLOAD *ppPayload)2408 {2409 LogFlowFuncEnter();2410 2411 int rc;2412 2413 SharedClipboardURITransferEventMap::const_iterator itEvent = pTransfer->pMapEvents->find(uID);2414 if (itEvent != pTransfer->pMapEvents->end())2415 {2416 rc = RTSemEventWait(itEvent->second->hEventSem, uTimeoutMs);2417 if (RT_SUCCESS(rc))2418 {2419 *ppPayload = itEvent->second->pPayload;2420 2421 itEvent->second->pPayload = NULL;2422 }2423 }2424 else2425 rc = VERR_NOT_FOUND;2426 2427 LogFlowFuncLeaveRC(rc);2428 return rc;2429 }2430 2431 /**2432 * Signals an URI transfer event.2433 *2434 * @returns VBox status code.2435 * @param pTransfer URI clipboard transfer of event to signal.2436 * @param uID Event ID to signal.2437 * @param pPayload Event payload to associate. Takes ownership. Optional.2438 */2439 int SharedClipboardURITransferEventSignal(PSHAREDCLIPBOARDURITRANSFER pTransfer, uint16_t uID,2440 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload)2441 {2442 int rc;2443 2444 SharedClipboardURITransferEventMap::const_iterator itEvent = pTransfer->pMapEvents->find(uID);2445 if (itEvent != pTransfer->pMapEvents->end())2446 {2447 Assert(itEvent->second->pPayload == NULL);2448 2449 itEvent->second->pPayload = pPayload;2450 2451 rc = RTSemEventSignal(itEvent->second->hEventSem);2452 }2453 else2454 rc = VERR_NOT_FOUND;2455 2456 #ifdef DEBUG_andy2457 AssertRC(rc);2458 #endif2459 2460 LogFlowFuncLeaveRC(rc);2461 return rc;2462 }2463 2464 /**2465 2276 * Creates a thread for a clipboard URI transfer. 2466 2277 * … … 2708 2519 AssertPtrReturnVoid(pURI); 2709 2520 2710 LogFlowFunc(("c Running=%RU32\n", pURI->cRunning));2521 LogFlowFunc(("cTransfers=%RU32, cRunning=%RU32\n", pURI->cTransfers, pURI->cRunning)); 2711 2522 2712 2523 /* Remove all transfers which are not in a running state (e.g. only announced). */ … … 2724 2535 Assert(pURI->cTransfers); 2725 2536 pURI->cTransfers--; 2726 2727 LogFlowFunc(("cTransfers=%RU32\n", pURI->cTransfers));2728 2537 } 2729 2538 } -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-win.cpp
r79672 r80444 384 384 * @returns VBox status code. 385 385 * @param pCtx Windows clipboard context to retrieve formats for. 386 * @param p fFormats Where to store the retrieved formats of type VBOX_SHARED_CLIPBOARD_FMT_ (bitmask).387 */ 388 int VBoxClipboardWinGetFormats(PVBOXCLIPBOARDWINCTX pCtx, P VBOXCLIPBOARDFORMATS pfFormats)389 { 390 AssertPtrReturn(pCtx, VERR_INVALID_POINTER);391 AssertPtrReturn(p fFormats, VERR_INVALID_POINTER);386 * @param pFormats Where to store the retrieved formats. 387 */ 388 int VBoxClipboardWinGetFormats(PVBOXCLIPBOARDWINCTX pCtx, PSHAREDCLIPBOARDFORMATDATA pFormats) 389 { 390 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 391 AssertPtrReturn(pFormats, VERR_INVALID_POINTER); 392 392 393 393 VBOXCLIPBOARDFORMATS fFormats = VBOX_SHARED_CLIPBOARD_FMT_NONE; … … 412 412 { 413 413 LogFlowFunc(("fFormats=0x%08X\n", fFormats)); 414 *pfFormats = fFormats; 414 415 pFormats->uFormats = fFormats; 416 pFormats->fFlags = 0; /** @todo Handle flags. */ 415 417 } 416 418 -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-x11.cpp
r78583 r80444 588 588 * unit test. So keep it simple, be paranoid and log everything. 589 589 */ 590 static void clipConvertX11Targets(Widget widget, XtPointer pClient Data,590 static void clipConvertX11Targets(Widget widget, XtPointer pClient, 591 591 Atom * /* selection */, Atom *atomType, 592 592 XtPointer pValue, long unsigned int *pcLen, … … 594 594 { 595 595 RT_NOREF1(piFormat); 596 CLIPBACKEND *pCtx = reinterpret_cast<CLIPBACKEND *>(pClient Data);596 CLIPBACKEND *pCtx = reinterpret_cast<CLIPBACKEND *>(pClient); 597 597 Atom *pAtoms = (Atom *)pValue; 598 598 unsigned i, j; … … 1764 1764 * the X11 clipboard contains a format we understand. 1765 1765 */ 1766 static void clipConvertX11CB(void *pClient Data, void *pvSrc, unsigned cbSrc)1767 { 1768 CLIPREADX11CBREQ *pReq = (CLIPREADX11CBREQ *) pClient Data;1766 static void clipConvertX11CB(void *pClient, void *pvSrc, unsigned cbSrc) 1767 { 1768 CLIPREADX11CBREQ *pReq = (CLIPREADX11CBREQ *) pClient; 1769 1769 LogRelFlowFunc(("pReq->mFormat=%02X, pReq->mTextFormat=%u, " 1770 1770 "pReq->mBitmapFormat=%u, pReq->mHtmlFormat=%u, pReq->mCtx=%p\n", … … 1909 1909 * the X11 clipboard contains a format we understand. 1910 1910 */ 1911 static void cbConvertX11CB(Widget widget, XtPointer pClient Data,1911 static void cbConvertX11CB(Widget widget, XtPointer pClient, 1912 1912 Atom * /* selection */, Atom *atomType, 1913 1913 XtPointer pvSrc, long unsigned int *pcLen, … … 1916 1916 RT_NOREF1(widget); 1917 1917 if (*atomType == XT_CONVERT_FAIL) /* Xt timeout */ 1918 clipConvertX11CB(pClient Data, NULL, 0);1918 clipConvertX11CB(pClient, NULL, 0); 1919 1919 else 1920 clipConvertX11CB(pClient Data, pvSrc, (*pcLen) * (*piFormat) / 8);1920 clipConvertX11CB(pClient, pvSrc, (*pcLen) * (*piFormat) / 8); 1921 1921 1922 1922 XtFree((char *)pvSrc); -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-darwin.cpp
r79042 r80444 44 44 PasteboardRef pasteboard; 45 45 46 PVBOXCLIPBOARDCLIENT DATA pClientData;46 PVBOXCLIPBOARDCLIENT pClient; 47 47 }; 48 48 … … 63 63 static int vboxClipboardChanged(VBOXCLIPBOARDCONTEXT *pCtx) 64 64 { 65 if (pCtx->pClient Data== NULL)65 if (pCtx->pClient == NULL) 66 66 return VINF_SUCCESS; 67 67 … … 72 72 if (RT_SUCCESS(rc) && fChanged) 73 73 { 74 vboxSvcClipboard ReportMsg(pCtx->pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS, fFormats);74 vboxSvcClipboardOldReportMsg(pCtx->pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE, fFormats); 75 75 Log(("vboxClipboardChanged fFormats %02X\n", fFormats)); 76 76 } … … 157 157 destroyPasteboard(&g_ctx.pasteboard); 158 158 g_ctx.thread = NIL_RTTHREAD; 159 g_ctx.pClientData = NULL; 160 } 161 162 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENTDATA pClientData, bool fHeadless) 163 { 164 NOREF(fHeadless); 165 if (g_ctx.pClientData != NULL) 159 g_ctx.pClient = NULL; 160 } 161 162 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT pClient, bool fHeadless) 163 { 164 RT_NOREF(fHeadless); 165 166 if (g_ctx.pClient != NULL) 166 167 { 167 168 /* One client only. */ … … 171 172 VBoxSvcClipboardLock(); 172 173 173 pClient Data->State.pCtx = &g_ctx;174 pClient Data->State.pCtx->pClientData = pClientData;174 pClient->State.pCtx = &g_ctx; 175 pClient->State.pCtx->pClient = pClient; 175 176 176 177 /* Initially sync the host clipboard content with the client. */ 177 int rc = VBoxClipboardSvcImplSync(pClient Data);178 179 VBoxSvcClipboardUnlock(); 180 return rc; 181 } 182 183 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT DATA pClientData)178 int rc = VBoxClipboardSvcImplSync(pClient); 179 180 VBoxSvcClipboardUnlock(); 181 return rc; 182 } 183 184 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT pClient) 184 185 { 185 186 /* Sync the host clipboard content with the client. */ 186 187 VBoxSvcClipboardLock(); 187 int rc = vboxClipboardChanged(pClient Data->State.pCtx);188 VBoxSvcClipboardUnlock(); 189 190 return rc; 191 } 192 193 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT DATA pClientData)194 { 195 VBoxSvcClipboardLock(); 196 pClient Data->State.pCtx->pClientData= NULL;188 int rc = vboxClipboardChanged(pClient->State.pCtx); 189 VBoxSvcClipboardUnlock(); 190 191 return rc; 192 } 193 194 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT pClient) 195 { 196 VBoxSvcClipboardLock(); 197 pClient->State.pCtx->pClient = NULL; 197 198 VBoxSvcClipboardUnlock(); 198 199 … … 200 201 } 201 202 202 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Formats) 203 { 204 LogFlowFunc(("u32Formats=%02X\n", u32Formats)); 205 206 if (u32Formats == 0) 203 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, 204 PSHAREDCLIPBOARDFORMATDATA pFormats) 205 { 206 RT_NOREF(pCmdCtx); 207 208 LogFlowFunc(("uFormats=%02X\n", pFormats->uFormats)); 209 210 if (pFormats->uFormats == 0) 207 211 { 208 212 /* This is just an automatism, not a genuine announcement */ … … 210 214 } 211 215 212 return vboxSvcClipboardReportMsg(pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, u32Formats); 216 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 217 if (pFormats->uFormats & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST) /* No URI support yet. */ 218 return VINF_SUCCESS; 219 #endif 220 221 return vboxSvcClipboardOldReportMsg(pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, pFormats->uFormats); 213 222 } 214 223 … … 216 225 * Called by the HGCM clipboard subsystem when the guest wants to read the host clipboard. 217 226 * 218 * @param pClientData Context information about the guest VM 219 * @param u32Format The format that the guest would like to receive the data in 220 * @param pv Where to write the data to 221 * @param cb The size of the buffer to write the data to 222 * @param pcbActual Where to write the actual size of the written data 223 */ 224 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Format, 225 void *pv, uint32_t cb, uint32_t *pcbActual) 227 * @param pClient Context information about the guest VM. 228 * @param pData Data block to put read data into. 229 * @param pcbActual Where to write the actual size of the written data. 230 */ 231 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENT pClient, 232 PSHAREDCLIPBOARDDATABLOCK pData, uint32_t *pcbActual) 226 233 { 227 234 VBoxSvcClipboardLock(); … … 229 236 /* Default to no data available. */ 230 237 *pcbActual = 0; 231 int rc = readFromPasteboard(pClientData->State.pCtx->pasteboard, u32Format, pv, cb, pcbActual); 232 233 VBoxSvcClipboardUnlock(); 238 239 int rc = readFromPasteboard(pClient->State.pCtx->pasteboard, 240 pData->uFormat, pData->pvData, pData->cbData, pcbActual); 241 242 VBoxSvcClipboardUnlock(); 243 234 244 return rc; 235 245 } … … 238 248 * Called by the HGCM clipboard subsystem when we have requested data and that data arrives. 239 249 * 240 * @param pClientData Context information about the guest VM 241 * @param pv Buffer to which the data was written 242 * @param cb The size of the data written 243 * @param u32Format The format of the data written 244 */ 245 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENTDATA pClientData, void *pv, uint32_t cb, uint32_t u32Format) 246 { 247 VBoxSvcClipboardLock(); 248 249 writeToPasteboard(pClientData->State.pCtx->pasteboard, pv, cb, u32Format); 250 * @param pClient Context information about the guest VM 251 * @param pData Data block to write to clipboard. 252 */ 253 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDDATABLOCK pData) 254 { 255 VBoxSvcClipboardLock(); 256 257 writeToPasteboard(pClient->State.pCtx->pasteboard, pData->pvData, pData->cbData, pData->uFormat); 250 258 251 259 VBoxSvcClipboardUnlock(); … … 255 263 256 264 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 257 int VBoxClipboardSvcImplURIReadDir(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDDIRDATA pDirData)258 { 259 RT_NOREF(pClient Data, pDirData);260 return VERR_NOT_IMPLEMENTED; 261 } 262 263 int VBoxClipboardSvcImplURIWriteDir(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDDIRDATA pDirData)264 { 265 RT_NOREF(pClient Data, pDirData);266 return VERR_NOT_IMPLEMENTED; 267 } 268 269 int VBoxClipboardSvcImplURIReadFileHdr(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEHDR pFileHdr)270 { 271 RT_NOREF(pClient Data, pFileHdr);272 return VERR_NOT_IMPLEMENTED; 273 } 274 275 int VBoxClipboardSvcImplURIWriteFileHdr(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEHDR pFileHdr)276 { 277 RT_NOREF(pClient Data, pFileHdr);278 return VERR_NOT_IMPLEMENTED; 279 } 280 281 int VBoxClipboardSvcImplURIReadFileData(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEDATA pFileData)282 { 283 RT_NOREF(pClient Data, pFileData);284 return VERR_NOT_IMPLEMENTED; 285 } 286 287 int VBoxClipboardSvcImplURIWriteFileData(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEDATA pFileData)288 { 289 RT_NOREF(pClient Data, pFileData);265 int VBoxClipboardSvcImplURIReadDir(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDDIRDATA pDirData) 266 { 267 RT_NOREF(pClient, pDirData); 268 return VERR_NOT_IMPLEMENTED; 269 } 270 271 int VBoxClipboardSvcImplURIWriteDir(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDDIRDATA pDirData) 272 { 273 RT_NOREF(pClient, pDirData); 274 return VERR_NOT_IMPLEMENTED; 275 } 276 277 int VBoxClipboardSvcImplURIReadFileHdr(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEHDR pFileHdr) 278 { 279 RT_NOREF(pClient, pFileHdr); 280 return VERR_NOT_IMPLEMENTED; 281 } 282 283 int VBoxClipboardSvcImplURIWriteFileHdr(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEHDR pFileHdr) 284 { 285 RT_NOREF(pClient, pFileHdr); 286 return VERR_NOT_IMPLEMENTED; 287 } 288 289 int VBoxClipboardSvcImplURIReadFileData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEDATA pFileData) 290 { 291 RT_NOREF(pClient, pFileData); 292 return VERR_NOT_IMPLEMENTED; 293 } 294 295 int VBoxClipboardSvcImplURIWriteFileData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEDATA pFileData) 296 { 297 RT_NOREF(pClient, pFileData); 290 298 return VERR_NOT_IMPLEMENTED; 291 299 } -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-internal.h
r80320 r80444 80 80 81 81 /** 82 * Structure for keeping generic client state data within the Shared Clipboard host service. 83 * This structure needs to be serializable by SSM (must be a POD type). 84 */ 85 typedef struct VBOXCLIPBOARDCLIENTSTATE 86 { 87 struct VBOXCLIPBOARDCLIENTSTATE *pNext; 88 struct VBOXCLIPBOARDCLIENTSTATE *pPrev; 89 90 VBOXCLIPBOARDCONTEXT *pCtx; 91 92 uint32_t u32ClientID; 93 94 SHAREDCLIPBOARDSOURCE enmSource; 95 82 * Structure for keeping the old client state tracking, 83 * needed for compatbility to older Guest Additions (for now). Remove this later. 84 */ 85 typedef struct VBOXCLIPBOARDCLIENTSTATEOLD 86 { 96 87 /** The guest is waiting for a message. */ 97 88 bool fAsync; … … 105 96 bool fHostMsgFormats; 106 97 107 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST108 /** The client's URI state. */109 VBOXCLIPBOARDCLIENTURISTATE URI;110 #endif111 112 98 struct { 113 99 VBOXHGCMCALLHANDLE callHandle; … … 130 116 uint32_t u32AvailableFormats; 131 117 uint32_t u32RequestedFormat; 118 } VBOXCLIPBOARDCLIENTSTATEOLD; 119 120 /** 121 * Structure for keeping generic client state data within the Shared Clipboard host service. 122 * This structure needs to be serializable by SSM (must be a POD type). 123 */ 124 typedef struct VBOXCLIPBOARDCLIENTSTATE 125 { 126 struct VBOXCLIPBOARDCLIENTSTATE *pNext; 127 struct VBOXCLIPBOARDCLIENTSTATE *pPrev; 128 129 VBOXCLIPBOARDCONTEXT *pCtx; 130 131 /** The client's HGCM ID. */ 132 uint32_t u32ClientID; 133 /** Optional protocol version the client uses. Set to 0 by default. */ 134 uint32_t uProtocolVer; 135 /** Maximum chunk size to use for data transfers. Set to _64K by default. */ 136 uint32_t cbChunkSize; 137 SHAREDCLIPBOARDSOURCE enmSource; 138 /** Old cruft (needed for VBox Guest Additions <= 6.0), remove this some time later. */ 139 VBOXCLIPBOARDCLIENTSTATEOLD Old; 140 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 141 /** The client's URI state. */ 142 VBOXCLIPBOARDCLIENTURISTATE URI; 143 #endif 132 144 } VBOXCLIPBOARDCLIENTSTATE, *PVBOXCLIPBOARDCLIENTSTATE; 133 145 134 /** 135 * Structure for keeping a HGCM client state within the Shared Clipboard host service. 136 */ 137 typedef struct _VBOXCLIPBOARDCLIENTDATA 138 { 146 typedef struct _VBOXCLIPBOARDCLIENTCMDCTX 147 { 148 uint32_t uContextID; 149 } VBOXCLIPBOARDCLIENTCMDCTX, *PVBOXCLIPBOARDCLIENTCMDCTX; 150 151 typedef struct _VBOXCLIPBOARDCLIENT 152 { 153 /** The client's HGCM client ID. */ 154 uint32_t uClientID; 139 155 /** General client state data. */ 140 156 VBOXCLIPBOARDCLIENTSTATE State; 141 157 /** The client's message queue (FIFO). */ 142 158 RTCList<VBOXCLIPBOARDCLIENTMSG *> queueMsg; 159 /** The client's own event source. */ 160 SHAREDCLIPBOARDEVENTSOURCE Events; 143 161 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 144 162 /** URI context data. */ 145 163 SHAREDCLIPBOARDURICTX URI; 146 164 #endif 147 } VBOXCLIPBOARDCLIENTDATA, *PVBOXCLIPBOARDCLIENTDATA;148 149 typedef struct _VBOXCLIPBOARDCLIENT150 {151 /** The client's HGCM client ID. */152 uint32_t uClientID;153 /** Pointer to the client'data, owned by HGCM. */154 PVBOXCLIPBOARDCLIENTDATA pData;155 /** Optional protocol version the client uses. Set to 0 by default. */156 uint32_t uProtocolVer;157 165 /** Structure for keeping the client's pending (deferred return) state. 158 166 * A client is in a deferred state when it asks for the next HGCM message, … … 173 181 } VBOXCLIPBOARDCLIENT, *PVBOXCLIPBOARDCLIENT; 174 182 183 typedef struct _VBOXCLIPBOARDCLIENTMAPENTRY 184 { 185 } VBOXCLIPBOARDCLIENTMAPENTRY; 186 175 187 /** Map holding pointers to drag and drop clients. Key is the (unique) HGCM client ID. */ 176 typedef std::map<uint32_t, VBOXCLIPBOARDCLIENT *> ClipboardClientMap;188 typedef std::map<uint32_t, VBOXCLIPBOARDCLIENTMAPENTRY> ClipboardClientMap; 177 189 178 190 /** Simple queue (list) which holds deferred (waiting) clients. */ … … 182 194 * The service functions. Locking is between the service thread and the platform-dependent (window) thread. 183 195 */ 184 int vboxSvcClipboardCompleteReadData(PVBOXCLIPBOARDCLIENTDATA pClientData, int rc, uint32_t cbActual); 196 int vboxSvcClipboardSendFormatsWrite(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDFORMATDATA pFormats); 197 198 int vboxSvcClipboardOldCompleteReadData(PVBOXCLIPBOARDCLIENT pClient, int rc, uint32_t cbActual); 199 int vboxSvcClipboardOldReportMsg(PVBOXCLIPBOARDCLIENT pClient, uint32_t uMsg, uint32_t uFormats); 200 185 201 uint32_t vboxSvcClipboardGetMode(void); 186 int vboxSvcClipboardReportMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t uMsg, uint32_t uFormats); 187 int vboxSvcClipboardSetSource(PVBOXCLIPBOARDCLIENTDATA pClientData, SHAREDCLIPBOARDSOURCE enmSource); 188 189 void vboxSvcClipboardMsgQueueReset(PVBOXCLIPBOARDCLIENTDATA pClientData); 202 int vboxSvcClipboardSetSource(PVBOXCLIPBOARDCLIENT pClient, SHAREDCLIPBOARDSOURCE enmSource); 203 204 void vboxSvcClipboardMsgQueueReset(PVBOXCLIPBOARDCLIENT pClient); 190 205 PVBOXCLIPBOARDCLIENTMSG vboxSvcClipboardMsgAlloc(uint32_t uMsg, uint32_t cParms); 191 206 void vboxSvcClipboardMsgFree(PVBOXCLIPBOARDCLIENTMSG pMsg); 192 207 void vboxSvcClipboardMsgSetPeekReturn(PVBOXCLIPBOARDCLIENTMSG pMsg, PVBOXHGCMSVCPARM paDstParms, uint32_t cDstParms); 193 int vboxSvcClipboardMsgAdd(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDCLIENTMSG pMsg, bool fAppend);208 int vboxSvcClipboardMsgAdd(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTMSG pMsg, bool fAppend); 194 209 int vboxSvcClipboardMsgPeek(PVBOXCLIPBOARDCLIENT pClient, VBOXHGCMCALLHANDLE hCall, uint32_t cParms, VBOXHGCMSVCPARM paParms[], bool fWait); 195 210 int vboxSvcClipboardMsgGet(PVBOXCLIPBOARDCLIENT pClient, VBOXHGCMCALLHANDLE hCall, uint32_t cParms, VBOXHGCMSVCPARM paParms[]); … … 199 214 # ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 200 215 bool vboxSvcClipboardURIMsgIsAllowed(uint32_t uMode, uint32_t uMsg); 201 int vboxSvcClipboardURIReportMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Msg, uint32_t u32Formats);202 bool vboxSvcClipboardURIReturnMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);203 216 # endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 204 217 … … 209 222 void VBoxClipboardSvcImplDestroy(void); 210 223 211 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT DATA pClientData, bool fHeadless);212 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT DATA pClientData);213 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENT DATA pClientData, uint32_t u32Formats);214 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENT DATA pClientData, uint32_t u32Format, void *pv, uint32_t cb, uint32_t *pcbActual);215 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENT DATA pClientData, void *pv, uint32_t cb, uint32_t u32Format);224 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT pClient, bool fHeadless); 225 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT pClient); 226 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, PSHAREDCLIPBOARDFORMATDATA pFormats); 227 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, PSHAREDCLIPBOARDDATABLOCK pData, uint32_t *pcbActual); 228 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, PSHAREDCLIPBOARDDATABLOCK pData); 216 229 /** 217 230 * Synchronise the contents of the host clipboard with the guest, called by the HGCM layer 218 231 * after a save and restore of the guest. 219 232 */ 220 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT DATA pClientData);233 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT pClient); 221 234 222 235 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST … … 251 264 DECLCALLBACK(void) VBoxSvcClipboardURITransferErrorCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData, int rc); 252 265 253 int VBoxClipboardSvcImplURITransferCreate(PVBOXCLIPBOARDCLIENT DATA pClientData, PSHAREDCLIPBOARDURITRANSFER pTransfer);254 int VBoxClipboardSvcImplURITransferDestroy(PVBOXCLIPBOARDCLIENT DATA pClientData, PSHAREDCLIPBOARDURITRANSFER pTransfer);266 int VBoxClipboardSvcImplURITransferCreate(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDURITRANSFER pTransfer); 267 int VBoxClipboardSvcImplURITransferDestroy(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDURITRANSFER pTransfer); 255 268 #endif 256 269 -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp
r80374 r80444 89 89 if (pMsgHdr) 90 90 { 91 uint16_t uEventHdrRead = SharedClipboard URITransferEventIDGenerate(pCtx->pTransfer);91 uint16_t uEventHdrRead = SharedClipboardEventIDGenerate(&pCtx->pTransfer->Events); 92 92 93 93 HGCMSvcSetU32(&pMsgHdr->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEventHdrRead)); 94 94 HGCMSvcSetU32(&pMsgHdr->m_paParms[1], 0 /* fRoots */); 95 95 96 rc = vboxSvcClipboardMsgAdd(pClient ->pData, pMsgHdr, true /* fAppend */);97 if (RT_SUCCESS(rc)) 98 { 99 int rc2 = SharedClipboard URITransferEventRegister(pCtx->pTransfer, uEventHdrRead);96 rc = vboxSvcClipboardMsgAdd(pClient, pMsgHdr, true /* fAppend */); 97 if (RT_SUCCESS(rc)) 98 { 99 int rc2 = SharedClipboardEventRegister(&pCtx->pTransfer->Events, uEventHdrRead); 100 100 AssertRC(rc2); 101 101 … … 103 103 if (RT_SUCCESS(rc)) 104 104 { 105 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayloadHdr;106 rc = SharedClipboard URITransferEventWait(pCtx->pTransfer, uEventHdrRead,107 105 PSHAREDCLIPBOARDEVENTPAYLOAD pPayloadHdr; 106 rc = SharedClipboardEventWait(&pCtx->pTransfer->Events, uEventHdrRead, 107 pCtx->pTransfer->uTimeoutMs, &pPayloadHdr); 108 108 if (RT_SUCCESS(rc)) 109 109 { … … 128 128 VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_ENTRY_READ_REQ); 129 129 130 uint16_t uEventEntryRead = SharedClipboard URITransferEventIDGenerate(pCtx->pTransfer);130 uint16_t uEventEntryRead = SharedClipboardEventIDGenerate(&pCtx->pTransfer->Events); 131 131 132 132 HGCMSvcSetU32(&pMsgEntry->m_paParms[0], … … 135 135 HGCMSvcSetU32(&pMsgEntry->m_paParms[2], i /* uIndex */); 136 136 137 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEventEntryRead);137 rc2 = SharedClipboardEventRegister(&pCtx->pTransfer->Events, uEventEntryRead); 138 138 AssertRC(rc2); 139 139 140 rc = vboxSvcClipboardMsgAdd(pClient ->pData, pMsgEntry, true /* fAppend */);140 rc = vboxSvcClipboardMsgAdd(pClient, pMsgEntry, true /* fAppend */); 141 141 if (RT_FAILURE(rc)) 142 142 break; 143 143 144 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayloadEntry;145 rc = SharedClipboard URITransferEventWait(pCtx->pTransfer, uEventEntryRead,146 144 PSHAREDCLIPBOARDEVENTPAYLOAD pPayloadEntry; 145 rc = SharedClipboardEventWait(&pCtx->pTransfer->Events, uEventEntryRead, 146 pCtx->pTransfer->uTimeoutMs, &pPayloadEntry); 147 147 if (RT_FAILURE(rc)) 148 148 break; … … 153 153 rc = SharedClipboardURIListEntryCopy(&pRootList->paEntries[i], pSrcRootListEntry); 154 154 155 SharedClipboard URITransferPayloadFree(pPayloadEntry);156 157 SharedClipboard URITransferEventUnregister(pCtx->pTransfer, uEventEntryRead);155 SharedClipboardPayloadFree(pPayloadEntry); 156 157 SharedClipboardEventUnregister(&pCtx->pTransfer->Events, uEventEntryRead); 158 158 159 159 if (RT_FAILURE(rc)) … … 175 175 SharedClipboardURIRootListFree(pRootList); 176 176 177 SharedClipboard URITransferPayloadFree(pPayloadHdr);177 SharedClipboardPayloadFree(pPayloadHdr); 178 178 } 179 179 else … … 182 182 } 183 183 184 SharedClipboard URITransferEventUnregister(pCtx->pTransfer, uEventHdrRead);184 SharedClipboardEventUnregister(&pCtx->pTransfer->Events, uEventHdrRead); 185 185 } 186 186 } … … 206 206 if (pMsg) 207 207 { 208 const uint16_t uEvent = SharedClipboard URITransferEventIDGenerate(pCtx->pTransfer);208 const uint16_t uEvent = SharedClipboardEventIDGenerate(&pCtx->pTransfer->Events); 209 209 210 210 pMsg->m_Ctx.uContextID = VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEvent); … … 213 213 if (RT_SUCCESS(rc)) 214 214 { 215 rc = vboxSvcClipboardMsgAdd(pClient ->pData, pMsg, true /* fAppend */);216 if (RT_SUCCESS(rc)) 217 { 218 int rc2 = SharedClipboard URITransferEventRegister(pCtx->pTransfer, uEvent);215 rc = vboxSvcClipboardMsgAdd(pClient, pMsg, true /* fAppend */); 216 if (RT_SUCCESS(rc)) 217 { 218 int rc2 = SharedClipboardEventRegister(&pCtx->pTransfer->Events, uEvent); 219 219 AssertRC(rc2); 220 220 … … 222 222 if (RT_SUCCESS(rc)) 223 223 { 224 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;225 rc = SharedClipboard URITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload);224 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 225 rc = SharedClipboardEventWait(&pCtx->pTransfer->Events, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload); 226 226 if (RT_SUCCESS(rc)) 227 227 { … … 235 235 *phList = pReply->u.ListOpen.uHandle; 236 236 237 SharedClipboard URITransferPayloadFree(pPayload);237 SharedClipboardPayloadFree(pPayload); 238 238 } 239 239 } 240 240 241 SharedClipboard URITransferEventUnregister(pCtx->pTransfer, uEvent);241 SharedClipboardEventUnregister(&pCtx->pTransfer->Events, uEvent); 242 242 } 243 243 } … … 263 263 if (pMsg) 264 264 { 265 const uint16_t uEvent = SharedClipboard URITransferEventIDGenerate(pCtx->pTransfer);265 const uint16_t uEvent = SharedClipboardEventIDGenerate(&pCtx->pTransfer->Events); 266 266 267 267 pMsg->m_Ctx.uContextID = VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEvent); … … 270 270 if (RT_SUCCESS(rc)) 271 271 { 272 rc = vboxSvcClipboardMsgAdd(pClient ->pData, pMsg, true /* fAppend */);273 if (RT_SUCCESS(rc)) 274 { 275 int rc2 = SharedClipboard URITransferEventRegister(pCtx->pTransfer, uEvent);272 rc = vboxSvcClipboardMsgAdd(pClient, pMsg, true /* fAppend */); 273 if (RT_SUCCESS(rc)) 274 { 275 int rc2 = SharedClipboardEventRegister(&pCtx->pTransfer->Events, uEvent); 276 276 AssertRC(rc2); 277 277 … … 279 279 if (RT_SUCCESS(rc)) 280 280 { 281 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;282 rc = SharedClipboard URITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload);281 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 282 rc = SharedClipboardEventWait(&pCtx->pTransfer->Events, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload); 283 283 if (RT_SUCCESS(rc)) 284 SharedClipboard URITransferPayloadFree(pPayload);285 } 286 287 SharedClipboard URITransferEventUnregister(pCtx->pTransfer, uEvent);284 SharedClipboardPayloadFree(pPayload); 285 } 286 287 SharedClipboardEventUnregister(&pCtx->pTransfer->Events, uEvent); 288 288 } 289 289 } … … 310 310 if (pMsg) 311 311 { 312 const uint16_t uEvent = SharedClipboard URITransferEventIDGenerate(pCtx->pTransfer);312 const uint16_t uEvent = SharedClipboardEventIDGenerate(&pCtx->pTransfer->Events); 313 313 314 314 HGCMSvcSetU32(&pMsg->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEvent)); … … 316 316 HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fFlags */); 317 317 318 rc = vboxSvcClipboardMsgAdd(pClient ->pData, pMsg, true /* fAppend */);319 if (RT_SUCCESS(rc)) 320 { 321 int rc2 = SharedClipboard URITransferEventRegister(pCtx->pTransfer, uEvent);318 rc = vboxSvcClipboardMsgAdd(pClient, pMsg, true /* fAppend */); 319 if (RT_SUCCESS(rc)) 320 { 321 int rc2 = SharedClipboardEventRegister(&pCtx->pTransfer->Events, uEvent); 322 322 AssertRC(rc2); 323 323 … … 325 325 if (RT_SUCCESS(rc)) 326 326 { 327 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;328 rc = SharedClipboard URITransferEventWait(pCtx->pTransfer, uEvent,327 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 328 rc = SharedClipboardEventWait(&pCtx->pTransfer->Events, uEvent, 329 329 pCtx->pTransfer->uTimeoutMs, &pPayload); 330 330 if (RT_SUCCESS(rc)) … … 334 334 *pListHdr = *(PVBOXCLIPBOARDLISTHDR)pPayload->pvData; 335 335 336 SharedClipboard URITransferPayloadFree(pPayload);336 SharedClipboardPayloadFree(pPayload); 337 337 } 338 338 } … … 370 370 if (pMsg) 371 371 { 372 const uint16_t uEvent = SharedClipboard URITransferEventIDGenerate(pCtx->pTransfer);372 const uint16_t uEvent = SharedClipboardEventIDGenerate(&pCtx->pTransfer->Events); 373 373 374 374 HGCMSvcSetU32(&pMsg->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEvent)); … … 376 376 HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fInfo */); 377 377 378 rc = vboxSvcClipboardMsgAdd(pClient ->pData, pMsg, true /* fAppend */);379 if (RT_SUCCESS(rc)) 380 { 381 int rc2 = SharedClipboard URITransferEventRegister(pCtx->pTransfer, uEvent);378 rc = vboxSvcClipboardMsgAdd(pClient, pMsg, true /* fAppend */); 379 if (RT_SUCCESS(rc)) 380 { 381 int rc2 = SharedClipboardEventRegister(&pCtx->pTransfer->Events, uEvent); 382 382 AssertRC(rc2); 383 383 … … 385 385 if (RT_SUCCESS(rc)) 386 386 { 387 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;388 rc = SharedClipboard URITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload);387 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 388 rc = SharedClipboardEventWait(&pCtx->pTransfer->Events, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload); 389 389 if (RT_SUCCESS(rc)) 390 390 { … … 393 393 rc = SharedClipboardURIListEntryCopy(pListEntry, (PVBOXCLIPBOARDLISTENTRY)pPayload->pvData); 394 394 395 SharedClipboard URITransferPayloadFree(pPayload);395 SharedClipboardPayloadFree(pPayload); 396 396 } 397 397 } … … 429 429 if (pMsg) 430 430 { 431 const uint16_t uEvent = SharedClipboard URITransferEventIDGenerate(pCtx->pTransfer);431 const uint16_t uEvent = SharedClipboardEventIDGenerate(&pCtx->pTransfer->Events); 432 432 433 433 LogFlowFunc(("pszPath=%s, fCreate=0x%x\n", pCreateParms->pszPath, pCreateParms->fCreate)); … … 441 441 HGCMSvcSetU32(&pMsg->m_paParms[4], pCreateParms->fCreate); 442 442 443 rc = vboxSvcClipboardMsgAdd(pClient ->pData, pMsg, true /* fAppend */);444 if (RT_SUCCESS(rc)) 445 { 446 int rc2 = SharedClipboard URITransferEventRegister(pCtx->pTransfer, uEvent);443 rc = vboxSvcClipboardMsgAdd(pClient, pMsg, true /* fAppend */); 444 if (RT_SUCCESS(rc)) 445 { 446 int rc2 = SharedClipboardEventRegister(&pCtx->pTransfer->Events, uEvent); 447 447 AssertRC(rc2); 448 448 … … 450 450 if (RT_SUCCESS(rc)) 451 451 { 452 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;453 rc = SharedClipboard URITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload);452 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 453 rc = SharedClipboardEventWait(&pCtx->pTransfer->Events, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload); 454 454 if (RT_SUCCESS(rc)) 455 455 { … … 463 463 *phObj = pReply->u.ObjOpen.uHandle; 464 464 465 SharedClipboard URITransferPayloadFree(pPayload);465 SharedClipboardPayloadFree(pPayload); 466 466 } 467 467 } … … 488 488 if (pMsg) 489 489 { 490 const uint16_t uEvent = SharedClipboard URITransferEventIDGenerate(pCtx->pTransfer);490 const uint16_t uEvent = SharedClipboardEventIDGenerate(&pCtx->pTransfer->Events); 491 491 492 492 HGCMSvcSetU32(&pMsg->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEvent)); 493 493 HGCMSvcSetU64(&pMsg->m_paParms[1], hObj); 494 494 495 rc = vboxSvcClipboardMsgAdd(pClient ->pData, pMsg, true /* fAppend */);496 if (RT_SUCCESS(rc)) 497 { 498 int rc2 = SharedClipboard URITransferEventRegister(pCtx->pTransfer, uEvent);495 rc = vboxSvcClipboardMsgAdd(pClient, pMsg, true /* fAppend */); 496 if (RT_SUCCESS(rc)) 497 { 498 int rc2 = SharedClipboardEventRegister(&pCtx->pTransfer->Events, uEvent); 499 499 AssertRC(rc2); 500 500 … … 502 502 if (RT_SUCCESS(rc)) 503 503 { 504 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;505 rc = SharedClipboard URITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload);504 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 505 rc = SharedClipboardEventWait(&pCtx->pTransfer->Events, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload); 506 506 if (RT_SUCCESS(rc)) 507 507 { 508 508 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDREPLY)); 509 509 510 #ifdef VBOX_STRICT 510 511 PVBOXCLIPBOARDREPLY pReply = (PVBOXCLIPBOARDREPLY)pPayload->pvData; 511 512 AssertPtr(pReply); 512 513 513 514 Assert(pReply->uType == VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_OBJ_CLOSE); 514 515 SharedClipboardURITransferPayloadFree(pPayload); 515 #endif 516 517 SharedClipboardPayloadFree(pPayload); 516 518 } 517 519 } … … 539 541 if (pMsg) 540 542 { 541 const uint16_t uEvent = SharedClipboard URITransferEventIDGenerate(pCtx->pTransfer);543 const uint16_t uEvent = SharedClipboardEventIDGenerate(&pCtx->pTransfer->Events); 542 544 543 545 HGCMSvcSetU32(&pMsg->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEvent)); … … 546 548 HGCMSvcSetU32(&pMsg->m_paParms[3], fFlags); 547 549 548 rc = vboxSvcClipboardMsgAdd(pClient ->pData, pMsg, true /* fAppend */);549 if (RT_SUCCESS(rc)) 550 { 551 int rc2 = SharedClipboard URITransferEventRegister(pCtx->pTransfer, uEvent);550 rc = vboxSvcClipboardMsgAdd(pClient, pMsg, true /* fAppend */); 551 if (RT_SUCCESS(rc)) 552 { 553 int rc2 = SharedClipboardEventRegister(&pCtx->pTransfer->Events, uEvent); 552 554 AssertRC(rc2); 553 555 … … 555 557 if (RT_SUCCESS(rc)) 556 558 { 557 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;558 rc = SharedClipboard URITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload);559 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 560 rc = SharedClipboardEventWait(&pCtx->pTransfer->Events, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload); 559 561 if (RT_SUCCESS(rc)) 560 562 { … … 571 573 *pcbRead = cbRead; 572 574 573 SharedClipboard URITransferPayloadFree(pPayload);575 SharedClipboardPayloadFree(pPayload); 574 576 } 575 577 } … … 597 599 if (pMsg) 598 600 { 599 const uint16_t uEvent = SharedClipboard URITransferEventIDGenerate(pCtx->pTransfer);601 const uint16_t uEvent = SharedClipboardEventIDGenerate(&pCtx->pTransfer->Events); 600 602 601 603 HGCMSvcSetU32(&pMsg->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEvent)); … … 604 606 HGCMSvcSetU64(&pMsg->m_paParms[3], fFlags); 605 607 606 rc = vboxSvcClipboardMsgAdd(pClient ->pData, pMsg, true /* fAppend */);607 if (RT_SUCCESS(rc)) 608 { 609 int rc2 = SharedClipboard URITransferEventRegister(pCtx->pTransfer, uEvent);608 rc = vboxSvcClipboardMsgAdd(pClient, pMsg, true /* fAppend */); 609 if (RT_SUCCESS(rc)) 610 { 611 int rc2 = SharedClipboardEventRegister(&pCtx->pTransfer->Events, uEvent); 610 612 AssertRC(rc2); 611 613 … … 613 615 if (RT_SUCCESS(rc)) 614 616 { 615 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;616 rc = SharedClipboard URITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload);617 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 618 rc = SharedClipboardEventWait(&pCtx->pTransfer->Events, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload); 617 619 if (RT_SUCCESS(rc)) 618 620 { … … 624 626 *pcbWritten = cbRead; 625 627 626 SharedClipboard URITransferPayloadFree(pPayload);628 SharedClipboardPayloadFree(pPayload); 627 629 } 628 630 } … … 942 944 if (RT_SUCCESS(rc)) 943 945 rc = HGCMSvcGetU64(&paParms[5], &pListHdr->cbTotalSize); 944 if (RT_SUCCESS(rc))945 rc = HGCMSvcGetU32(&paParms[6], &pListHdr->enmCompression);946 if (RT_SUCCESS(rc))947 rc = HGCMSvcGetU32(&paParms[7], (uint32_t *)&pListHdr->enmChecksumType);948 946 949 947 if (RT_SUCCESS(rc)) … … 960 958 } 961 959 960 #if 0 962 961 /** 963 962 * Sets an URI list header to HGCM service parameters. … … 974 973 int rc; 975 974 976 if ( cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR 977 || cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR) 975 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR) 978 976 { 979 977 /** @todo Set pvMetaFmt + cbMetaFmt. */ … … 985 983 HGCMSvcSetU64(&paParms[3], pListHdr->cTotalObjects); 986 984 HGCMSvcSetU64(&paParms[4], pListHdr->cbTotalSize); 987 HGCMSvcSetU32(&paParms[5], pListHdr->enmCompression);988 HGCMSvcSetU32(&paParms[6], pListHdr->enmChecksumType);989 985 990 986 rc = VINF_SUCCESS; … … 996 992 return rc; 997 993 } 994 #endif 998 995 999 996 /** … … 1042 1039 } 1043 1040 1041 #if 0 1044 1042 /** 1045 1043 * Sets an URI data chunk to HGCM service parameters. … … 1073 1071 return rc; 1074 1072 } 1073 #endif 1075 1074 1076 1075 /** … … 1161 1160 if (RT_SUCCESS(rc)) 1162 1161 { 1163 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload1164 = (PSHAREDCLIPBOARD URITRANSFERPAYLOAD)RTMemAlloc(sizeof(SHAREDCLIPBOARDURITRANSFERPAYLOAD));1162 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload 1163 = (PSHAREDCLIPBOARDEVENTPAYLOAD)RTMemAlloc(sizeof(SHAREDCLIPBOARDEVENTPAYLOAD)); 1165 1164 if (pPayload) 1166 1165 { … … 1186 1185 LogFlowFunc(("uCID=%RU32 -> uEvent=%RU32\n", uCID, uEvent)); 1187 1186 1188 rc = SharedClipboard URITransferEventSignal(pTransfer, uEvent, pPayload);1187 rc = SharedClipboardEventSignal(&pTransfer->Events, uEvent, pPayload); 1189 1188 } 1190 1189 break; … … 1242 1241 pClient->uClientID, u32Function, VBoxClipboardGuestMsgToStr(u32Function), cParms, g_pfnExtension)); 1243 1242 1244 const PVBOXCLIPBOARDCLIENTDATA pClientData = pClient->pData;1245 AssertPtrReturn(pClientData, VERR_INVALID_POINTER);1246 1247 1243 /* Check if we've the right mode set. */ 1248 1244 if (!vboxSvcClipboardURIMsgIsAllowed(vboxSvcClipboardGetMode(), u32Function)) … … 1271 1267 switch (u32Function) 1272 1268 { 1273 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT:1274 RT_FALL_THROUGH();1275 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT:1276 RT_FALL_THROUGH();1277 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET:1278 RT_FALL_THROUGH();1279 1269 case VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS: 1280 1270 break; 1281 1271 default: 1282 1272 { 1283 if (!SharedClipboardURICtxGetTotalTransfers(&pClient Data->URI))1273 if (!SharedClipboardURICtxGetTotalTransfers(&pClient->URI)) 1284 1274 { 1285 1275 LogFunc(("No transfers found\n")); … … 1290 1280 const uint32_t uTransferID = 0; /* Only one transfer per client is supported at the moment. */ 1291 1281 1292 pTransfer = SharedClipboardURICtxGetTransfer(&pClient Data->URI, uTransferID);1282 pTransfer = SharedClipboardURICtxGetTransfer(&pClient->URI, uTransferID); 1293 1283 if (!pTransfer) 1294 1284 { … … 1307 1297 switch (u32Function) 1308 1298 { 1299 #if 0 1309 1300 case VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS: 1310 1301 { 1311 LogFlowFunc(("[Client %RU32] VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS\n", pClient->uClientID));1312 1313 1302 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_STATUS) 1314 1303 break; … … 1321 1310 LogFlowFunc(("uStatus: %RU32\n", uStatus)); 1322 1311 1323 if ( uStatus == SHAREDCLIPBOARDURITRANSFERSTATUS_RUNNING 1324 && !SharedClipboardURICtxTransfersMaximumReached(&pClientData->URI)) 1325 { 1326 SharedClipboardURICtxTransfersCleanup(&pClientData->URI); 1327 1312 SharedClipboardURICtxTransfersCleanup(&pClient->URI); 1313 1314 if (SharedClipboardURICtxTransfersMaximumReached(&pClient->URI)) 1315 { 1316 rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED; 1317 break; 1318 } 1319 1320 if (uStatus == SHAREDCLIPBOARDURITRANSFERSTATUS_RUNNING) 1321 { 1328 1322 const SHAREDCLIPBOARDURITRANSFERDIR enmDir = SHAREDCLIPBOARDURITRANSFERDIR_READ; 1329 1323 … … 1333 1327 if (RT_SUCCESS(rc)) 1334 1328 { 1335 rc = vboxSvcClipboardURIAreaRegister(&pClient Data->State, pTransfer);1329 rc = vboxSvcClipboardURIAreaRegister(&pClient->State, pTransfer); 1336 1330 if (RT_SUCCESS(rc)) 1337 1331 { … … 1339 1333 RT_ZERO(creationCtx); 1340 1334 1341 creationCtx.enmSource = pClient Data->State.enmSource;1335 creationCtx.enmSource = pClient->State.enmSource; 1342 1336 1343 1337 creationCtx.Interface.pfnTransferOpen = vboxSvcClipboardURITransferOpen; … … 1366 1360 RT_ZERO(Callbacks); 1367 1361 1368 Callbacks.pvUser = pClient Data;1362 Callbacks.pvUser = pClient; 1369 1363 1370 1364 Callbacks.pfnTransferPrepare = VBoxSvcClipboardURITransferPrepareCallback; … … 1377 1371 rc = SharedClipboardURITransferSetInterface(pTransfer, &creationCtx); 1378 1372 if (RT_SUCCESS(rc)) 1379 rc = SharedClipboardURICtxTransferAdd(&pClient Data->URI, pTransfer);1373 rc = SharedClipboardURICtxTransferAdd(&pClient->URI, pTransfer); 1380 1374 } 1381 1375 1382 1376 if (RT_SUCCESS(rc)) 1383 1377 { 1384 rc = VBoxClipboardSvcImplURITransferCreate(pClient Data, pTransfer);1378 rc = VBoxClipboardSvcImplURITransferCreate(pClient, pTransfer); 1385 1379 if (RT_SUCCESS(rc)) 1386 rc = VBoxClipboardSvcImplFormatAnnounce(pClient Data, VBOX_SHARED_CLIPBOARD_FMT_URI_LIST);1380 rc = VBoxClipboardSvcImplFormatAnnounce(pClient, VBOX_SHARED_CLIPBOARD_FMT_URI_LIST); 1387 1381 } 1388 1382 1389 1383 if (RT_FAILURE(rc)) 1390 1384 { 1391 VBoxClipboardSvcImplURITransferDestroy(pClient Data, pTransfer);1385 VBoxClipboardSvcImplURITransferDestroy(pClient, pTransfer); 1392 1386 SharedClipboardURITransferDestroy(pTransfer); 1393 1387 } 1394 1388 } 1395 1389 } 1396 else1397 rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED;1398 1390 1399 1391 LogFlowFunc(("[Client %RU32] VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS: %Rrc\n", pClient->uClientID, rc)); … … 1404 1396 break; 1405 1397 } 1406 1407 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT: 1408 { 1409 rc = vboxSvcClipboardMsgPeek(pClient, callHandle, cParms, paParms, false /*fWait*/); 1410 break; 1411 } 1412 1413 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT: 1414 { 1415 rc = vboxSvcClipboardMsgPeek(pClient, callHandle, cParms, paParms, true /*fWait*/); 1416 break; 1417 } 1418 1419 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET: 1420 { 1421 rc = vboxSvcClipboardMsgGet(pClient, callHandle, cParms, paParms); 1422 break; 1423 } 1398 #endif 1424 1399 1425 1400 case VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY: … … 1449 1424 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID); 1450 1425 1451 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;1452 rc = SharedClipboard URITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload);1426 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 1427 rc = SharedClipboardPayloadAlloc(uEvent, pvData, cbData, &pPayload); 1453 1428 if (RT_SUCCESS(rc)) 1454 1429 { 1455 rc = SharedClipboard URITransferEventSignal(pTransfer, uEvent, pPayload);1430 rc = SharedClipboardEventSignal(&pTransfer->Events, uEvent, pPayload); 1456 1431 if (RT_FAILURE(rc)) 1457 SharedClipboard URITransferPayloadFree(pPayload);1432 SharedClipboardPayloadFree(pPayload); 1458 1433 } 1459 1434 } … … 1498 1473 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID); 1499 1474 1500 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;1501 rc = SharedClipboard URITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload);1475 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 1476 rc = SharedClipboardPayloadAlloc(uEvent, pvData, cbData, &pPayload); 1502 1477 if (RT_SUCCESS(rc)) 1503 1478 { 1504 rc = SharedClipboard URITransferEventSignal(pTransfer, uEvent, pPayload);1479 rc = SharedClipboardEventSignal(&pTransfer->Events, uEvent, pPayload); 1505 1480 if (RT_FAILURE(rc)) 1506 SharedClipboard URITransferPayloadFree(pPayload);1481 SharedClipboardPayloadFree(pPayload); 1507 1482 } 1508 1483 } … … 1578 1553 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID); 1579 1554 1580 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;1581 rc = SharedClipboard URITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload);1555 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 1556 rc = SharedClipboardPayloadAlloc(uEvent, pvData, cbData, &pPayload); 1582 1557 if (RT_SUCCESS(rc)) 1583 1558 { 1584 rc = SharedClipboard URITransferEventSignal(pTransfer, uEvent, pPayload);1559 rc = SharedClipboardEventSignal(&pTransfer->Events, uEvent, pPayload); 1585 1560 if (RT_FAILURE(rc)) 1586 SharedClipboard URITransferPayloadFree(pPayload);1561 SharedClipboardPayloadFree(pPayload); 1587 1562 } 1588 1563 } … … 1626 1601 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID); 1627 1602 1628 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;1629 rc = SharedClipboard URITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload);1603 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 1604 rc = SharedClipboardPayloadAlloc(uEvent, pvData, cbData, &pPayload); 1630 1605 if (RT_SUCCESS(rc)) 1631 1606 { 1632 rc = SharedClipboard URITransferEventSignal(pTransfer, uEvent, pPayload);1607 rc = SharedClipboardEventSignal(&pTransfer->Events, uEvent, pPayload); 1633 1608 if (RT_FAILURE(rc)) 1634 SharedClipboard URITransferPayloadFree(pPayload);1609 SharedClipboardPayloadFree(pPayload); 1635 1610 } 1636 1611 } … … 1672 1647 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID); 1673 1648 1674 PSHAREDCLIPBOARD URITRANSFERPAYLOAD pPayload;1675 rc = SharedClipboard URITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload);1649 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 1650 rc = SharedClipboardPayloadAlloc(uEvent, pvData, cbData, &pPayload); 1676 1651 if (RT_SUCCESS(rc)) 1677 1652 { 1678 rc = SharedClipboard URITransferEventSignal(pTransfer, uEvent, pPayload);1653 rc = SharedClipboardEventSignal(&pTransfer->Events, uEvent, pPayload); 1679 1654 if (RT_FAILURE(rc)) 1680 SharedClipboard URITransferPayloadFree(pPayload);1655 SharedClipboardPayloadFree(pPayload); 1681 1656 } 1682 1657 } … … 1906 1881 switch (u32Function) 1907 1882 { 1908 case VBOX_SHARED_CLIPBOARD_HOST_FN_CANCEL: 1909 /** @todo */ 1910 break; 1911 1912 case VBOX_SHARED_CLIPBOARD_HOST_FN_ERROR: 1913 /** @todo */ 1883 case VBOX_SHARED_CLIPBOARD_HOST_FN_CANCEL: /** @todo Implement this. */ 1884 break; 1885 1886 case VBOX_SHARED_CLIPBOARD_HOST_FN_ERROR: /** @todo Implement this. */ 1914 1887 break; 1915 1888 -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-utils.cpp
r80374 r80444 92 92 } 93 93 94 int vboxSvcClipboardURIReportMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t uMsg, uint32_t uParm) 94 #if 0 95 int vboxSvcClipboardURIReportMsg(PVBOXCLIPBOARDCLIENT pClient, uint32_t uMsg, uint32_t uParm) 95 96 { 96 AssertPtrReturn(pClient Data, VERR_INVALID_POINTER);97 AssertPtrReturn(pClient, VERR_INVALID_POINTER); 97 98 98 99 int rc = VINF_SUCCESS; … … 102 103 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START: 103 104 { 104 Assert(pClient Data->State.URI.fTransferStart == false);105 Assert(pClient->State.URI.fTransferStart == false); 105 106 106 107 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START\n")); … … 113 114 } 114 115 115 pClient Data->State.URI.fTransferStart = true;116 pClient Data->State.URI.enmTransferDir = (SHAREDCLIPBOARDURITRANSFERDIR)uParm;116 pClient->State.URI.fTransferStart = true; 117 pClient->State.URI.enmTransferDir = (SHAREDCLIPBOARDURITRANSFERDIR)uParm; 117 118 break; 118 119 … … 129 130 } 130 131 131 bool vboxSvcClipboardURIReturnMsg(PVBOXCLIPBOARDCLIENT DATA pClientData, uint32_t cParms, VBOXHGCMSVCPARM paParms[])132 bool vboxSvcClipboardURIReturnMsg(PVBOXCLIPBOARDCLIENT pClient, uint32_t cParms, VBOXHGCMSVCPARM paParms[]) 132 133 { 133 RT_NOREF(pClient Data, cParms, paParms);134 RT_NOREF(pClient, cParms, paParms); 134 135 135 136 bool fHandled = false; 136 137 137 if ( pClient Data->State.URI.fTransferStart138 if ( pClient->State.URI.fTransferStart 138 139 && cParms >= 2) 139 140 { 140 141 HGCMSvcSetU32(&paParms[0], VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START); 141 HGCMSvcSetU32(&paParms[1], pClient Data->State.URI.enmTransferDir);142 pClient Data->State.URI.fTransferStart = false;142 HGCMSvcSetU32(&paParms[1], pClient->State.URI.enmTransferDir); 143 pClient->State.URI.fTransferStart = false; 143 144 144 145 fHandled = true; … … 148 149 return fHandled; 149 150 } 151 #endif 150 152 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 151 153 -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-win.cpp
r80374 r80444 55 55 static int vboxClipboardSvcWinSyncInternal(PVBOXCLIPBOARDCONTEXT pCtx); 56 56 57 typedef struct _VBOXCLIPBOARDCONTEXTOLD 58 { 59 /** Event which gets triggered if the host clipboard needs to render its data. */ 60 RTSEMEVENT hRenderEvent; 61 } VBOXCLIPBOARDCONTEXTOLD; 62 57 63 struct _VBOXCLIPBOARDCONTEXT 58 64 { 59 65 /** Handle for window message handling thread. */ 60 66 RTTHREAD hThread; 61 /** Event which gets triggered if the host clipboard needs to render its data. */ 62 RTSEMEVENT hRenderEvent; 63 /** Structure for keeping and communicating with client data (from the guest). */ 64 PVBOXCLIPBOARDCLIENTDATA pClientData; 67 /** Structure for keeping and communicating with service client. */ 68 PVBOXCLIPBOARDCLIENT pClient; 65 69 /** Windows-specific context data. */ 66 70 VBOXCLIPBOARDWINCTX Win; 71 /** Old cruft, needed for the legacy protocol (v0). */ 72 VBOXCLIPBOARDCONTEXTOLD Old; 67 73 }; 68 74 … … 116 122 } 117 123 124 static int vboxClipboardSvcWinDataSet(PVBOXCLIPBOARDCONTEXT pCtx, UINT cfFormat, void *pvData, uint32_t cbData) 125 { 126 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 127 AssertPtrReturn(pvData, VERR_INVALID_POINTER); 128 AssertReturn (cbData, VERR_INVALID_PARAMETER); 129 130 int rc = VINF_SUCCESS; 131 132 HANDLE hMem = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, cbData); 133 134 LogFlowFunc(("hMem=%p\n", hMem)); 135 136 if (hMem) 137 { 138 void *pMem = GlobalLock(hMem); 139 140 LogFlowFunc(("pMem=%p, GlobalSize=%zu\n", pMem, GlobalSize(hMem))); 141 142 if (pMem) 143 { 144 LogFlowFunc(("Setting data\n")); 145 146 memcpy(pMem, pvData, cbData); 147 148 /* The memory must be unlocked before inserting to the Clipboard. */ 149 GlobalUnlock(hMem); 150 151 /* 'hMem' contains the host clipboard data. 152 * size is 'cb' and format is 'format'. 153 */ 154 HANDLE hClip = SetClipboardData(cfFormat, hMem); 155 156 LogFlowFunc(("hClip=%p\n", hClip)); 157 158 if (hClip) 159 { 160 /* The hMem ownership has gone to the system. Nothing to do. */ 161 } 162 else 163 rc = RTErrConvertFromWin32(GetLastError()); 164 } 165 else 166 rc = VERR_ACCESS_DENIED; 167 168 GlobalFree(hMem); 169 } 170 else 171 rc = RTErrConvertFromWin32(GetLastError()); 172 173 LogFlowFuncLeaveRC(rc); 174 return rc; 175 } 176 118 177 /** 119 * Requests data of a specific format from the guest, optionally waiting for its arrival via VBoxClipboardSvcImplWriteData(). 178 * Requests data of a specific format from the guest, optionally waiting for its arrival via VBoxClipboardSvcImplWriteData() 179 * and copying the retrieved data into the OS' clipboard. 180 * 181 * Legacy protocol, do not use anymore. 120 182 * 121 183 * @returns VBox status code. 122 184 * @param pCtx Clipboard context to use. 123 * @param fFormat Format to receive data in.185 * @param cfFormat Windows clipboard format to receive data in. 124 186 * @param uTimeoutMs Timeout (in ms) to wait until the render event has been triggered. 125 187 * Specify 0 if no waiting is required. 126 188 */ 127 static int vboxClipboardSvcWinRequestData(PVBOXCLIPBOARDCONTEXT pCtx, VBOXCLIPBOARDFORMAT fFormat, 128 RTMSINTERVAL uTimeoutMs) 129 { 130 AssertPtr(pCtx->pClientData); 131 Assert(pCtx->hRenderEvent); 132 Assert(pCtx->pClientData->State.data.pv == NULL && pCtx->pClientData->State.data.cb == 0 && pCtx->pClientData->State.data.u32Format == 0); 133 134 LogFlowFunc(("fFormat=%02X, uTimeoutMs=%RU32\n", fFormat, uTimeoutMs)); 135 136 int rc = vboxSvcClipboardReportMsg(pCtx->pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, fFormat); 189 static int vboxClipboardSvcWinOldRequestData(PVBOXCLIPBOARDCONTEXT pCtx, UINT cfFormat, 190 RTMSINTERVAL uTimeoutMs) 191 { 192 Assert(pCtx->Old.hRenderEvent); 193 Assert(pCtx->pClient->State.Old.data.pv == NULL && pCtx->pClient->State.Old.data.cb == 0 && pCtx->pClient->State.Old.data.u32Format == 0); 194 195 LogFlowFunc(("cfFormat=%u, uTimeoutMs=%RU32\n", cfFormat, uTimeoutMs)); 196 197 const VBOXCLIPBOARDFORMAT fFormat = VBoxClipboardWinClipboardFormatToVBox(cfFormat); 198 199 int rc = vboxSvcClipboardOldReportMsg(pCtx->pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, fFormat); 137 200 if ( RT_SUCCESS(rc) 138 201 && uTimeoutMs) 139 202 { 140 rc = RTSemEventWait(pCtx->hRenderEvent, uTimeoutMs /* Timeout in ms */); 141 } 203 rc = RTSemEventWait(pCtx->Old.hRenderEvent, uTimeoutMs /* Timeout in ms */); 204 if (RT_SUCCESS(rc)) 205 { 206 LogFlowFunc(("rc=%Rrc, pv=%p, cb=%RU32, u32Format=%RU32\n", 207 rc, pCtx->pClient->State.Old.data.pv, pCtx->pClient->State.Old.data.cb, 208 pCtx->pClient->State.Old.data.u32Format)); 209 210 if ( RT_SUCCESS (rc) 211 && pCtx->pClient->State.Old.data.pv != NULL 212 && pCtx->pClient->State.Old.data.cb > 0 213 && pCtx->pClient->State.Old.data.u32Format == fFormat) 214 { 215 rc = vboxClipboardSvcWinDataSet(pCtx, cfFormat, 216 pCtx->pClient->State.Old.data.pv, pCtx->pClient->State.Old.data.cb); 217 218 if (pCtx->pClient->State.Old.data.pv) 219 { 220 RTMemFree(pCtx->pClient->State.Old.data.pv); 221 pCtx->pClient->State.Old.data.pv = NULL; 222 } 223 } 224 225 if (RT_FAILURE(rc)) 226 { 227 if (pCtx->pClient->State.Old.data.pv) 228 { 229 RTMemFree(pCtx->pClient->State.Old.data.pv); 230 pCtx->pClient->State.Old.data.pv = NULL; 231 } 232 233 pCtx->pClient->State.Old.data.cb = 0; 234 pCtx->pClient->State.Old.data.u32Format = 0; 235 236 /* Something went wrong. */ 237 VBoxClipboardWinClear(); 238 } 239 } 240 } 241 242 LogFlowFuncLeaveRC(rc); 243 return rc; 244 } 245 246 static int vboxClipboardSvcWinDataRead(PVBOXCLIPBOARDCONTEXT pCtx, UINT cfFormat, 247 void **ppvData, uint32_t *pcbData) 248 { 249 LogFlowFunc(("cfFormat=%u\n", cfFormat)); 250 251 int rc; 252 253 PVBOXCLIPBOARDCLIENTMSG pMsgReadData = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, 254 VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA); 255 if (pMsgReadData) 256 { 257 const uint16_t uEvent = SharedClipboardEventIDGenerate(&pCtx->pClient->Events); 258 259 const VBOXCLIPBOARDFORMAT fFormat = VBoxClipboardWinClipboardFormatToVBox(cfFormat); 260 const uint32_t uCID = VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pClient->Events.uID, uEvent); 261 262 HGCMSvcSetU32(&pMsgReadData->m_paParms[0], uCID); 263 HGCMSvcSetU32(&pMsgReadData->m_paParms[1], fFormat); 264 HGCMSvcSetU32(&pMsgReadData->m_paParms[2], pCtx->pClient->State.cbChunkSize); 265 266 LogFlowFunc(("CID=%RU32\n", uCID)); 267 268 rc = vboxSvcClipboardMsgAdd(pCtx->pClient, pMsgReadData, true /* fAppend */); 269 if (RT_SUCCESS(rc)) 270 { 271 int rc2 = SharedClipboardEventRegister(&pCtx->pClient->Events, uEvent); 272 AssertRC(rc2); 273 274 rc = vboxSvcClipboardClientWakeup(pCtx->pClient); 275 if (RT_SUCCESS(rc)) 276 { 277 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 278 rc = SharedClipboardEventWait(&pCtx->pClient->Events, uEvent, 279 30 * 1000, &pPayload); 280 if (RT_SUCCESS(rc)) 281 { 282 *ppvData = pPayload->pvData; 283 *pcbData = pPayload->cbData; 284 285 /* Detach the payload, as the caller then will own the data. */ 286 SharedClipboardEventPayloadDetach(&pCtx->pClient->Events, uEvent); 287 } 288 } 289 290 SharedClipboardEventUnregister(&pCtx->pClient->Events, uEvent); 291 } 292 } 293 else 294 rc = VERR_NO_MEMORY; 142 295 143 296 LogFlowFuncLeaveRC(rc); … … 167 320 int rc = vboxClipboardSvcWinSyncInternal(pCtx); 168 321 if (RT_SUCCESS(rc)) 169 vboxSvcClipboardSetSource(pCtx->pClientData, SHAREDCLIPBOARDSOURCE_LOCAL); 170 } 171 } break; 322 vboxSvcClipboardSetSource(pCtx->pClient, SHAREDCLIPBOARDSOURCE_LOCAL); 323 } 324 325 break; 326 } 172 327 173 328 case WM_CHANGECBCHAIN: … … 175 330 LogFunc(("WM_CHANGECBCHAIN\n")); 176 331 lresultRc = VBoxClipboardWinHandleWMChangeCBChain(pWinCtx, hWnd, uMsg, wParam, lParam); 177 } break; 332 break; 333 } 178 334 179 335 case WM_DRAWCLIPBOARD: … … 186 342 int rc = vboxClipboardSvcWinSyncInternal(pCtx); 187 343 if (RT_SUCCESS(rc)) 188 vboxSvcClipboardSetSource(pCtx->pClient Data, SHAREDCLIPBOARDSOURCE_LOCAL);344 vboxSvcClipboardSetSource(pCtx->pClient, SHAREDCLIPBOARDSOURCE_LOCAL); 189 345 } 190 346 191 347 lresultRc = VBoxClipboardWinChainPassToNext(pWinCtx, uMsg, wParam, lParam); 192 193 } break;348 break; 349 } 194 350 195 351 case WM_TIMER: … … 197 353 int rc = VBoxClipboardWinHandleWMTimer(pWinCtx); 198 354 AssertRC(rc); 199 } break; 355 356 break; 357 } 200 358 201 359 case WM_RENDERFORMAT: … … 211 369 212 370 if ( fFormat == VBOX_SHARED_CLIPBOARD_FMT_NONE 213 || pCtx->pClient Data== NULL)371 || pCtx->pClient == NULL) 214 372 { 215 373 /* Unsupported clipboard format is requested. */ … … 219 377 else 220 378 { 221 int rc = vboxClipboardSvcWinRequestData(pCtx, fFormat, 30 * 1000 /* 30s timeout */); 222 223 LogFlowFunc(("rc=%Rrc, pv=%p, cb=%RU32, u32Format=%RU32\n", 224 rc, pCtx->pClientData->State.data.pv, pCtx->pClientData->State.data.cb, 225 pCtx->pClientData->State.data.u32Format)); 226 227 if ( RT_SUCCESS (rc) 228 && pCtx->pClientData->State.data.pv != NULL 229 && pCtx->pClientData->State.data.cb > 0 230 && pCtx->pClientData->State.data.u32Format == fFormat) 231 { 232 HANDLE hMem = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, pCtx->pClientData->State.data.cb); 233 234 LogFlowFunc(("hMem=%p\n", hMem)); 235 236 if (hMem) 379 int rc; 380 381 if (pCtx->pClient->State.uProtocolVer == 0) 382 { 383 rc = vboxClipboardSvcWinOldRequestData(pCtx, cfFormat, 30 * 1000 /* 30s timeout */); 384 } 385 else 386 { 387 void *pvData = NULL; 388 uint32_t cbData = 0; 389 rc = vboxClipboardSvcWinDataRead(pCtx, cfFormat, &pvData, &cbData); 390 if ( RT_SUCCESS(rc) 391 && pvData 392 && cbData) 237 393 { 238 void *pMem = GlobalLock(hMem); 239 240 LogFlowFunc(("pMem=%p, GlobalSize=%zu\n", pMem, GlobalSize(hMem))); 241 242 if (pMem) 243 { 244 LogFlowFunc(("WM_RENDERFORMAT: Setting data\n")); 245 246 if (pCtx->pClientData->State.data.pv) 247 { 248 memcpy(pMem, pCtx->pClientData->State.data.pv, pCtx->pClientData->State.data.cb); 249 250 RTMemFree(pCtx->pClientData->State.data.pv); 251 pCtx->pClientData->State.data.pv = NULL; 252 } 253 254 pCtx->pClientData->State.data.cb = 0; 255 pCtx->pClientData->State.data.u32Format = 0; 256 257 /* The memory must be unlocked before inserting to the Clipboard. */ 258 GlobalUnlock(hMem); 259 260 /* 'hMem' contains the host clipboard data. 261 * size is 'cb' and format is 'format'. 262 */ 263 HANDLE hClip = SetClipboardData(cfFormat, hMem); 264 265 LogFlowFunc(("hClip=%p\n", hClip)); 266 267 if (hClip) 268 { 269 /* The hMem ownership has gone to the system. Nothing to do. */ 270 break; 271 } 272 } 273 274 GlobalFree(hMem); 394 rc = vboxClipboardSvcWinDataSet(pCtx, cfFormat, pvData, cbData); 395 396 RTMemFree(pvData); 275 397 } 276 } 277 278 RTMemFree(pCtx->pClientData->State.data.pv); 279 pCtx->pClientData->State.data.pv = NULL; 280 pCtx->pClientData->State.data.cb = 0; 281 pCtx->pClientData->State.data.u32Format = 0; 282 283 /* Something went wrong. */ 284 VBoxClipboardWinClear(); 285 } 286 } break; 398 else 399 AssertFailed(); 400 } 401 } 402 403 break; 404 } 287 405 288 406 case WM_RENDERALLFORMATS: … … 292 410 int rc = VBoxClipboardWinHandleWMRenderAllFormats(pWinCtx, hWnd); 293 411 AssertRC(rc); 294 } break; 412 413 break; 414 } 295 415 296 416 case VBOX_CLIPBOARD_WM_REPORT_FORMATS: … … 298 418 LogFunc(("VBOX_CLIPBOARD_WM_REPORT_FORMATS\n")); 299 419 300 if ( pCtx->pClientData == NULL 301 || pCtx->pClientData->State.fHostMsgFormats) 420 /* Some legcay protocol checks. */ 421 if ( pCtx->pClient->State.uProtocolVer == 0 422 && ( pCtx->pClient == NULL 423 || pCtx->pClient->State.Old.fHostMsgFormats)) 302 424 { 303 425 /* Host has pending formats message. Ignore the guest announcement, 304 426 * because host clipboard has more priority. 305 427 */ 306 LogFunc(("VBOX_CLIPBOARD_WM_REPORT_FORMATS ignored; pClient Data=%p\n", pCtx->pClientData));428 LogFunc(("VBOX_CLIPBOARD_WM_REPORT_FORMATS ignored; pClient=%p\n", pCtx->pClient)); 307 429 break; 308 430 } … … 316 438 { 317 439 VBoxClipboardWinClear(); 318 319 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 440 #if 0 320 441 if (fFormats & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST) 321 442 { 322 443 LogFunc(("VBOX_SHARED_CLIPBOARD_FMT_URI_LIST\n")); 323 444 324 PSHAREDCLIPBOARDURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pCtx->pClient Data->URI,445 PSHAREDCLIPBOARDURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pCtx->pClient->URI, 325 446 0 /* uIdx */); 326 447 if (pTransfer) … … 342 463 343 464 VBoxClipboardWinClose(); 344 #if def VBOX_WITH_SHARED_CLIPBOARD_URI_LIST465 #if 0 345 466 } 346 467 #endif 347 468 } 348 469 349 if (RT_FAILURE(rc))350 LogFunc(("Failed with rc=%Rrc\n", rc));351 } 352 LogFunc(("VBOX_CLIPBOARD_WM_REPORT_FORMATS: fFormats=0x%x, lastErr=%ld\n", fFormats, GetLastError()));353 } break;470 LogFunc(("VBOX_CLIPBOARD_WM_REPORT_FORMATS: fFormats=0x%x, lastErr=%ld\n", fFormats, GetLastError())); 471 } 472 473 break; 474 } 354 475 355 476 case WM_DESTROY: … … 361 482 362 483 PostQuitMessage(0); 363 } break; 484 break; 485 } 364 486 365 487 default: … … 544 666 int rc; 545 667 546 if (pCtx->pClientData) 547 { 548 VBOXCLIPBOARDFORMATS uFormats = VBOX_SHARED_CLIPBOARD_FMT_NONE; 549 rc = VBoxClipboardWinGetFormats(&pCtx->Win, &uFormats); 668 if (pCtx->pClient) 669 { 670 SHAREDCLIPBOARDFORMATDATA Formats; 671 RT_ZERO(Formats); 672 673 rc = VBoxClipboardWinGetFormats(&pCtx->Win, &Formats); 550 674 if ( RT_SUCCESS(rc) 551 && uFormats != VBOX_SHARED_CLIPBOARD_FMT_NONE 552 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 553 /* For URI handling we don't need to sync the format. */ 554 && !(uFormats & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST) 555 #endif 556 ) 557 { 558 vboxSvcClipboardReportMsg(pCtx->pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS, uFormats); 675 && Formats.uFormats != VBOX_SHARED_CLIPBOARD_FMT_NONE) 676 { 677 if (pCtx->pClient->State.uProtocolVer == 0) 678 { 679 rc = vboxSvcClipboardOldReportMsg(pCtx->pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE, Formats.uFormats); 680 } 681 else /* Protocol v1 and up. */ 682 { 683 rc = vboxSvcClipboardSendFormatsWrite(pCtx->pClient, &Formats); 684 } 559 685 } 560 686 } … … 581 707 } 582 708 583 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT DATA pClientData, bool fHeadless)709 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT pClient, bool fHeadless) 584 710 { 585 711 RT_NOREF(fHeadless); 586 587 AssertPtrReturn(pClientData, VERR_INVALID_POINTER);588 712 589 713 LogFlowFuncEnter(); … … 598 722 if (RT_SUCCESS(rc)) 599 723 { 600 rc = RTSemEventCreate(&pCtx-> hRenderEvent);724 rc = RTSemEventCreate(&pCtx->Old.hRenderEvent); 601 725 if (RT_SUCCESS(rc)) 602 726 { … … 611 735 612 736 if (RT_FAILURE(rc)) 613 RTSemEventDestroy(pCtx-> hRenderEvent);614 } 615 616 pClient Data->State.pCtx = pCtx;617 pClient Data->State.pCtx->pClientData = pClientData;737 RTSemEventDestroy(pCtx->Old.hRenderEvent); 738 } 739 740 pClient->State.pCtx = pCtx; 741 pClient->State.pCtx->pClient = pClient; 618 742 619 743 /* Sync the host clipboard content with the client. */ 620 rc = VBoxClipboardSvcImplSync(pClient Data);744 rc = VBoxClipboardSvcImplSync(pClient); 621 745 } 622 746 else … … 627 751 } 628 752 629 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT DATA pClientData)753 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT pClient) 630 754 { 631 755 /* Sync the host clipboard content with the client. */ 632 return vboxClipboardSvcWinSyncInternal(pClient Data->State.pCtx);633 } 634 635 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT DATA pClientData)636 { 637 AssertPtrReturn(pClient Data, VERR_INVALID_POINTER);756 return vboxClipboardSvcWinSyncInternal(pClient->State.pCtx); 757 } 758 759 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT pClient) 760 { 761 AssertPtrReturn(pClient, VERR_INVALID_POINTER); 638 762 639 763 LogFlowFuncEnter(); … … 641 765 int rc = VINF_SUCCESS; 642 766 643 PVBOXCLIPBOARDCONTEXT pCtx = pClient Data->State.pCtx;767 PVBOXCLIPBOARDCONTEXT pCtx = pClient->State.pCtx; 644 768 if (pCtx) 645 769 { … … 647 771 PostMessage(pCtx->Win.hWnd, WM_DESTROY, 0 /* wParam */, 0 /* lParam */); 648 772 649 rc = RTSemEventDestroy(pCtx-> hRenderEvent);773 rc = RTSemEventDestroy(pCtx->Old.hRenderEvent); 650 774 if (RT_SUCCESS(rc)) 651 775 { … … 668 792 pCtx = NULL; 669 793 670 pClient Data->State.pCtx = NULL;794 pClient->State.pCtx = NULL; 671 795 } 672 796 } … … 676 800 } 677 801 678 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Formats) 679 { 680 AssertPtrReturn(pClientData, VERR_INVALID_POINTER); 681 682 PVBOXCLIPBOARDCONTEXT pCtx = pClientData->State.pCtx; 802 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, 803 PSHAREDCLIPBOARDFORMATDATA pFormats) 804 { 805 AssertPtrReturn(pClient, VERR_INVALID_POINTER); 806 RT_NOREF(pCmdCtx); 807 808 PVBOXCLIPBOARDCONTEXT pCtx = pClient->State.pCtx; 683 809 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 684 810 685 LogFlowFunc(("u 32Formats=0x%x, hWnd=%p\n", u32Formats, pCtx->Win.hWnd));811 LogFlowFunc(("uFormats=0x%x, hWnd=%p\n", pFormats->uFormats, pCtx->Win.hWnd)); 686 812 687 813 /* … … 689 815 */ 690 816 PostMessage(pCtx->Win.hWnd, VBOX_CLIPBOARD_WM_REPORT_FORMATS, 691 0 /* wParam */, u32Formats /* lParam */);817 0 /* wParam */, pFormats->uFormats /* lParam */); 692 818 693 819 return VINF_SUCCESS; 694 820 } 695 821 696 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Format, void *pv, uint32_t cb, 697 uint32_t *pcbActual) 698 { 699 AssertPtrReturn(pClientData, VERR_INVALID_POINTER); 700 AssertPtrReturn(pClientData->State.pCtx, VERR_INVALID_POINTER); 701 702 LogFlowFunc(("u32Format=%02X\n", u32Format)); 822 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, 823 PSHAREDCLIPBOARDDATABLOCK pData, uint32_t *pcbActual) 824 { 825 AssertPtrReturn(pClient, VERR_INVALID_POINTER); 826 RT_NOREF(pCmdCtx); 827 AssertPtrReturn(pClient->State.pCtx, VERR_INVALID_POINTER); 828 829 LogFlowFunc(("uFormat=%02X\n", pData->uFormat)); 703 830 704 831 HANDLE hClip = NULL; 705 832 706 const PVBOXCLIPBOARDWINCTX pWinCtx = &pClient Data->State.pCtx->Win;833 const PVBOXCLIPBOARDWINCTX pWinCtx = &pClient->State.pCtx->Win; 707 834 708 835 /* … … 714 841 LogFunc(("Clipboard opened\n")); 715 842 716 if ( u32Format & VBOX_SHARED_CLIPBOARD_FMT_BITMAP)843 if (pData->uFormat & VBOX_SHARED_CLIPBOARD_FMT_BITMAP) 717 844 { 718 845 hClip = GetClipboardData(CF_DIB); … … 726 853 727 854 vboxClipboardGetData(VBOX_SHARED_CLIPBOARD_FMT_BITMAP, lp, GlobalSize(hClip), 728 p v, cb, pcbActual);855 pData->pvData, pData->cbData, pcbActual); 729 856 730 857 GlobalUnlock(hClip); … … 736 863 } 737 864 } 738 else if ( u32Format & VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT)865 else if (pData->uFormat & VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT) 739 866 { 740 867 hClip = GetClipboardData(CF_UNICODETEXT); … … 748 875 749 876 vboxClipboardGetData(VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT, uniString, (lstrlenW(uniString) + 1) * 2, 750 p v, cb, pcbActual);877 pData->pvData, pData->cbData, pcbActual); 751 878 752 879 GlobalUnlock(hClip); … … 758 885 } 759 886 } 760 else if ( u32Format & VBOX_SHARED_CLIPBOARD_FMT_HTML)887 else if (pData->uFormat & VBOX_SHARED_CLIPBOARD_FMT_HTML) 761 888 { 762 889 UINT format = RegisterClipboardFormat(VBOX_CLIPBOARD_WIN_REGFMT_HTML); … … 771 898 /** @todo r=andy Add data overflow handling. */ 772 899 vboxClipboardGetData(VBOX_SHARED_CLIPBOARD_FMT_HTML, lp, GlobalSize(hClip), 773 p v, cb, pcbActual);900 pData->pvData, pData->cbData, pcbActual); 774 901 #ifdef VBOX_STRICT 775 902 LogFlowFunc(("Raw HTML clipboard data from host:")); 776 VBoxClipboardDbgDumpHtml((char *)p v, cb);903 VBoxClipboardDbgDumpHtml((char *)pData->pvData, pData->cbData); 777 904 #endif 778 905 GlobalUnlock(hClip); … … 786 913 } 787 914 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 788 else if ( u32Format & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST)915 else if (pData->uFormat & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST) 789 916 { 790 917 AssertFailed(); /** @todo */ … … 797 924 { 798 925 /* Reply with empty data. */ 799 vboxClipboardGetData(0, NULL, 0, p v, cb, pcbActual);926 vboxClipboardGetData(0, NULL, 0, pData->pvData, pData->cbData, pcbActual); 800 927 } 801 928 … … 804 931 } 805 932 806 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENTDATA pClientData, void *pv, uint32_t cb, uint32_t u32Format) 933 static int vboxClipboardSvcWinOldWriteData(PVBOXCLIPBOARDCLIENT pClient, 934 void *pv, uint32_t cb, uint32_t u32Format) 807 935 { 808 936 LogFlowFuncEnter(); 937 938 const PVBOXCLIPBOARDCLIENTSTATE pState = &pClient->State; 809 939 810 940 /* 811 941 * The guest returns data that was requested in the WM_RENDERFORMAT handler. 812 942 */ 813 Assert(pClientData->State.data.pv == NULL && pClientData->State.data.cb == 0 && pClientData->State.data.u32Format == 0); 943 Assert( pState->Old.data.pv == NULL 944 && pState->Old.data.cb == 0 945 && pState->Old.data.u32Format == 0); 814 946 815 947 #ifdef LOG_ENABLED … … 831 963 if (pszResult != NULL && cbResult != 0) 832 964 { 833 p ClientData->State.data.pv = pszResult;834 p ClientData->State.data.cb = cbResult;835 p ClientData->State.data.u32Format = u32Format;965 pState->Old.data.pv = pszResult; 966 pState->Old.data.cb = cbResult; 967 pState->Old.data.u32Format = u32Format; 836 968 } 837 969 } … … 839 971 else 840 972 { 841 p ClientData->State.data.pv = RTMemDup(pv, cb);842 if (p ClientData->State.data.pv)843 { 844 p ClientData->State.data.cb = cb;845 p ClientData->State.data.u32Format = u32Format;846 } 847 } 848 } 849 850 AssertPtr(p ClientData->State.pCtx);851 int rc = RTSemEventSignal(p ClientData->State.pCtx->hRenderEvent);973 pState->Old.data.pv = RTMemDup(pv, cb); 974 if (pState->Old.data.pv) 975 { 976 pState->Old.data.cb = cb; 977 pState->Old.data.u32Format = u32Format; 978 } 979 } 980 } 981 982 AssertPtr(pState->pCtx); 983 int rc = RTSemEventSignal(pState->pCtx->Old.hRenderEvent); 852 984 AssertRC(rc); 853 985 … … 856 988 } 857 989 990 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, 991 PSHAREDCLIPBOARDDATABLOCK pData) 992 { 993 LogFlowFuncEnter(); 994 995 int rc; 996 997 if (pClient->State.uProtocolVer == 0) 998 { 999 rc = vboxClipboardSvcWinOldWriteData(pClient, pData->pvData, pData->cbData, pData->uFormat); 1000 } 1001 else 1002 { 1003 const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(pCmdCtx->uContextID); 1004 1005 PSHAREDCLIPBOARDEVENTPAYLOAD pPayload; 1006 rc = SharedClipboardPayloadAlloc(uEvent, pData->pvData, pData->cbData, &pPayload); 1007 if (RT_SUCCESS(rc)) 1008 { 1009 rc = SharedClipboardEventSignal(&pClient->Events, uEvent, pPayload); 1010 if (RT_FAILURE(rc)) 1011 SharedClipboardPayloadFree(pPayload); 1012 } 1013 } 1014 1015 LogFlowFuncLeaveRC(rc); 1016 return rc; 1017 } 1018 858 1019 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 859 int VBoxClipboardSvcImplURITransferCreate(PVBOXCLIPBOARDCLIENT DATA pClientData, PSHAREDCLIPBOARDURITRANSFER pTransfer)860 { 861 RT_NOREF(pClient Data, pTransfer);1020 int VBoxClipboardSvcImplURITransferCreate(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDURITRANSFER pTransfer) 1021 { 1022 RT_NOREF(pClient, pTransfer); 862 1023 863 1024 LogFlowFuncEnter(); … … 866 1027 } 867 1028 868 int VBoxClipboardSvcImplURITransferDestroy(PVBOXCLIPBOARDCLIENT DATA pClientData, PSHAREDCLIPBOARDURITRANSFER pTransfer)1029 int VBoxClipboardSvcImplURITransferDestroy(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDURITRANSFER pTransfer) 869 1030 { 870 1031 LogFlowFuncEnter(); 871 1032 872 VBoxClipboardWinURITransferDestroy(&pClient Data->State.pCtx->Win, pTransfer);1033 VBoxClipboardWinURITransferDestroy(&pClient->State.pCtx->Win, pTransfer); 873 1034 874 1035 return VINF_SUCCESS; -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-x11-stubs.cpp
r79036 r80444 54 54 * Enable the shared clipboard - called by the hgcm clipboard subsystem. 55 55 * 56 * @param pClientData Structure containing context information about the guest system57 * @param fHeadless Whether headless.58 56 * @returns RT status code 57 * @param pClient Structure containing context information about the guest system 58 * @param fHeadless Whether headless. 59 59 */ 60 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT DATA pClientData, bool fHeadless)60 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT pClient, bool fHeadless) 61 61 { 62 RT_NOREF(pClient Data, fHeadless);62 RT_NOREF(pClient, fHeadless); 63 63 LogFlowFunc(("called, returning VINF_SUCCESS\n")); 64 64 return VINF_SUCCESS; … … 69 69 * after a save and restore of the guest. 70 70 */ 71 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT DATA /* pClientData */)71 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT pClient) 72 72 { 73 RT_NOREF(pClient); 73 74 LogFlowFunc(("called, returning VINF_SUCCESS\n")); 74 75 return VINF_SUCCESS; … … 78 79 * Shut down the shared clipboard subsystem and "disconnect" the guest. 79 80 * 80 * @param pClient DataStructure containing context information about the guest system81 * @param pClient Structure containing context information about the guest system 81 82 */ 82 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT DATA pClientData)83 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT pClient) 83 84 { 84 RT_NOREF(pClient Data);85 RT_NOREF(pClient); 85 86 return VINF_SUCCESS; 86 87 } … … 90 91 * subsystem. 91 92 * 92 * @param pClientData Context data for the guest system 93 * @param u32Formats Clipboard formats the guest is offering 93 * @param pClient Context data for the guest system. 94 * @param pCmdCtx Command context to use. 95 * @param pFormats Clipboard formats the guest is offering. 94 96 */ 95 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Formats) 97 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, 98 PSHAREDCLIPBOARDFORMATDATA pFormats) 96 99 { 97 RT_NOREF(pClient Data, u32Formats);100 RT_NOREF(pClient, pCmdCtx, pFormats); 98 101 return VINF_SUCCESS; 99 102 } … … 102 105 * Called by the HGCM clipboard subsystem when the guest wants to read the host clipboard. 103 106 * 104 * @param pClientData Context information about the guest VM 105 * @param u32Format The format that the guest would like to receive the data in 106 * @param pv Where to write the data to 107 * @param cb The size of the buffer to write the data to 108 * @param pcbActual Where to write the actual size of the written data 107 * @param pClient Context information about the guest VM 108 * @param pCmdCtx Command context to use. 109 * @param pData Data block to put read data into. 109 110 */ 110 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENT DATA pClientData, uint32_t u32Format,111 void *pv, uint32_t cb, uint32_t *pcbActual)111 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, 112 PSHAREDCLIPBOARDDATABLOCK pData, uint32_t *pcbActual) 112 113 { 113 RT_NOREF(pClient Data, u32Format, pv, cb);114 LogFlowFunc(("called, returning VINF_SUCCESS\n")); 114 RT_NOREF(pClient, pCmdCtx, pData); 115 115 116 /* No data available. */ 116 117 *pcbActual = 0; 118 117 119 return VINF_SUCCESS; 118 120 } 119 121 120 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENT DATA pClientData, void *pv, uint32_t cb,121 uint32_t u32Format)122 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, 123 PSHAREDCLIPBOARDDATABLOCK pData) 122 124 { 123 RT_NOREF(pClient Data, pv, cb, u32Format);125 RT_NOREF(pClient, pCmdCtx, pData); 124 126 return VERR_NOT_IMPLEMENTED; 125 127 } 126 128 127 129 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 128 int VBoxClipboardSvcImplURIReadDir(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDDIRDATA pDirData)130 int VBoxClipboardSvcImplURIReadDir(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDDIRDATA pDirData) 129 131 { 130 RT_NOREF(pClient Data, pDirData);132 RT_NOREF(pClient, pDirData); 131 133 return VERR_NOT_IMPLEMENTED; 132 134 } 133 135 134 int VBoxClipboardSvcImplURIWriteDir(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDDIRDATA pDirData)136 int VBoxClipboardSvcImplURIWriteDir(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDDIRDATA pDirData) 135 137 { 136 RT_NOREF(pClient Data, pDirData);138 RT_NOREF(pClient, pDirData); 137 139 return VERR_NOT_IMPLEMENTED; 138 140 } 139 141 140 int VBoxClipboardSvcImplURIReadFileHdr(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEHDR pFileHdr)142 int VBoxClipboardSvcImplURIReadFileHdr(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEHDR pFileHdr) 141 143 { 142 RT_NOREF(pClient Data, pFileHdr);144 RT_NOREF(pClient, pFileHdr); 143 145 return VERR_NOT_IMPLEMENTED; 144 146 } 145 147 146 int VBoxClipboardSvcImplURIWriteFileHdr(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEHDR pFileHdr)148 int VBoxClipboardSvcImplURIWriteFileHdr(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEHDR pFileHdr) 147 149 { 148 RT_NOREF(pClient Data, pFileHdr);150 RT_NOREF(pClient, pFileHdr); 149 151 return VERR_NOT_IMPLEMENTED; 150 152 } 151 153 152 int VBoxClipboardSvcImplURIReadFileData(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEDATA pFileData)154 int VBoxClipboardSvcImplURIReadFileData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEDATA pFileData) 153 155 { 154 RT_NOREF(pClient Data, pFileData);156 RT_NOREF(pClient, pFileData); 155 157 return VERR_NOT_IMPLEMENTED; 156 158 } 157 159 158 int VBoxClipboardSvcImplURIWriteFileData(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEDATA pFileData)160 int VBoxClipboardSvcImplURIWriteFileData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEDATA pFileData) 159 161 { 160 RT_NOREF(pClient Data, pFileData);162 RT_NOREF(pClient, pFileData); 161 163 return VERR_NOT_IMPLEMENTED; 162 164 } -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-x11.cpp
r79174 r80444 59 59 CLIPBACKEND *pBackend; 60 60 /** Pointer to the VBox host client data structure. */ 61 PVBOXCLIPBOARDCLIENT DATA pClientData;61 PVBOXCLIPBOARDCLIENT pClient; 62 62 /** We set this when we start shutting down as a hint not to post any new 63 63 * requests. */ … … 77 77 LogFlowFunc(("pCtx=%p, u32Formats=%02X\n", pCtx, u32Formats)); 78 78 79 vboxSvcClipboard ReportMsg(pCtx->pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS, u32Formats);79 vboxSvcClipboardOldReportMsg(pCtx->pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE, u32Formats); 80 80 } 81 81 … … 104 104 * the clipboard and leave ownership to X11. 105 105 */ 106 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT DATA pClientData, bool fHeadless)106 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT pClient, bool fHeadless) 107 107 { 108 108 int rc = VINF_SUCCESS; … … 126 126 { 127 127 pCtx->pBackend = pBackend; 128 pClient Data->State.pCtx = pCtx;129 pCtx->pClient Data = pClientData;128 pClient->State.pCtx = pCtx; 129 pCtx->pClient = pClient; 130 130 131 131 rc = ClipStartX11(pBackend, true /* grab shared clipboard */); … … 153 153 * @note Host glue code 154 154 */ 155 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT DATA pClientData)155 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT pClient) 156 156 { 157 157 LogFlowFuncEnter(); … … 160 160 * there is data in the host clipboard it will automatically be sent to 161 161 * the guest when the clipboard starts up. */ 162 return vboxSvcClipboard ReportMsg(pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS, 0);162 return vboxSvcClipboardOldReportMsg(pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE, 0); 163 163 } 164 164 … … 167 167 * @note Host glue code 168 168 */ 169 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT DATA pClientData)169 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT pClient) 170 170 { 171 171 LogFlowFuncEnter(); … … 173 173 LogRel(("Stopping the host clipboard service\n")); 174 174 175 PVBOXCLIPBOARDCONTEXT pCtx = pClient Data->State.pCtx;175 PVBOXCLIPBOARDCONTEXT pCtx = pClient->State.pCtx; 176 176 177 177 /* Drop the reference to the client, in case it is still there. This … … 181 181 182 182 /* If there is a currently pending request, release it immediately. */ 183 VBoxClipboardSvcImplWriteData(pClientData, NULL, 0, 0); 183 SHAREDCLIPBOARDDATABLOCK dataBlock = { 0, NULL, 0 }; 184 VBoxClipboardSvcImplWriteData(pClient, NULL, &dataBlock); 184 185 185 186 int rc = ClipStopX11(pCtx->pBackend); … … 202 203 * VBox is taking possession of the shared clipboard. 203 204 * 204 * @param pClientData Context data for the guest system 205 * @param u32Formats Clipboard formats the guest is offering 206 * @note Host glue code 207 */ 208 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Formats) 209 { 210 LogFlowFunc(("pClientData=%p, u32Formats=%02X\n", pClientData, u32Formats)); 211 212 ClipAnnounceFormatToX11(pClientData->State.pCtx->pBackend, u32Formats); 205 * @param pClient Context data for the guest system. 206 * @param pCmdCtx Command context to use. 207 * @param pFormats Clipboard formats the guest is offering. 208 */ 209 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, 210 PSHAREDCLIPBOARDFORMATDATA pFormats) 211 { 212 RT_NOREF(pCmdCtx); 213 214 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 215 if (pFormats->uFormats & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST) /* No URI support yet. */ 216 return VINF_SUCCESS; 217 #endif 218 219 ClipAnnounceFormatToX11(pClient->State.pCtx->pBackend, pFormats->uFormats); 213 220 214 221 return VINF_SUCCESS; … … 233 240 * asynchronously 234 241 * @returns iprt status code on failure 235 * @param pClientData Context information about the guest VM 236 * @param u32Format The format that the guest would like to receive the data in 237 * @param pv Where to write the data to 238 * @param cb The size of the buffer to write the data to 239 * @param pcbActual Where to write the actual size of the written data 240 * 241 * @note We always fail or complete asynchronously 242 * 243 * @param pClient Context information about the guest VM 244 * @param pData Data block to put read data into. 245 * @param pcbActual Where to write the actual size of the written data 246 * 247 * @note We always fail or complete asynchronously. 242 248 * @note On success allocates a CLIPREADCBREQ structure which must be 243 249 * freed in ClipCompleteDataRequestFromX11 when it is called back from … … 245 251 * 246 252 */ 247 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENT DATA pClientData,248 uint32_t u32Format, void *pv, uint32_t cb, uint32_t *pcbActual)249 { 250 LogFlowFunc(("pClient Data=%p, u32Format=%02X, pv=%p, cb=%u, pcbActual=%p\n",251 pClient Data, u32Format, pv, cb, pcbActual));253 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENT pClient, 254 PSHAREDCLIPBOARDDATABLOCK pData, uint32_t *pcbActual) 255 { 256 LogFlowFunc(("pClient=%p, uFormat=%02X, pv=%p, cb=%u, pcbActual=%p\n", 257 pClient, pData->uFormat, pData->pvData, pData->cbData, pcbActual)); 252 258 253 259 int rc = VINF_SUCCESS; 260 254 261 CLIPREADCBREQ *pReq = (CLIPREADCBREQ *)RTMemAlloc(sizeof(CLIPREADCBREQ)); 255 262 if (!pReq) … … 259 266 else 260 267 { 261 pReq->pv = p v;262 pReq->cb = cb;268 pReq->pv = pData->pvData; 269 pReq->cb = pData->cbData; 263 270 pReq->pcbActual = pcbActual; 264 rc = ClipRequestDataFromX11(pClient Data->State.pCtx->pBackend, u32Format, pReq);271 rc = ClipRequestDataFromX11(pClient->State.pCtx->pBackend, pData->uFormat, pReq); 265 272 if (RT_SUCCESS(rc)) 266 273 rc = VINF_HGCM_ASYNC_EXECUTE; … … 291 298 RTMemFree(pReq); 292 299 293 vboxSvcClipboard CompleteReadData(pCtx->pClientData, rc, cb);300 vboxSvcClipboardOldCompleteReadData(pCtx->pClient, rc, cb); 294 301 } 295 302 … … 317 324 318 325 /* Request data from VBox */ 319 vboxSvcClipboard ReportMsg(pCtx->pClientData,326 vboxSvcClipboardOldReportMsg(pCtx->pClient, 320 327 VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, 321 328 u32Format); … … 421 428 * Called when we have requested data from VBox and that data has arrived. 422 429 * 423 * @param pClientData Context information about the guest VM424 * @param pv Buffer to which the data was written425 * @param cb The size of the data written426 * @param u32Format The format of the data written 427 * @note Host glue code428 */ 429 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENTDATA pClientData, 430 void *pv, uint32_t cb, uint32_t u32Format) 431 { 432 LogFlowFunc(("pClientData=%p, pv=%p (%.*ls), cb=%u, u32Format=%02X\n", pClientData, pv, cb / 2, pv, cb, u32Format));433 434 VBOXCLIPBOARDCONTEXT *pCtx = pClientData->State.pCtx;430 * @param pClient Context information about the guest VM. 431 * @param pData Data block to write to clipboard. 432 */ 433 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENT pClient, 434 PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, PSHAREDCLIPBOARDDATABLOCK pData) 435 { 436 RT_NOREF(pCmdCtx); 437 438 LogFlowFunc(("pClient=%p, pv=%p (%.*ls), cb=%u, uFormat=%02X\n", 439 pClient, pData->pvData, pData->cbData / 2, pData->pvData, pData->cbData, pData->uFormat)); 440 441 PVBOXCLIPBOARDCONTEXT pCtx = pClient->State.pCtx; 435 442 436 443 /* Grab the mutex and check whether there is a pending request for data. */ … … 440 447 if (pReq != NULL) 441 448 { 442 if ( cb> 0)449 if (pData->cbData > 0) 443 450 { 444 pReq->pv = RTMemDup(p v, cb);451 pReq->pv = RTMemDup(pData->pvData, pData->cbData); 445 452 if (pReq->pv != NULL) /* NULL may also mean no memory... */ 446 453 { 447 pReq->cb = cb;448 pReq->format = u32Format;454 pReq->cb = pData->cbData; 455 pReq->format = pData->uFormat; 449 456 } 450 457 } 458 451 459 /* Signal that the request has been completed. */ 452 460 RTSemEventSignal(pReq->finished); … … 459 467 } 460 468 461 #if def VBOX_WITH_SHARED_CLIPBOARD_URI_LIST462 int VBoxClipboardSvcImplURIReadDir(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDDIRDATA pDirData)463 { 464 RT_NOREF(pClient Data, pDirData);469 #if 0 470 int VBoxClipboardSvcImplURIReadDir(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDDIRDATA pDirData) 471 { 472 RT_NOREF(pClient, pDirData); 465 473 return VERR_NOT_IMPLEMENTED; 466 474 } 467 475 468 int VBoxClipboardSvcImplURIWriteDir(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDDIRDATA pDirData)469 { 470 RT_NOREF(pClient Data, pDirData);476 int VBoxClipboardSvcImplURIWriteDir(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDDIRDATA pDirData) 477 { 478 RT_NOREF(pClient, pDirData); 471 479 return VERR_NOT_IMPLEMENTED; 472 480 } 473 481 474 int VBoxClipboardSvcImplURIReadFileHdr(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEHDR pFileHdr)475 { 476 RT_NOREF(pClient Data, pFileHdr);482 int VBoxClipboardSvcImplURIReadFileHdr(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEHDR pFileHdr) 483 { 484 RT_NOREF(pClient, pFileHdr); 477 485 return VERR_NOT_IMPLEMENTED; 478 486 } 479 487 480 int VBoxClipboardSvcImplURIWriteFileHdr(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEHDR pFileHdr)481 { 482 RT_NOREF(pClient Data, pFileHdr);488 int VBoxClipboardSvcImplURIWriteFileHdr(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEHDR pFileHdr) 489 { 490 RT_NOREF(pClient, pFileHdr); 483 491 return VERR_NOT_IMPLEMENTED; 484 492 } 485 493 486 int VBoxClipboardSvcImplURIReadFileData(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEDATA pFileData)487 { 488 RT_NOREF(pClient Data, pFileData);494 int VBoxClipboardSvcImplURIReadFileData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEDATA pFileData) 495 { 496 RT_NOREF(pClient, pFileData); 489 497 return VERR_NOT_IMPLEMENTED; 490 498 } 491 499 492 int VBoxClipboardSvcImplURIWriteFileData(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDFILEDATA pFileData)493 { 494 RT_NOREF(pClient Data, pFileData);500 int VBoxClipboardSvcImplURIWriteFileData(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDFILEDATA pFileData) 501 { 502 RT_NOREF(pClient, pFileData); 495 503 return VERR_NOT_IMPLEMENTED; 496 504 } … … 530 538 }; 531 539 532 int vboxSvcClipboard ReportMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t uMsg, uint32_t uFormats)540 int vboxSvcClipboardOldReportMsg(PVBOXCLIPBOARDCLIENT pClient, uint32_t uMsg, uint32_t uFormats) 533 541 { 534 542 RT_NOREF(uFormats); 535 CLIPBACKEND *pBackend = pClient Data->State.pCtx->pBackend;543 CLIPBACKEND *pBackend = pClient->State.pCtx->pBackend; 536 544 537 545 int rc; … … 540 548 && !pBackend->writeData.timeout) 541 549 { 542 rc = VBoxClipboardSvcImplWriteData(pClient Data, pBackend->writeData.pv, pBackend->writeData.cb, pBackend->writeData.format);550 rc = VBoxClipboardSvcImplWriteData(pClient, pBackend->writeData.pv, pBackend->writeData.cb, pBackend->writeData.format); 543 551 } 544 552 else … … 548 556 } 549 557 550 int vboxSvcClipboard CompleteReadData(PVBOXCLIPBOARDCLIENTDATA pClientData, int rc, uint32_t cbActual)551 { 552 CLIPBACKEND *pBackend = pClient Data->State.pCtx->pBackend;558 int vboxSvcClipboardOldCompleteReadData(PVBOXCLIPBOARDCLIENT pClient, int rc, uint32_t cbActual) 559 { 560 CLIPBACKEND *pBackend = pClient->State.pCtx->pBackend; 553 561 pBackend->completeRead.rc = rc; 554 562 pBackend->completeRead.cbActual = cbActual; -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp
r80374 r80444 201 201 * Prototypes * 202 202 *********************************************************************************************************************************/ 203 static int vboxSvcClipboardClientStateInit(PVBOXCLIPBOARDCLIENT DATA pClientData, uint32_t uClientID);204 static int vboxSvcClipboardClientStateDestroy(PVBOXCLIPBOARDCLIENT DATA pClientData);205 static void vboxSvcClipboardClientStateReset(PVBOXCLIPBOARDCLIENT DATA pClientData);203 static int vboxSvcClipboardClientStateInit(PVBOXCLIPBOARDCLIENTSTATE pClientState, uint32_t uClientID); 204 static int vboxSvcClipboardClientStateDestroy(PVBOXCLIPBOARDCLIENTSTATE pClientState); 205 static void vboxSvcClipboardClientStateReset(PVBOXCLIPBOARDCLIENTSTATE pClientState); 206 206 207 207 … … 232 232 ClipboardClientQueue g_listClientsDeferred; 233 233 234 235 static int VBoxHGCMParmPtrGet(VBOXHGCMSVCPARM *pParm, void **ppv, uint32_t *pcb)236 {237 if (pParm->type == VBOX_HGCM_SVC_PARM_PTR)238 {239 *ppv = pParm->u.pointer.addr;240 *pcb = pParm->u.pointer.size;241 return VINF_SUCCESS;242 }243 244 return VERR_INVALID_PARAMETER;245 }246 234 247 235 uint32_t vboxSvcClipboardGetMode(void) … … 300 288 * @param pClientData Pointer to the client data structure to reset message queue for. 301 289 */ 302 void vboxSvcClipboardMsgQueueReset(PVBOXCLIPBOARDCLIENT DATA pClientData)290 void vboxSvcClipboardMsgQueueReset(PVBOXCLIPBOARDCLIENT pClient) 303 291 { 304 292 LogFlowFuncEnter(); 305 293 306 while (!pClient Data->queueMsg.isEmpty())307 { 308 RTMemFree(pClient Data->queueMsg.last());309 pClient Data->queueMsg.removeLast();294 while (!pClient->queueMsg.isEmpty()) 295 { 296 RTMemFree(pClient->queueMsg.last()); 297 pClient->queueMsg.removeLast(); 310 298 } 311 299 } … … 391 379 * @param fAppend Whether to append or prepend the message to the queue. 392 380 */ 393 int vboxSvcClipboardMsgAdd(PVBOXCLIPBOARDCLIENT DATA pClientData, PVBOXCLIPBOARDCLIENTMSG pMsg, bool fAppend)381 int vboxSvcClipboardMsgAdd(PVBOXCLIPBOARDCLIENT pClient, PVBOXCLIPBOARDCLIENTMSG pMsg, bool fAppend) 394 382 { 395 383 AssertPtrReturn(pMsg, VERR_INVALID_POINTER); 396 384 397 LogFlowFunc(("uMsg=%RU32, cParms=%RU32, fAppend=%RTbool\n", pMsg->m_uMsg, pMsg->m_cParms, fAppend)); 385 LogFlowFunc(("uMsg=%RU32 (%s), cParms=%RU32, fAppend=%RTbool\n", 386 pMsg->m_uMsg, VBoxClipboardHostMsgToStr(pMsg->m_uMsg), pMsg->m_cParms, fAppend)); 398 387 399 388 if (fAppend) 400 pClient Data->queueMsg.append(pMsg);389 pClient->queueMsg.append(pMsg); 401 390 else 402 pClient Data->queueMsg.prepend(pMsg);391 pClient->queueMsg.prepend(pMsg); 403 392 404 393 /** @todo Catch / handle OOM? */ … … 465 454 * Return information about the first message if one is pending in the list. 466 455 */ 467 if (!pClient-> pData->queueMsg.isEmpty())468 { 469 PVBOXCLIPBOARDCLIENTMSG pFirstMsg = pClient-> pData->queueMsg.first();456 if (!pClient->queueMsg.isEmpty()) 457 { 458 PVBOXCLIPBOARDCLIENTMSG pFirstMsg = pClient->queueMsg.first(); 470 459 if (pFirstMsg) 471 460 { … … 530 519 * Return information about the first message if one is pending in the list. 531 520 */ 532 if (!pClient-> pData->queueMsg.isEmpty())533 { 534 PVBOXCLIPBOARDCLIENTMSG pFirstMsg = pClient-> pData->queueMsg.first();521 if (!pClient->queueMsg.isEmpty()) 522 { 523 PVBOXCLIPBOARDCLIENTMSG pFirstMsg = pClient->queueMsg.first(); 535 524 if (pFirstMsg) 536 525 { 537 LogFlowFunc(("First message is: %RU32 %s (%RU32 parms)\n",526 LogFlowFunc(("First message is: %RU32 (%s), cParms=%RU32\n", 538 527 pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms)); 539 528 … … 607 596 if (rc != VERR_CANCELLED) 608 597 { 609 pClient-> pData->queueMsg.removeFirst();598 pClient->queueMsg.removeFirst(); 610 599 vboxSvcClipboardMsgFree(pFirstMsg); 611 600 } … … 635 624 rc = VINF_SUCCESS; 636 625 637 if (!pClient-> pData->queueMsg.isEmpty())638 { 639 PVBOXCLIPBOARDCLIENTMSG pFirstMsg = pClient-> pData->queueMsg.first();626 if (!pClient->queueMsg.isEmpty()) 627 { 628 PVBOXCLIPBOARDCLIENTMSG pFirstMsg = pClient->queueMsg.first(); 640 629 if (pFirstMsg) 641 630 { … … 667 656 } 668 657 669 /* Set the HGCM parameters according to pending messages. 658 /** 659 * Set the HGCM parameters according to pending messages. 670 660 * Executed under the clipboard lock. 661 * 662 * Legacy protocol, do not use anymore. 671 663 */ 672 static bool vboxSvcClipboard ReturnMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t cParms, VBOXHGCMSVCPARM paParms[])664 static bool vboxSvcClipboardOldReturnMsg(PVBOXCLIPBOARDCLIENT pClient, uint32_t cParms, VBOXHGCMSVCPARM paParms[]) 673 665 { 674 666 /** @todo r=andy The client at the moment supplies two parameters, which we can … … 682 674 683 675 /* Message priority is taken into account. */ 684 if (pClient Data->State.fHostMsgQuit)676 if (pClient->State.Old.fHostMsgQuit) 685 677 { 686 678 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT\n")); 687 679 HGCMSvcSetU32(&paParms[0], VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT); 688 680 HGCMSvcSetU32(&paParms[1], 0); 689 pClient Data->State.fHostMsgQuit = false;690 } 691 else if (pClient Data->State.fHostMsgReadData)681 pClient->State.Old.fHostMsgQuit = false; 682 } 683 else if (pClient->State.Old.fHostMsgReadData) 692 684 { 693 685 uint32_t fFormat = 0; 694 686 695 687 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA: u32RequestedFormat=%02X\n", 696 pClient Data->State.u32RequestedFormat));697 698 if (pClient Data->State.u32RequestedFormat & VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT)688 pClient->State.Old.u32RequestedFormat)); 689 690 if (pClient->State.Old.u32RequestedFormat & VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT) 699 691 fFormat = VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT; 700 else if (pClient Data->State.u32RequestedFormat & VBOX_SHARED_CLIPBOARD_FMT_BITMAP)692 else if (pClient->State.Old.u32RequestedFormat & VBOX_SHARED_CLIPBOARD_FMT_BITMAP) 701 693 fFormat = VBOX_SHARED_CLIPBOARD_FMT_BITMAP; 702 else if (pClient Data->State.u32RequestedFormat & VBOX_SHARED_CLIPBOARD_FMT_HTML)694 else if (pClient->State.Old.u32RequestedFormat & VBOX_SHARED_CLIPBOARD_FMT_HTML) 703 695 fFormat = VBOX_SHARED_CLIPBOARD_FMT_HTML; 704 696 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 705 else if (pClient Data->State.u32RequestedFormat & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST)697 else if (pClient->State.Old.u32RequestedFormat & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST) 706 698 fFormat = VBOX_SHARED_CLIPBOARD_FMT_URI_LIST; 707 699 #endif … … 709 701 { 710 702 LogRel2(("Clipboard: Unsupported format from guest (0x%x), skipping\n", fFormat)); 711 pClient Data->State.u32RequestedFormat = 0;712 } 713 pClient Data->State.u32RequestedFormat &= ~fFormat;703 pClient->State.Old.u32RequestedFormat = 0; 704 } 705 pClient->State.Old.u32RequestedFormat &= ~fFormat; 714 706 HGCMSvcSetU32(&paParms[0], VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); 715 707 HGCMSvcSetU32(&paParms[1], fFormat); 716 if (pClient Data->State.u32RequestedFormat == 0)717 pClient Data->State.fHostMsgReadData = false;718 } 719 else if (pClient Data->State.fHostMsgFormats)708 if (pClient->State.Old.u32RequestedFormat == 0) 709 pClient->State.Old.fHostMsgReadData = false; 710 } 711 else if (pClient->State.Old.fHostMsgFormats) 720 712 { 721 713 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS: u32AvailableFormats=%02X\n", 722 pClientData->State.u32AvailableFormats)); 723 724 HGCMSvcSetU32(&paParms[0], VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS); 725 HGCMSvcSetU32(&paParms[1], pClientData->State.u32AvailableFormats); 726 pClientData->State.fHostMsgFormats = false; 727 } 728 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 729 else if (vboxSvcClipboardURIReturnMsg(pClientData, cParms, paParms)) 730 { 731 /* Nothing to do here yet. */ 732 } 733 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 714 pClient->State.Old.u32AvailableFormats)); 715 716 HGCMSvcSetU32(&paParms[0], VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE); 717 HGCMSvcSetU32(&paParms[1], pClient->State.Old.u32AvailableFormats); 718 pClient->State.Old.fHostMsgFormats = false; 719 } 734 720 else 735 721 { … … 743 729 } 744 730 745 int vboxSvcClipboardReportMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t uMsg, uint32_t uFormats) 746 { 747 AssertPtrReturn(pClientData, VERR_INVALID_POINTER); 731 int vboxSvcClipboardSendFormatsWrite(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDFORMATDATA pFormats) 732 { 733 AssertPtrReturn(pClient, VERR_INVALID_POINTER); 734 735 int rc; 736 737 PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE, 3); 738 if (pMsg) 739 { 740 uint16_t uEvent = SharedClipboardEventIDGenerate(&pClient->Events); 741 742 HGCMSvcSetU32(&pMsg->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pClient->Events.uID, uEvent)); 743 HGCMSvcSetU32(&pMsg->m_paParms[1], pFormats->uFormats); 744 HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fFlags */); 745 746 rc = vboxSvcClipboardMsgAdd(pClient, pMsg, true /* fAppend */); 747 if (RT_SUCCESS(rc)) 748 { 749 rc = vboxSvcClipboardClientWakeup(pClient); 750 } 751 } 752 else 753 rc = VERR_NO_MEMORY; 754 755 LogFlowFuncLeaveRC(rc); 756 return rc; 757 } 758 759 int vboxSvcClipboardGetDataWrite(PVBOXCLIPBOARDCLIENT pClient, uint32_t cParms, VBOXHGCMSVCPARM paParms[]) 760 { 761 LogFlowFuncEnter(); 762 763 if ( vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_GUEST_TO_HOST 764 && vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL) 765 { 766 return VERR_NOT_SUPPORTED; 767 } 768 769 int rc; 770 771 SHAREDCLIPBOARDDATABLOCK dataBlock; 772 RT_ZERO(dataBlock); 773 774 VBOXCLIPBOARDCLIENTCMDCTX cmdCtx; 775 RT_ZERO(cmdCtx); 776 777 if (pClient->State.uProtocolVer == 0) /* Legacy protocol */ 778 { 779 if (cParms < 2) 780 { 781 rc = VERR_INVALID_PARAMETER; 782 } 783 else if ( paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* format */ 784 || paParms[1].type != VBOX_HGCM_SVC_PARM_PTR) /* ptr */ 785 { 786 rc = VERR_INVALID_PARAMETER; 787 } 788 else 789 { 790 rc = HGCMSvcGetU32(&paParms[0], &dataBlock.uFormat); 791 if (RT_SUCCESS(rc)) 792 rc = HGCMSvcGetBuf(&paParms[1], &dataBlock.pvData, &dataBlock.cbData); 793 } 794 } 795 else 796 { 797 if (cParms < VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA) 798 { 799 rc = VERR_INVALID_PARAMETER; 800 } 801 else if ( paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* uContext */ 802 || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* uFormat */ 803 || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* cbData */ 804 || paParms[3].type != VBOX_HGCM_SVC_PARM_PTR) /* pvData */ 805 { 806 rc = VERR_INVALID_PARAMETER; 807 } 808 else 809 { 810 rc = HGCMSvcGetU32(&paParms[0], &cmdCtx.uContextID); 811 if (RT_SUCCESS(rc)) 812 rc = HGCMSvcGetU32(&paParms[1], &dataBlock.uFormat); 813 if (RT_SUCCESS(rc)) 814 rc = HGCMSvcGetBuf(&paParms[3], &dataBlock.pvData, &dataBlock.cbData); 815 816 /** @todo Handle the rest. */ 817 } 818 } 819 820 if (RT_SUCCESS(rc)) 821 { 822 if (g_pfnExtension) 823 { 824 VBOXCLIPBOARDEXTPARMS parms; 825 RT_ZERO(parms); 826 827 parms.u32Format = dataBlock.uFormat; 828 parms.u.pvData = dataBlock.pvData; 829 parms.cbData = dataBlock.cbData; 830 831 g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_DATA_WRITE, &parms, sizeof(parms)); 832 } 833 834 rc = VBoxClipboardSvcImplWriteData(pClient, &cmdCtx, &dataBlock); 835 } 836 837 LogFlowFuncLeaveRC(rc); 838 return rc; 839 } 840 841 /** 842 * Reports a cached message back to the guest. 843 * 844 * Legacy protocol, do not use anymore. 845 */ 846 int vboxSvcClipboardOldReportMsg(PVBOXCLIPBOARDCLIENT pClient, uint32_t uMsg, uint32_t uFormats) 847 { 848 AssertPtrReturn(pClient, VERR_INVALID_POINTER); 748 849 749 850 int rc = VINF_SUCCESS; 750 851 751 LogFlowFunc(("uMsg=%RU32, fIsAsync=%RTbool\n", uMsg, pClientData->State.fAsync)); 852 LogFlowFunc(("uMsg=%RU32 (%s), fIsAsync=%RTbool\n", 853 uMsg, VBoxClipboardHostMsgToStr(uMsg), pClient->State.Old.fAsync)); 752 854 753 855 if (VBoxSvcClipboardLock()) … … 757 859 case VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT: 758 860 { 759 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT\n")); 760 pClientData->State.fHostMsgQuit = true; 861 pClient->State.Old.fHostMsgQuit = true; 761 862 } break; 762 863 … … 770 871 } 771 872 772 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA: uFormats=%02X\n", uFormats)); 773 pClientData->State.u32RequestedFormat = uFormats; 774 pClientData->State.fHostMsgReadData = true; 873 LogFlowFunc(("uFormats=%02X\n", uFormats)); 874 875 pClient->State.Old.u32RequestedFormat = uFormats; 876 pClient->State.Old.fHostMsgReadData = true; 775 877 } break; 776 878 777 case VBOX_SHARED_CLIPBOARD_HOST_MSG_ REPORT_FORMATS:879 case VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE: 778 880 { 779 881 if ( vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_HOST_TO_GUEST … … 784 886 } 785 887 786 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS: uFormats=%02X\n", uFormats)); 787 pClientData->State.u32AvailableFormats = uFormats; 788 pClientData->State.fHostMsgFormats = true; 888 LogFlowFunc(("uFormats=%02X\n", uFormats)); 889 890 pClient->State.Old.u32AvailableFormats = uFormats; 891 pClient->State.Old.fHostMsgFormats = true; 789 892 } break; 790 893 791 894 default: 792 895 { 793 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST794 rc = vboxSvcClipboardURIReportMsg(pClientData, uMsg, uFormats);795 #else796 896 AssertMsgFailed(("Invalid message %RU32\n", uMsg)); 797 897 rc = VERR_INVALID_PARAMETER; 798 #endif 799 } break;898 break; 899 } 800 900 } 801 901 802 902 if (RT_SUCCESS(rc)) 803 903 { 804 if (pClient Data->State.fAsync)904 if (pClient->State.Old.fAsync) 805 905 { 806 906 /* The client waits for a response. */ 807 bool fMessageReturned = vboxSvcClipboard ReturnMsg(pClientData,808 pClient Data->State.async.cParms,809 pClient Data->State.async.paParms);907 bool fMessageReturned = vboxSvcClipboardOldReturnMsg(pClient, 908 pClient->State.Old.async.cParms, 909 pClient->State.Old.async.paParms); 810 910 811 911 /* Make a copy of the handle. */ 812 VBOXHGCMCALLHANDLE callHandle = pClient Data->State.async.callHandle;912 VBOXHGCMCALLHANDLE callHandle = pClient->State.Old.async.callHandle; 813 913 814 914 if (fMessageReturned) 815 915 { 816 916 /* There is a response. */ 817 pClient Data->State.fAsync = false;917 pClient->State.Old.fAsync = false; 818 918 } 819 919 … … 838 938 839 939 840 int vboxSvcClipboardSetSource(PVBOXCLIPBOARDCLIENT DATA pClientData, SHAREDCLIPBOARDSOURCE enmSource)841 { 842 if (!pClient Data) /* If no client connected (anymore), bail out. */940 int vboxSvcClipboardSetSource(PVBOXCLIPBOARDCLIENT pClient, SHAREDCLIPBOARDSOURCE enmSource) 941 { 942 if (!pClient) /* If no client connected (anymore), bail out. */ 843 943 return VINF_SUCCESS; 844 944 … … 847 947 if (VBoxSvcClipboardLock()) 848 948 { 849 pClient Data->State.enmSource = enmSource;850 851 LogFlowFunc(("Source of client %RU32 is now %RU32\n", pClient Data->State.u32ClientID, pClientData->State.enmSource));949 pClient->State.enmSource = enmSource; 950 951 LogFlowFunc(("Source of client %RU32 is now %RU32\n", pClient->State.u32ClientID, pClient->State.enmSource)); 852 952 853 953 VBoxSvcClipboardUnlock(); … … 885 985 886 986 VBoxClipboardSvcImplDestroy(); 887 888 ClipboardClientMap::iterator itClient = g_mapClients.begin();889 while (itClient != g_mapClients.end())890 {891 RTMemFree(itClient->second);892 g_mapClients.erase(itClient);893 894 itClient = g_mapClients.begin();895 }896 987 897 988 RTCritSectDelete(&g_CritSect); … … 910 1001 LogFunc(("u32ClientID=%RU32\n", u32ClientID)); 911 1002 1003 PVBOXCLIPBOARDCLIENT pClient = (PVBOXCLIPBOARDCLIENT)pvClient; 1004 AssertPtr(pClient); 1005 1006 vboxSvcClipboardOldReportMsg(pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT, 0); /** @todo r=andy Why is this necessary? The client already disconnected ... */ 1007 vboxSvcClipboardOldCompleteReadData(pClient, VERR_NO_DATA, 0); 1008 1009 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 1010 PSHAREDCLIPBOARDURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pClient->URI, 0 /* Index*/); 1011 if (pTransfer) 1012 vboxSvcClipboardURIAreaDetach(&pClient->State, pTransfer); 1013 1014 SharedClipboardURICtxDestroy(&pClient->URI); 1015 #endif 1016 1017 VBoxClipboardSvcImplDisconnect(pClient); 1018 1019 vboxSvcClipboardClientStateReset(&pClient->State); 1020 vboxSvcClipboardClientStateDestroy(&pClient->State); 1021 912 1022 ClipboardClientMap::iterator itClient = g_mapClients.find(u32ClientID); 913 if (itClient == g_mapClients.end()) 914 { 915 AssertFailed(); /* Should never happen. */ 916 return VERR_NOT_FOUND; 917 } 918 919 PVBOXCLIPBOARDCLIENT pClient = itClient->second; 920 AssertPtr(pClient); 921 PVBOXCLIPBOARDCLIENTDATA pClientData = pClient->pData; 922 AssertPtr(pClientData); 923 924 /* Sanity. */ 925 Assert(pClientData == (PVBOXCLIPBOARDCLIENTDATA)pvClient); 926 927 vboxSvcClipboardReportMsg(pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT, 0); /** @todo r=andy Why is this necessary? The client already disconnected ... */ 928 929 vboxSvcClipboardCompleteReadData(pClientData, VERR_NO_DATA, 0); 930 1023 if (itClient != g_mapClients.end()) 1024 { 1025 g_mapClients.erase(itClient); 1026 } 1027 else 1028 AssertFailed(); 1029 1030 return VINF_SUCCESS; 1031 } 1032 1033 static DECLCALLBACK(int) svcConnect(void *, uint32_t u32ClientID, void *pvClient, uint32_t fRequestor, bool fRestoring) 1034 { 1035 RT_NOREF(fRequestor, fRestoring); 1036 1037 int rc = VINF_SUCCESS; 1038 1039 PVBOXCLIPBOARDCLIENT pClient = (PVBOXCLIPBOARDCLIENT)pvClient; 1040 AssertPtr(pvClient); 1041 1042 /* Assign the client ID. */ 1043 pClient->uClientID = u32ClientID; 1044 1045 /* Create the client's own event source. */ 1046 SharedClipboardEventSourceCreate(&pClient->Events, (uint16_t)g_mapClients.size()); 1047 1048 LogFlowFunc(("[Client %RU32] Using event source %RU32\n", u32ClientID, pClient->Events.uID)); 1049 1050 /* Reset the client state. */ 1051 vboxSvcClipboardClientStateReset(&pClient->State); 1052 1053 /* (Re-)initialize the client state. */ 1054 vboxSvcClipboardClientStateInit(&pClient->State, u32ClientID); 1055 1056 rc = VBoxClipboardSvcImplConnect(pClient, VBoxSvcClipboardGetHeadless()); 931 1057 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 932 PSHAREDCLIPBOARDURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pClientData->URI, 0 /* Index*/); 933 if (pTransfer) 934 vboxSvcClipboardURIAreaDetach(&pClientData->State, pTransfer); 935 936 SharedClipboardURICtxDestroy(&pClientData->URI); 1058 if (RT_SUCCESS(rc)) 1059 rc = SharedClipboardURICtxInit(&pClient->URI); 937 1060 #endif 938 1061 939 VBoxClipboardSvcImplDisconnect(pClientData);940 941 vboxSvcClipboardClientStateReset(pClientData);942 vboxSvcClipboardClientStateDestroy(pClientData);943 944 RTMemFree(itClient->second);945 g_mapClients.erase(itClient);946 947 return VINF_SUCCESS;948 }949 950 static DECLCALLBACK(int) svcConnect(void *, uint32_t u32ClientID, void *pvClient, uint32_t fRequestor, bool fRestoring)951 {952 RT_NOREF(fRequestor, fRestoring);953 954 LogFlowFunc(("u32ClientID=%RU32\n", u32ClientID));955 956 int rc = VINF_SUCCESS;957 958 if (g_mapClients.find(u32ClientID) != g_mapClients.end())959 {960 rc = VERR_ALREADY_EXISTS;961 AssertFailed(); /* Should never happen. */962 }963 964 1062 if (RT_SUCCESS(rc)) 965 1063 { 966 PVBOXCLIPBOARDCLIENT pClient = (PVBOXCLIPBOARDCLIENT)RTMemAllocZ(sizeof(VBOXCLIPBOARDCLIENT)); 967 if (RT_SUCCESS(rc)) 968 { 969 pClient->uClientID = u32ClientID; 970 pClient->pData = (PVBOXCLIPBOARDCLIENTDATA)pvClient; 971 972 /* Reset the client state. */ 973 vboxSvcClipboardClientStateReset(pClient->pData); 974 975 /* (Re-)initialize the client state. */ 976 vboxSvcClipboardClientStateInit(pClient->pData, u32ClientID); 977 978 rc = VBoxClipboardSvcImplConnect(pClient->pData, VBoxSvcClipboardGetHeadless()); 979 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 980 if (RT_SUCCESS(rc)) 981 rc = SharedClipboardURICtxInit(&pClient->pData->URI); 982 #endif 983 g_mapClients[u32ClientID] = pClient; /** @todo Can this throw? */ 984 } 1064 VBOXCLIPBOARDCLIENTMAPENTRY ClientEntry; 1065 RT_ZERO(ClientEntry); 1066 1067 g_mapClients[u32ClientID] = ClientEntry; /** @todo Handle OOM / collisions? */ 985 1068 } 986 1069 … … 1002 1085 int rc = VINF_SUCCESS; 1003 1086 1004 LogFunc(("u32ClientID=%RU32, fn=%RU32, cParms=%RU32, paParms=%p\n", 1005 u32ClientID, u32Function, cParms, paParms)); 1006 1007 ClipboardClientMap::iterator itClient = g_mapClients.find(u32ClientID); 1008 if (itClient == g_mapClients.end()) 1009 { 1010 AssertFailed(); /* Should never happen. */ 1011 return; 1012 } 1013 1014 PVBOXCLIPBOARDCLIENT pClient = itClient->second; 1087 PVBOXCLIPBOARDCLIENT pClient = (PVBOXCLIPBOARDCLIENT)pvClient; 1015 1088 AssertPtr(pClient); 1016 PVBOXCLIPBOARDCLIENTDATA pClientData = pClient->pData; 1017 AssertPtr(pClientData); 1089 1090 LogFunc(("u32ClientID=%RU32 (proto %RU32), fn=%RU32 (%s), cParms=%RU32, paParms=%p\n", 1091 u32ClientID, pClient->State.uProtocolVer, u32Function, VBoxClipboardGuestMsgToStr(u32Function), cParms, paParms)); 1018 1092 1019 1093 #ifdef DEBUG … … 1033 1107 case VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG_OLD: 1034 1108 { 1035 /* The quest requests a host message. */1036 LogFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG_OLD\n"));1037 1038 1109 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_GET_HOST_MSG_OLD) 1039 1110 { … … 1050 1121 if (VBoxSvcClipboardLock()) 1051 1122 { 1052 bool fMessageReturned = vboxSvcClipboard ReturnMsg(pClientData, cParms, paParms);1123 bool fMessageReturned = vboxSvcClipboardOldReturnMsg(pClient, cParms, paParms); 1053 1124 if (fMessageReturned) 1054 1125 { 1055 1126 /* Just return to the caller. */ 1056 pClient Data->State.fAsync = false;1127 pClient->State.Old.fAsync = false; 1057 1128 } 1058 1129 else … … 1061 1132 fDefer = true; 1062 1133 1063 pClient Data->State.fAsync = true;1064 pClient Data->State.async.callHandle = callHandle;1065 pClient Data->State.async.cParms = cParms;1066 pClient Data->State.async.paParms = paParms;1134 pClient->State.Old.fAsync = true; 1135 pClient->State.Old.async.callHandle = callHandle; 1136 pClient->State.Old.async.cParms = cParms; 1137 pClient->State.Old.async.paParms = paParms; 1067 1138 } 1068 1139 … … 1074 1145 } 1075 1146 } 1076 } break; 1077 1078 case VBOX_SHARED_CLIPBOARD_GUEST_FN_REPORT_FORMATS: 1079 { 1080 /* The guest reports that some formats are available. */ 1081 LogFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_REPORT_FORMATS\n")); 1082 1083 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_REPORT_FORMATS) 1147 1148 break; 1149 } 1150 1151 case VBOX_SHARED_CLIPBOARD_GUEST_FN_CONNECT: 1152 { 1153 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_CONNECT) 1084 1154 { 1085 1155 rc = VERR_INVALID_PARAMETER; 1086 1156 } 1087 else if (paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT) /* formats */ 1157 else if ( paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* uProtocolVer */ 1158 || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* uProtocolFlags */ 1159 || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* cbChunkSize */ 1160 || paParms[3].type != VBOX_HGCM_SVC_PARM_32BIT /* enmCompression */ 1161 || paParms[4].type != VBOX_HGCM_SVC_PARM_32BIT) /* enmChecksumType */ 1088 1162 { 1089 1163 rc = VERR_INVALID_PARAMETER; 1090 1164 } 1165 else if (vboxSvcClipboardGetMode() == VBOX_SHARED_CLIPBOARD_MODE_OFF) 1166 { 1167 rc = VERR_ACCESS_DENIED; 1168 } 1091 1169 else 1092 1170 { 1093 uint32_t u32Formats; 1094 rc = HGCMSvcGetU32(&paParms[0], &u32Formats); 1095 if (RT_SUCCESS(rc)) 1096 { 1097 if ( vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_GUEST_TO_HOST 1098 && vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL) 1171 /* Update the protocol version and tell the guest. */ 1172 pClient->State.uProtocolVer = 1; 1173 1174 LogFlowFunc(("Now using protocol v%RU32\n", pClient->State.uProtocolVer)); 1175 1176 HGCMSvcSetU32(&paParms[0], pClient->State.uProtocolVer); 1177 HGCMSvcSetU32(&paParms[1], 0 /* Procotol flags, not used yet */); 1178 HGCMSvcSetU32(&paParms[2], pClient->State.cbChunkSize); 1179 HGCMSvcSetU32(&paParms[3], 0 /* Compression type, not used yet */); 1180 HGCMSvcSetU32(&paParms[4], 0 /* Checksum type, not used yet */); 1181 1182 rc = VINF_SUCCESS; 1183 } 1184 1185 break; 1186 } 1187 1188 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT: 1189 { 1190 rc = vboxSvcClipboardMsgPeek(pClient, callHandle, cParms, paParms, false /*fWait*/); 1191 break; 1192 } 1193 1194 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT: 1195 { 1196 rc = vboxSvcClipboardMsgPeek(pClient, callHandle, cParms, paParms, true /*fWait*/); 1197 if (rc == VINF_HGCM_ASYNC_EXECUTE) 1198 fDefer = true; 1199 break; 1200 } 1201 1202 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET: 1203 { 1204 rc = vboxSvcClipboardMsgGet(pClient, callHandle, cParms, paParms); 1205 if (RT_SUCCESS(rc)) /* vboxSvcClipboardMsgGet did the completion already. */ 1206 fDefer = true; 1207 break; 1208 } 1209 1210 case VBOX_SHARED_CLIPBOARD_GUEST_FN_FORMATS_WRITE: 1211 { 1212 uint32_t u32Formats = 0; 1213 1214 if (pClient->State.uProtocolVer == 0) 1215 { 1216 if (cParms != 1) 1217 { 1218 rc = VERR_INVALID_PARAMETER; 1219 } 1220 else if (paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT) /* uFormats */ 1221 { 1222 rc = VERR_INVALID_PARAMETER; 1223 } 1224 else 1225 { 1226 rc = HGCMSvcGetU32(&paParms[0], &u32Formats); 1227 } 1228 } 1229 else 1230 { 1231 if (cParms != 3) 1232 { 1233 rc = VERR_INVALID_PARAMETER; 1234 } 1235 else if ( paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* uContextID */ 1236 || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* uFormats */ 1237 || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT) /* fFlags */ 1238 { 1239 rc = VERR_INVALID_PARAMETER; 1240 } 1241 else 1242 { 1243 rc = HGCMSvcGetU32(&paParms[1], &u32Formats); 1244 1245 /** @todo Handle rest. */ 1246 } 1247 } 1248 1249 if (RT_SUCCESS(rc)) 1250 { 1251 if ( vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_GUEST_TO_HOST 1252 && vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL) 1253 { 1254 rc = VERR_ACCESS_DENIED; 1255 } 1256 else 1257 { 1258 rc = vboxSvcClipboardSetSource(pClient, SHAREDCLIPBOARDSOURCE_REMOTE); 1259 if (RT_SUCCESS(rc)) 1099 1260 { 1100 rc = VERR_ACCESS_DENIED; 1101 } 1102 else 1103 { 1104 rc = vboxSvcClipboardSetSource(pClientData, SHAREDCLIPBOARDSOURCE_REMOTE); 1105 1106 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST_DISABLED 1107 if ( RT_SUCCESS(rc) 1108 && (u32Formats & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST)) 1261 #if 0 1262 if (u32Formats & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST) 1109 1263 { 1110 if (!SharedClipboardURICtxTransfersMaximumReached(&pClientData->URI)) 1264 /* Tell the guest that we want to start a reading transfer 1265 * (from guest to the host). */ 1266 rc = vboxSvcClipboardReportMsg(pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START, 1267 0 /* u32Formats == 0 means reading data */); 1268 1269 /* Note: Announcing the actual format will be done in the 1270 host service guest call URI handler (vboxSvcClipboardURIHandler). */ 1271 } 1272 else /* Announce simple formats to the OS-specific service implemenation. */ 1273 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 1274 { 1275 if (g_pfnExtension) 1111 1276 { 1112 SharedClipboardURICtxTransfersCleanup(&pClientData->URI); 1113 1114 PSHAREDCLIPBOARDURITRANSFER pTransfer; 1115 rc = SharedClipboardURITransferCreate(SHAREDCLIPBOARDURITRANSFERDIR_READ, 1116 SHAREDCLIPBOARDSOURCE_REMOTE, &pTransfer); 1117 if (RT_SUCCESS(rc)) 1118 { 1119 rc = vboxSvcClipboardURIAreaRegister(&pClientData->State, pTransfer); 1120 if (RT_SUCCESS(rc)) 1121 { 1122 SHAREDCLIPBOARDPROVIDERCREATIONCTX creationCtx; 1123 RT_ZERO(creationCtx); 1124 1125 creationCtx.enmSource = pClientData->State.enmSource; 1126 1127 RT_ZERO(creationCtx.Interface); 1128 RT_ZERO(creationCtx.Interface); 1129 creationCtx.Interface.pfnTransferOpen = vboxSvcClipboardURITransferOpen; 1130 creationCtx.Interface.pfnTransferClose = vboxSvcClipboardURITransferClose; 1131 creationCtx.Interface.pfnListOpen = vboxSvcClipboardURIListOpen; 1132 creationCtx.Interface.pfnListClose = vboxSvcClipboardURIListClose; 1133 creationCtx.Interface.pfnListHdrRead = vboxSvcClipboardURIListHdrRead; 1134 creationCtx.Interface.pfnListEntryRead = vboxSvcClipboardURIListEntryRead; 1135 creationCtx.Interface.pfnObjOpen = vboxSvcClipboardURIObjOpen; 1136 creationCtx.Interface.pfnObjClose = vboxSvcClipboardURIObjClose; 1137 creationCtx.Interface.pfnObjRead = vboxSvcClipboardURIObjRead; 1138 1139 creationCtx.pvUser = pClient; 1140 1141 /* Register needed callbacks so that we can wait for the meta data to arrive here. */ 1142 SHAREDCLIPBOARDURITRANSFERCALLBACKS Callbacks; 1143 RT_ZERO(Callbacks); 1144 1145 Callbacks.pvUser = pClientData; 1146 1147 Callbacks.pfnTransferPrepare = VBoxSvcClipboardURITransferPrepareCallback; 1148 Callbacks.pfnTransferComplete = VBoxSvcClipboardURITransferCompleteCallback; 1149 Callbacks.pfnTransferCanceled = VBoxSvcClipboardURITransferCanceledCallback; 1150 Callbacks.pfnTransferError = VBoxSvcClipboardURITransferErrorCallback; 1151 1152 SharedClipboardURITransferSetCallbacks(pTransfer, &Callbacks); 1153 1154 rc = SharedClipboardURITransferSetInterface(pTransfer, &creationCtx); 1155 if (RT_SUCCESS(rc)) 1156 rc = SharedClipboardURICtxTransferAdd(&pClientData->URI, pTransfer); 1157 } 1158 1159 if (RT_SUCCESS(rc)) 1160 { 1161 rc = VBoxClipboardSvcImplURITransferCreate(pClientData, pTransfer); 1162 } 1163 else 1164 { 1165 VBoxClipboardSvcImplURITransferDestroy(pClientData, pTransfer); 1166 SharedClipboardURITransferDestroy(pTransfer); 1167 } 1168 } 1277 VBOXCLIPBOARDEXTPARMS parms; 1278 RT_ZERO(parms); 1279 parms.u32Format = u32Formats; 1280 1281 g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_FORMAT_ANNOUNCE, &parms, sizeof (parms)); 1169 1282 } 1170 else 1171 rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED; 1172 1173 LogFunc(("VBOX_SHARED_CLIPBOARD_FMT_URI_LIST: %Rrc\n", rc)); 1174 1175 if (RT_FAILURE(rc)) 1176 LogRel(("Shared Clipboard: Initializing URI guest to host read transfer failed with %Rrc\n", rc)); 1177 } 1178 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 1179 1180 if (RT_SUCCESS(rc)) 1181 { 1182 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 1183 if (u32Formats & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST) 1184 { 1185 /* Tell the guest that we want to start a reading transfer 1186 * (from guest to the host). */ 1187 rc = vboxSvcClipboardReportMsg(pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START, 1188 0 /* u32Formats == 0 means reading data */); 1189 1190 /* Note: Announcing the actual format will be done in the 1191 host service URI handler (vboxSvcClipboardURIHandler). */ 1192 } 1193 else /* Announce simple formats to the OS-specific service implemenation. */ 1194 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */ 1195 { 1196 if (g_pfnExtension) 1197 { 1198 VBOXCLIPBOARDEXTPARMS parms; 1199 RT_ZERO(parms); 1200 parms.u32Format = u32Formats; 1201 1202 g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_FORMAT_ANNOUNCE, &parms, sizeof (parms)); 1203 } 1204 1205 rc = VBoxClipboardSvcImplFormatAnnounce(pClientData, u32Formats); 1206 } 1283 1284 VBOXCLIPBOARDCLIENTCMDCTX cmdCtx; 1285 RT_ZERO(cmdCtx); 1286 1287 SHAREDCLIPBOARDFORMATDATA formatData; 1288 RT_ZERO(formatData); 1289 1290 formatData.uFormats = u32Formats; 1291 1292 rc = VBoxClipboardSvcImplFormatAnnounce(pClient, &cmdCtx, &formatData); 1207 1293 } 1208 1294 } 1209 1295 } 1210 1296 } 1211 } break; 1212 1213 case VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA: 1214 { 1215 /* The guest wants to read data in the given format. */ 1216 LogFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA\n")); 1217 1297 1298 break; 1299 } 1300 1301 case VBOX_SHARED_CLIPBOARD_GUEST_FN_DATA_READ: 1302 { 1218 1303 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_READ_DATA) 1219 1304 { … … 1243 1328 if (u32Format == VBOX_SHARED_CLIPBOARD_FMT_URI_LIST) 1244 1329 { 1245 if (!SharedClipboardURICtxTransfersMaximumReached(&pClient Data->URI))1330 if (!SharedClipboardURICtxTransfersMaximumReached(&pClient->URI)) 1246 1331 { 1247 SharedClipboardURICtxTransfersCleanup(&pClient Data->URI);1332 SharedClipboardURICtxTransfersCleanup(&pClient->URI); 1248 1333 1249 1334 PSHAREDCLIPBOARDURITRANSFER pTransfer; 1250 1335 rc = SharedClipboardURITransferCreate(SHAREDCLIPBOARDURITRANSFERDIR_WRITE, 1251 pClient Data->State.enmSource,1336 pClient->State.enmSource, 1252 1337 &pTransfer); 1253 1338 if (RT_SUCCESS(rc)) 1254 1339 { 1255 1340 /* Attach to the most recent clipboard area. */ 1256 rc = vboxSvcClipboardURIAreaAttach(&pClient Data->State, pTransfer, 0 /* Area ID */);1341 rc = vboxSvcClipboardURIAreaAttach(&pClient->State, pTransfer, 0 /* Area ID */); 1257 1342 if (RT_SUCCESS(rc)) 1258 1343 { … … 1268 1353 creationCtx.Interface.pfnObjWrite = vboxSvcClipboardURIObjWrite; 1269 1354 1270 creationCtx.pvUser = pClient Data;1355 creationCtx.pvUser = pClient; 1271 1356 1272 1357 rc = SharedClipboardURITransferSetInterface(pTransfer, &creationCtx); 1273 1358 if (RT_SUCCESS(rc)) 1274 rc = SharedClipboardURICtxTransferAdd(&pClient Data->URI, pTransfer);1359 rc = SharedClipboardURICtxTransferAdd(&pClient->URI, pTransfer); 1275 1360 } 1276 1361 1277 1362 if (RT_SUCCESS(rc)) 1278 1363 { 1279 rc = VBoxClipboardSvcImplURITransferCreate(pClient Data, pTransfer);1364 rc = VBoxClipboardSvcImplURITransferCreate(pClient, pTransfer); 1280 1365 } 1281 1366 else 1282 1367 { 1283 VBoxClipboardSvcImplURITransferDestroy(pClient Data, pTransfer);1368 VBoxClipboardSvcImplURITransferDestroy(pClient, pTransfer); 1284 1369 SharedClipboardURITransferDestroy(pTransfer); 1285 1370 } … … 1297 1382 void *pv; 1298 1383 uint32_t cb; 1299 rc = VBoxHGCMParmPtrGet(&paParms[1], &pv, &cb);1384 rc = HGCMSvcGetBuf(&paParms[1], &pv, &cb); 1300 1385 if (RT_SUCCESS(rc)) 1301 1386 { … … 1318 1403 if (g_fDelayedAnnouncement) 1319 1404 { 1320 vboxSvcClipboard ReportMsg(pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS, g_u32DelayedFormats);1405 vboxSvcClipboardOldReportMsg(pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS_WRITE, g_u32DelayedFormats); 1321 1406 g_fDelayedAnnouncement = false; 1322 1407 g_u32DelayedFormats = 0; … … 1333 1418 /* Release any other pending read, as we only 1334 1419 * support one pending read at one time. */ 1335 rc = vboxSvcClipboard CompleteReadData(pClientData, VERR_NO_DATA, 0);1420 rc = vboxSvcClipboardOldCompleteReadData(pClient, VERR_NO_DATA, 0); 1336 1421 if (RT_SUCCESS(rc)) 1337 rc = VBoxClipboardSvcImplReadData(pClientData, u32Format, pv, cb, &cbActual); 1422 { 1423 VBOXCLIPBOARDCLIENTCMDCTX cmdCtx; 1424 RT_ZERO(cmdCtx); 1425 1426 SHAREDCLIPBOARDDATABLOCK dataBlock; 1427 RT_ZERO(dataBlock); 1428 1429 dataBlock.pvData = pv; 1430 dataBlock.cbData = cb; 1431 dataBlock.uFormat = u32Format; 1432 1433 rc = VBoxClipboardSvcImplReadData(pClient, &cmdCtx, &dataBlock, &cbActual); 1434 } 1338 1435 1339 1436 /* Remember our read request until it is completed. … … 1344 1441 if (VBoxSvcClipboardLock()) 1345 1442 { 1346 pClient Data->State.asyncRead.callHandle = callHandle;1347 pClient Data->State.asyncRead.cParms = cParms;1348 pClient Data->State.asyncRead.paParms = paParms;1349 pClient Data->State.fReadPending = true;1443 pClient->State.Old.asyncRead.callHandle = callHandle; 1444 pClient->State.Old.asyncRead.cParms = cParms; 1445 pClient->State.Old.asyncRead.paParms = paParms; 1446 pClient->State.Old.fReadPending = true; 1350 1447 fDefer = true; 1351 1448 VBoxSvcClipboardUnlock(); … … 1364 1461 } 1365 1462 } 1366 } break; 1367 1368 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA: 1369 { 1370 /* The guest writes the requested data. */ 1371 LogFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DATA\n")); 1372 1373 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_WRITE_DATA) 1374 { 1375 rc = VERR_INVALID_PARAMETER; 1376 } 1377 else if ( paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* format */ 1378 || paParms[1].type != VBOX_HGCM_SVC_PARM_PTR /* ptr */ 1379 ) 1380 { 1381 rc = VERR_INVALID_PARAMETER; 1382 } 1383 else 1384 { 1385 void *pv; 1386 uint32_t cb; 1387 uint32_t u32Format; 1388 1389 rc = HGCMSvcGetU32(&paParms[0], &u32Format); 1390 if (RT_SUCCESS(rc)) 1391 { 1392 rc = VBoxHGCMParmPtrGet(&paParms[1], &pv, &cb); 1393 if (RT_SUCCESS(rc)) 1394 { 1395 if ( vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_GUEST_TO_HOST 1396 && vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL) 1397 { 1398 rc = VERR_NOT_SUPPORTED; 1399 break; 1400 } 1401 1402 if (g_pfnExtension) 1403 { 1404 VBOXCLIPBOARDEXTPARMS parms; 1405 RT_ZERO(parms); 1406 1407 parms.u32Format = u32Format; 1408 parms.u.pvData = pv; 1409 parms.cbData = cb; 1410 1411 g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_DATA_WRITE, &parms, sizeof (parms)); 1412 } 1413 1414 rc = VBoxClipboardSvcImplWriteData(pClientData, pv, cb, u32Format); 1415 } 1416 } 1417 } 1418 } break; 1463 1464 break; 1465 } 1466 1467 case VBOX_SHARED_CLIPBOARD_GUEST_FN_DATA_WRITE: 1468 { 1469 rc = vboxSvcClipboardGetDataWrite(pClient, cParms, paParms); 1470 break; 1471 } 1419 1472 1420 1473 default: … … 1428 1481 rc = VERR_NOT_IMPLEMENTED; 1429 1482 #endif 1430 } break; 1483 break; 1484 } 1431 1485 } 1432 1486 … … 1442 1496 * then complete it, otherwise return. See the protocol description in the 1443 1497 * shared clipboard module description. */ 1444 int vboxSvcClipboard CompleteReadData(PVBOXCLIPBOARDCLIENTDATA pClientData, int rc, uint32_t cbActual)1498 int vboxSvcClipboardOldCompleteReadData(PVBOXCLIPBOARDCLIENT pClient, int rc, uint32_t cbActual) 1445 1499 { 1446 1500 VBOXHGCMCALLHANDLE callHandle = NULL; … … 1449 1503 if (VBoxSvcClipboardLock()) /* if not can we do anything useful? */ 1450 1504 { 1451 callHandle = pClient Data->State.asyncRead.callHandle;1452 paParms = pClient Data->State.asyncRead.paParms;1453 fReadPending = pClient Data->State.fReadPending;1454 pClient Data->State.fReadPending = false;1505 callHandle = pClient->State.Old.asyncRead.callHandle; 1506 paParms = pClient->State.Old.asyncRead.paParms; 1507 fReadPending = pClient->State.Old.fReadPending; 1508 pClient->State.Old.fReadPending = false; 1455 1509 VBoxSvcClipboardUnlock(); 1456 1510 } … … 1468 1522 * 1469 1523 * @returns VBox status code. 1470 * @param pClient DataClient state to initialize.1524 * @param pClientState Client state to initialize. 1471 1525 * @param uClientID Client ID (HGCM) to use for this client state. 1472 1526 */ 1473 static int vboxSvcClipboardClientStateInit(PVBOXCLIPBOARDCLIENT DATA pClientData, uint32_t uClientID)1527 static int vboxSvcClipboardClientStateInit(PVBOXCLIPBOARDCLIENTSTATE pClientState, uint32_t uClientID) 1474 1528 { 1475 1529 LogFlowFuncEnter(); 1530 1531 vboxSvcClipboardClientStateReset(pClientState); 1476 1532 1477 1533 /* Register the client. 1478 1534 * Note: Do *not* memset the struct, as it contains classes (for caching). */ 1479 pClientData->State.u32ClientID = uClientID; 1535 pClientState->u32ClientID = uClientID; 1536 pClientState->uProtocolVer = 0; 1480 1537 1481 1538 return VINF_SUCCESS; … … 1486 1543 * 1487 1544 * @returns VBox status code. 1488 * @param pClient DataClient state to destroy.1545 * @param pClientState Client state to destroy. 1489 1546 */ 1490 static int vboxSvcClipboardClientStateDestroy(PVBOXCLIPBOARDCLIENTDATA pClientData) 1491 { 1547 static int vboxSvcClipboardClientStateDestroy(PVBOXCLIPBOARDCLIENTSTATE pClientState) 1548 { 1549 RT_NOREF(pClientState); 1550 1492 1551 LogFlowFuncEnter(); 1493 1552 1494 vboxSvcClipboardMsgQueueReset(pClientData);1495 1496 1553 return VINF_SUCCESS; 1554 } 1555 1556 /** 1557 * Resets a Shared Clipboard service's old client state. 1558 * Legacy protocol, do not use anymore. 1559 * 1560 * @param pClientState Client state to reset. 1561 */ 1562 static void vboxSvcClipboardOldClientStateReset(PVBOXCLIPBOARDCLIENTSTATE pClientState) 1563 { 1564 LogFlowFuncEnter(); 1565 1566 pClientState->Old.fAsync = false; 1567 pClientState->Old.fReadPending = false; 1568 1569 pClientState->Old.fHostMsgQuit = false; 1570 pClientState->Old.fHostMsgReadData = false; 1571 pClientState->Old.fHostMsgFormats = false; 1572 1573 pClientState->Old.u32AvailableFormats = 0; 1574 pClientState->Old.u32RequestedFormat = 0; 1497 1575 } 1498 1576 … … 1500 1578 * Resets a Shared Clipboard service's client state. 1501 1579 * 1502 * @param pClient DataClient state to reset.1580 * @param pClient Client state to reset. 1503 1581 */ 1504 static void vboxSvcClipboardClientStateReset(PVBOXCLIPBOARDCLIENT DATA pClientData)1582 static void vboxSvcClipboardClientStateReset(PVBOXCLIPBOARDCLIENTSTATE pClientState) 1505 1583 { 1506 1584 LogFlowFuncEnter(); 1507 1585 1508 /** @todo Clear async / asynRead / ... data? */1509 vboxSvcClipboardMsgQueueReset(pClientData);1510 1511 pClientData->State.u32ClientID = 0;1512 pClientData->State.fAsync = false;1513 pClientData->State.fReadPending = false;1514 1515 pClientData->State.fHostMsgQuit = false;1516 pClientData->State.fHostMsgReadData = false;1517 pClientData->State.fHostMsgFormats = false;1518 1586 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 1519 pClient Data->State.URI.fTransferStart = false;1520 pClient Data->State.URI.enmTransferDir = SHAREDCLIPBOARDURITRANSFERDIR_UNKNOWN;1587 pClientState->URI.fTransferStart = false; 1588 pClientState->URI.enmTransferDir = SHAREDCLIPBOARDURITRANSFERDIR_UNKNOWN; 1521 1589 #endif 1522 1590 1523 pClientData->State.u32AvailableFormats = 0; 1524 pClientData->State.u32RequestedFormat = 0; 1591 vboxSvcClipboardOldClientStateReset(pClientState); 1525 1592 } 1526 1593 … … 1601 1668 { 1602 1669 SSMFIELD_ENTRY(VBOXCLIPBOARDCLIENTSTATE, u32ClientID), /* for validation purposes */ 1603 SSMFIELD_ENTRY(VBOXCLIPBOARDCLIENTSTATE, fHostMsgQuit),1604 SSMFIELD_ENTRY(VBOXCLIPBOARDCLIENTSTATE, fHostMsgReadData),1605 SSMFIELD_ENTRY(VBOXCLIPBOARDCLIENTSTATE, fHostMsgFormats),1606 SSMFIELD_ENTRY(VBOXCLIPBOARDCLIENTSTATE, u32RequestedFormat),1670 SSMFIELD_ENTRY(VBOXCLIPBOARDCLIENTSTATE, Old.fHostMsgQuit), 1671 SSMFIELD_ENTRY(VBOXCLIPBOARDCLIENTSTATE, Old.fHostMsgReadData), 1672 SSMFIELD_ENTRY(VBOXCLIPBOARDCLIENTSTATE, Old.fHostMsgFormats), 1673 SSMFIELD_ENTRY(VBOXCLIPBOARDCLIENTSTATE, Old.u32RequestedFormat), 1607 1674 SSMFIELD_ENTRY_TERM() 1608 1675 }; … … 1622 1689 LogFunc(("u32ClientID=%RU32\n", u32ClientID)); 1623 1690 1624 PVBOXCLIPBOARDCLIENT DATA pClientData = (PVBOXCLIPBOARDCLIENTDATA)pvClient;1691 PVBOXCLIPBOARDCLIENT pClient = (PVBOXCLIPBOARDCLIENT)pvClient; 1625 1692 1626 1693 /* This field used to be the length. We're using it as a version field 1627 1694 with the high bit set. */ 1628 1695 SSMR3PutU32(pSSM, UINT32_C(0x80000002)); 1629 int rc = SSMR3PutStructEx(pSSM, pClient Data, sizeof(*pClientData), 0 /*fFlags*/, &g_aClipboardClientDataFields[0], NULL);1696 int rc = SSMR3PutStructEx(pSSM, pClient, sizeof(*pClient), 0 /*fFlags*/, &g_aClipboardClientDataFields[0], NULL); 1630 1697 AssertRCReturn(rc, rc); 1631 1698 … … 1643 1710 LogFunc(("u32ClientID=%RU32\n", u32ClientID)); 1644 1711 1645 PVBOXCLIPBOARDCLIENT DATA pClientData = (PVBOXCLIPBOARDCLIENTDATA)pvClient;1646 AssertPtr(pClient Data);1712 PVBOXCLIPBOARDCLIENT pClient = (PVBOXCLIPBOARDCLIENT)pvClient; 1713 AssertPtr(pClient); 1647 1714 1648 1715 /* Existing client can not be in async state yet. */ 1649 Assert(!pClient Data->State.fAsync);1716 Assert(!pClient->State.Old.fAsync); 1650 1717 1651 1718 /* Save the client ID for data validation. */ 1652 1719 /** @todo isn't this the same as u32ClientID? Playing safe for now... */ 1653 uint32_t const u32ClientIDOld = pClient Data->State.u32ClientID;1720 uint32_t const u32ClientIDOld = pClient->State.u32ClientID; 1654 1721 1655 1722 /* Restore the client data. */ … … 1659 1726 if (lenOrVer == UINT32_C(0x80000002)) 1660 1727 { 1661 rc = SSMR3GetStructEx(pSSM, pClient Data, sizeof(*pClientData), 0 /*fFlags*/, &g_aClipboardClientDataFields[0], NULL);1728 rc = SSMR3GetStructEx(pSSM, pClient, sizeof(*pClient), 0 /*fFlags*/, &g_aClipboardClientDataFields[0], NULL); 1662 1729 AssertRCReturn(rc, rc); 1663 1730 } … … 1669 1736 1670 1737 /* Verify the client ID. */ 1671 if (pClient Data->State.u32ClientID != u32ClientIDOld)1672 { 1673 LogFunc(("Client ID mismatch: expected %d, got %d\n", u32ClientIDOld, pClient Data->State.u32ClientID));1674 pClient Data->State.u32ClientID = u32ClientIDOld;1738 if (pClient->State.u32ClientID != u32ClientIDOld) 1739 { 1740 LogFunc(("Client ID mismatch: expected %d, got %d\n", u32ClientIDOld, pClient->State.u32ClientID)); 1741 pClient->State.u32ClientID = u32ClientIDOld; 1675 1742 return VERR_SSM_DATA_UNIT_FORMAT_CHANGED; 1676 1743 } 1677 1744 1678 1745 /* Actual host data are to be reported to guest (SYNC). */ 1679 VBoxClipboardSvcImplSync(pClient Data);1746 VBoxClipboardSvcImplSync(pClient); 1680 1747 1681 1748 #else /* UNIT_TEST*/ … … 1693 1760 int rc = VINF_SUCCESS; 1694 1761 1695 PVBOXCLIPBOARDCLIENT DATA pClientData= NULL; /** @todo FIX !!! */1696 1697 if (pClient Data!= NULL)1762 PVBOXCLIPBOARDCLIENT pClient = NULL; /** @todo FIX !!! */ 1763 1764 if (pClient != NULL) 1698 1765 { 1699 1766 switch (u32Function) … … 1710 1777 else 1711 1778 { 1712 vboxSvcClipboardReportMsg(g_pClient Data, VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS, u32Format);1779 vboxSvcClipboardReportMsg(g_pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS, u32Format); 1713 1780 } 1714 1781 #endif … … 1718 1785 case VBOX_CLIPBOARD_EXT_FN_DATA_READ: 1719 1786 { 1720 vboxSvcClipboardReportMsg(g_pClient Data, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, u32Format);1787 vboxSvcClipboardReportMsg(g_pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, u32Format); 1721 1788 } break; 1722 1789 #endif … … 1784 1851 g_pHelpers = ptable->pHelpers; 1785 1852 1786 ptable->cbClient = sizeof(VBOXCLIPBOARDCLIENT DATA);1853 ptable->cbClient = sizeof(VBOXCLIPBOARDCLIENT); 1787 1854 1788 1855 ptable->pfnUnload = svcUnload; -
trunk/src/VBox/HostServices/SharedClipboard/testcase/tstClipboardServiceHost.cpp
r79556 r80444 122 122 2, parms, 0); 123 123 RTTESTI_CHECK_RC(call.rc, VERR_TRY_AGAIN); /* This should get updated only when the guest call completes. */ 124 vboxSvcClipboard ReportMsg(&g_Client, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA,124 vboxSvcClipboardOldReportMsg(&g_Client, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, 125 125 VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT); 126 126 RTTESTI_CHECK(parms[0].u.uint32 == VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); … … 134 134 RTTestISub("Testing FN_GET_HOST_MSG, one format, no waiting guest calls."); 135 135 RT_ZERO(g_Client.State); 136 vboxSvcClipboard ReportMsg(&g_Client, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA,136 vboxSvcClipboardOldReportMsg(&g_Client, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, 137 137 VBOX_SHARED_CLIPBOARD_FMT_HTML); 138 138 HGCMSvcSetU32(&parms[0], 0); … … 157 157 2, parms, 0); 158 158 RTTESTI_CHECK_RC(call.rc, VERR_TRY_AGAIN); /* This should get updated only when the guest call completes. */ 159 vboxSvcClipboard ReportMsg(&g_Client, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA,159 vboxSvcClipboardOldReportMsg(&g_Client, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, 160 160 VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT | VBOX_SHARED_CLIPBOARD_FMT_HTML); 161 161 RTTESTI_CHECK(parms[0].u.uint32 == VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA); … … 175 175 RTTestISub("Testing FN_GET_HOST_MSG, two formats, no waiting guest calls."); 176 176 RT_ZERO(g_Client.State); 177 vboxSvcClipboard ReportMsg(&g_Client, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA,177 vboxSvcClipboardOldReportMsg(&g_Client, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA, 178 178 VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT | VBOX_SHARED_CLIPBOARD_FMT_HTML); 179 179 HGCMSvcSetU32(&parms[0], 0); … … 277 277 int VBoxClipboardSvcImplInit() { return VINF_SUCCESS; } 278 278 void VBoxClipboardSvcImplDestroy() { } 279 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT DATA)279 int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENT) 280 280 { return VINF_SUCCESS; } 281 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT DATA, bool)281 int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENT, bool) 282 282 { return VINF_SUCCESS; } 283 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENT DATA, unsigned int)283 int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENT, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, PSHAREDCLIPBOARDFORMATDATA pFormats) 284 284 { AssertFailed(); return VINF_SUCCESS; } 285 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENT DATA, unsigned int, void *, unsigned int, unsigned int *)285 int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENT, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, PSHAREDCLIPBOARDDATABLOCK pData, unsigned int *) 286 286 { AssertFailed(); return VERR_WRONG_ORDER; } 287 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENT DATA, void *, unsigned int, unsigned int)287 int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENT, PVBOXCLIPBOARDCLIENTCMDCTX pCmdCtx, PSHAREDCLIPBOARDDATABLOCK pData) 288 288 { AssertFailed(); return VINF_SUCCESS; } 289 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT DATA)289 int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENT) 290 290 { AssertFailed(); return VERR_WRONG_ORDER; } 291 291
Note:
See TracChangeset
for help on using the changeset viewer.