■ ■ ■ ■ ■ ■
aardwolf/extensions/RDPECLIP/channel.py
| skipped 149 lines |
150 | 150 | | msg.data = fmtdata.dataobj |
151 | 151 | | msg.datatype = self.__requested_format |
152 | 152 | | await self.send_user_data(msg) |
| 153 | + | self.__current_clipboard_data = msg |
153 | 154 | | |
154 | 155 | | except Exception as e: |
155 | 156 | | raise e |
| skipped 103 lines |
259 | 260 | | traceback.print_exc() |
260 | 261 | | return None,e |
261 | 262 | | |
| 263 | + | async def get_current_clipboard_text(self): |
| 264 | + | if self.__current_clipboard_data is None: |
| 265 | + | return '' |
| 266 | + | return str(self.__current_clipboard_data.data) |
| 267 | + | |
| 268 | + | async def set_current_clipboard_text(self, text:str): |
| 269 | + | data = RDP_CLIPBOARD_DATA_TXT() |
| 270 | + | data.datatype = CLIPBRD_FORMAT.CF_UNICODETEXT |
| 271 | + | data.data = text |
| 272 | + | await self.set_clipboard_data(data) |
| 273 | + | |
| 274 | + | |
| 275 | + | async def set_clipboard_data(self, data, force_refresh = True): |
| 276 | + | if data == self.__current_clipboard_data and force_refresh is False: |
| 277 | + | return |
| 278 | + | |
| 279 | + | fmtl = CLIPRDR_FORMAT_LIST() |
| 280 | + | for fmtid in [CLIPBRD_FORMAT.CF_UNICODETEXT]: #CLIPBRD_FORMAT.CF_TEXT, CLIPBRD_FORMAT.CF_OEMTEXT |
| 281 | + | if CB_GENERAL_FALGS.USE_LONG_FORMAT_NAMES not in self.server_general_caps.generalFlags: |
| 282 | + | name = CLIPRDR_LONG_FORMAT_NAME() |
| 283 | + | name.formatId = data.datatype |
| 284 | + | else: |
| 285 | + | name = CLIPRDR_SHORT_FORMAT_NAME() |
| 286 | + | name.formatId = data.datatype |
| 287 | + | fmtl.templist.append(name) |
| 288 | + | msg = CLIPRDR_HEADER.serialize_packet(CB_TYPE.CB_FORMAT_LIST, 0, fmtl) |
| 289 | + | await self.fragment_and_send(msg) |
| 290 | + | |
| 291 | + | self.__current_clipboard_data = data |
262 | 292 | | |
263 | 293 | | async def process_user_data(self, data): |
264 | 294 | | #print('clipboard out! %s' % data) |
265 | 295 | | if data.type == RDPDATATYPE.CLIPBOARD_DATA_TXT: |
266 | | - | # data in, informing the server that our clipboard has changed |
267 | | - | if data == self.__current_clipboard_data: |
268 | | - | return |
269 | | - | |
270 | | - | fmtl = CLIPRDR_FORMAT_LIST() |
271 | | - | for fmtid in [CLIPBRD_FORMAT.CF_UNICODETEXT]: #CLIPBRD_FORMAT.CF_TEXT, CLIPBRD_FORMAT.CF_OEMTEXT |
272 | | - | if CB_GENERAL_FALGS.USE_LONG_FORMAT_NAMES not in self.server_general_caps.generalFlags: |
273 | | - | name = CLIPRDR_LONG_FORMAT_NAME() |
274 | | - | name.formatId = data.datatype |
275 | | - | else: |
276 | | - | name = CLIPRDR_SHORT_FORMAT_NAME() |
277 | | - | name.formatId = data.datatype |
278 | | - | fmtl.templist.append(name) |
279 | | - | msg = CLIPRDR_HEADER.serialize_packet(CB_TYPE.CB_FORMAT_LIST, 0, fmtl) |
280 | | - | await self.fragment_and_send(msg) |
281 | | - | |
282 | | - | self.__current_clipboard_data = data |
| 296 | + | await self.set_clipboard_data(data, False) |
283 | 297 | | |
284 | 298 | | else: |
285 | 299 | | logger.debug('Unhandled data type in! %s' % data.type) |