3 from tools
import helpers
4 from gi
.repository
import GLib
7 INTERFACE
= "lineageos.waydroid.IClipboard"
8 SERVICE_NAME
= "waydroidclipboard"
10 TRANSACTION_sendClipboardData
= 1
11 TRANSACTION_getClipboardData
= 2
13 def add_service(args
, sendClipboardData
, getClipboardData
):
14 helpers
.drivers
.loadBinderNodes(args
)
16 serviceManager
= gbinder
.ServiceManager("/dev/" + args
.BINDER_DRIVER
, args
.SERVICE_MANAGER_PROTOCOL
, args
.BINDER_PROTOCOL
)
18 serviceManager
= gbinder
.ServiceManager("/dev/" + args
.BINDER_DRIVER
)
20 def response_handler(req
, code
, flags
):
22 "{}: Received transaction: {}".format(SERVICE_NAME
, code
))
23 reader
= req
.init_reader()
24 local_response
= response
.new_reply()
25 if code
== TRANSACTION_sendClipboardData
:
26 arg1
= reader
.read_string16()
27 sendClipboardData(arg1
)
28 local_response
.append_int32(0)
29 elif code
== TRANSACTION_getClipboardData
:
30 ret
= getClipboardData()
31 local_response
.append_int32(0)
32 local_response
.append_string16(ret
)
34 return local_response
, -99999 # Some error unknown to binder to force a RemoteException
36 return local_response
, 0
38 def binder_presence():
39 if serviceManager
.is_present():
40 status
= serviceManager
.add_service_sync(SERVICE_NAME
, response
)
43 logging
.error("Failed to add service {}: {}".format(
44 SERVICE_NAME
, status
))
45 args
.clipboardLoop
.quit()
47 response
= serviceManager
.new_local_object(INTERFACE
, response_handler
)
48 args
.clipboardLoop
= GLib
.MainLoop()
50 status
= serviceManager
.add_presence_handler(binder_presence
)
52 args
.clipboardLoop
.run()
53 serviceManager
.remove_handler(status
)
56 logging
.error("Failed to add presence handler: {}".format(status
))