3 from __future__ import absolute_import, print_function, unicode_literals
5 from optparse import OptionParser
10 import dbus.mainloop.glib
12 from gi.repository import GObject
14 import gobject as GObject
16 BUS_NAME='org.bluez.obex'
17 PATH = '/org/bluez/obex'
18 CLIENT_INTERFACE='org.bluez.obex.Client1'
19 SESSION_INTERFACE='org.bluez.obex.Session1'
20 FILE_TRASNFER_INTERFACE='org.bluez.obex.FileTransfer1'
21 TRANSFER_INTERFACE='org.bluez.obex.Transfer1'
24 parser.add_option("-d", "--device", dest="device",
25 help="Device to connect", metavar="DEVICE")
26 parser.add_option("-c", "--chdir", dest="new_dir",
27 help="Change current directory to DIR", metavar="DIR")
28 parser.add_option("-l", "--list", action="store_true", dest="list_dir",
29 help="List the current directory")
30 parser.add_option("-g", "--get", dest="get_file",
31 help="Get FILE", metavar="FILE")
32 parser.add_option("-p", "--put", dest="put_file",
33 help="Put FILE", metavar="FILE")
34 parser.add_option("-y", "--copy", dest="copy_file",
35 help="Copy FILE", metavar="FILE")
36 parser.add_option("-m", "--move", dest="move_file",
37 help="Move FILE", metavar="FILE")
38 parser.add_option("-n", "--destname", dest="dest_file",
39 help="Destination FILE", metavar="FILE")
40 parser.add_option("-r", "--remove", dest="remove_file",
41 help="Remove FILE", metavar="FILE")
42 parser.add_option("-v", "--verbose", action="store_true",
45 return parser.parse_args()
48 def __init__(self, session_path, verbose=False):
50 self.transfer_path = None
51 self.transfer_size = 0
52 self.verbose = verbose
53 bus = dbus.SessionBus()
54 obj = bus.get_object(BUS_NAME, session_path)
55 self.session = dbus.Interface(obj, SESSION_INTERFACE)
56 self.ftp = dbus.Interface(obj, FILE_TRASNFER_INTERFACE)
57 bus.add_signal_receiver(self.properties_changed,
58 dbus_interface="org.freedesktop.DBus.Properties",
59 signal_name="PropertiesChanged",
62 def create_transfer_reply(self, path, properties):
63 self.transfer_path = path
64 self.transfer_size = properties["Size"]
66 print("Transfer created: %s" % path)
68 def generic_reply(self):
70 print("Operation succeeded")
76 def properties_changed(self, interface, properties, invalidated, path):
77 if path != self.transfer_path:
80 if "Status" in properties and \
81 (properties['Status'] == 'complete' or \
82 properties['Status'] == 'error'):
84 print("Transfer %s" % properties['Status'])
88 if "Transferred" not in properties:
91 value = properties["Transferred"]
92 speed = (value - self.transferred) / 1000
93 print("Transfer progress %d/%d at %d kBps" % (value,
96 self.transferred = value
98 def change_folder(self, new_dir):
99 for node in new_dir.split("/"):
100 self.ftp.ChangeFolder(node)
102 def list_folder(self):
103 for i in self.ftp.ListFolder():
104 if i["Type"] == "folder":
105 print("%s/" % (i["Name"]))
107 print("%s" % (i["Name"]))
109 def put_file(self, filename):
110 self.ftp.PutFile(os.path.abspath(filename),
111 os.path.basename(filename),
112 reply_handler=self.create_transfer_reply,
113 error_handler=self.error)
115 def get_file(self, filename):
116 self.ftp.GetFile(os.path.abspath(filename),
117 os.path.basename(filename),
118 reply_handler=self.create_transfer_reply,
119 error_handler=self.error)
121 def remove_file(self, filename):
122 self.ftp.Delete(filename,
123 reply_handler=self.generic_reply,
124 error_handler=self.error)
126 def move_file(self, filename, destname):
127 self.ftp.MoveFile(filename, destname,
128 reply_handler=self.generic_reply,
129 error_handler=self.error)
131 def copy_file(self, filename, destname):
132 self.ftp.CopyFile(filename, destname,
133 reply_handler=self.generic_reply,
134 error_handler=self.error)
136 if __name__ == '__main__':
138 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
140 parser = OptionParser()
142 (options, args) = parse_options()
144 if not options.device:
148 bus = dbus.SessionBus()
149 mainloop = GObject.MainLoop()
151 client = dbus.Interface(bus.get_object(BUS_NAME, PATH,),
154 print("Creating Session")
155 path = client.CreateSession(options.device, { "Target": "ftp" })
157 ftp_client = FtpClient(path, options.verbose)
160 ftp_client.change_folder(options.new_dir)
163 ftp_client.list_folder()
166 ftp_client.get_file(options.get_file)
169 ftp_client.put_file(options.put_file)
171 if options.move_file:
172 ftp_client.move_file(options.move_file, options.dest_file)
174 if options.copy_file:
175 ftp_client.copy_file(options.copy_file, options.dest_file)
177 if options.remove_file:
178 ftp_client.remove_file(options.remove_file)