OSDN Git Service

hciattach_rtk: fix cast-align errors
[android-x86/external-bluetooth-bluez.git] / test / ftp-client
1 #!/usr/bin/python
2
3 from __future__ import absolute_import, print_function, unicode_literals
4
5 from optparse import OptionParser
6 import os.path
7 import sys
8 import dbus
9 import dbus.service
10 import dbus.mainloop.glib
11 try:
12   from gi.repository import GObject
13 except ImportError:
14   import gobject as GObject
15
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'
22
23 def parse_options():
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",
43                         dest="verbose")
44
45         return parser.parse_args()
46
47 class FtpClient:
48         def __init__(self, session_path, verbose=False):
49                 self.transferred = 0
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",
60                         path_keyword="path")
61
62         def create_transfer_reply(self, path, properties):
63                 self.transfer_path = path
64                 self.transfer_size = properties["Size"]
65                 if self.verbose:
66                         print("Transfer created: %s" % path)
67
68         def generic_reply(self):
69                 if self.verbose:
70                         print("Operation succeeded")
71
72         def error(self, err):
73                 print(err)
74                 mainloop.quit()
75
76         def properties_changed(self, interface, properties, invalidated, path):
77                 if path != self.transfer_path:
78                         return
79
80                 if "Status" in properties and \
81                                 (properties['Status'] == 'complete' or \
82                                 properties['Status'] == 'error'):
83                         if self.verbose:
84                                 print("Transfer %s" % properties['Status'])
85                         mainloop.quit()
86                         return
87
88                 if "Transferred" not in properties:
89                         return
90
91                 value = properties["Transferred"]
92                 speed = (value - self.transferred) / 1000
93                 print("Transfer progress %d/%d at %d kBps" % (value,
94                                                         self.transfer_size,
95                                                         speed))
96                 self.transferred = value
97
98         def change_folder(self, new_dir):
99                 for node in new_dir.split("/"):
100                         self.ftp.ChangeFolder(node)
101
102         def list_folder(self):
103                 for i in self.ftp.ListFolder():
104                         if i["Type"] == "folder":
105                                 print("%s/" % (i["Name"]))
106                         else:
107                                 print("%s" % (i["Name"]))
108
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)
114
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)
120
121         def remove_file(self, filename):
122                 self.ftp.Delete(filename,
123                                 reply_handler=self.generic_reply,
124                                 error_handler=self.error)
125
126         def move_file(self, filename, destname):
127                 self.ftp.MoveFile(filename, destname,
128                                 reply_handler=self.generic_reply,
129                                 error_handler=self.error)
130
131         def copy_file(self, filename, destname):
132                 self.ftp.CopyFile(filename, destname,
133                                 reply_handler=self.generic_reply,
134                                 error_handler=self.error)
135
136 if  __name__ == '__main__':
137
138         dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
139
140         parser = OptionParser()
141
142         (options, args) = parse_options()
143
144         if not options.device:
145                 parser.print_help()
146                 sys.exit(0)
147
148         bus = dbus.SessionBus()
149         mainloop = GObject.MainLoop()
150
151         client = dbus.Interface(bus.get_object(BUS_NAME, PATH,),
152                                                         CLIENT_INTERFACE)
153
154         print("Creating Session")
155         path = client.CreateSession(options.device, { "Target": "ftp" })
156
157         ftp_client = FtpClient(path, options.verbose)
158
159         if options.new_dir:
160                 ftp_client.change_folder(options.new_dir)
161
162         if options.list_dir:
163                 ftp_client.list_folder()
164
165         if options.get_file:
166                 ftp_client.get_file(options.get_file)
167
168         if options.put_file:
169                 ftp_client.put_file(options.put_file)
170
171         if options.move_file:
172                 ftp_client.move_file(options.move_file, options.dest_file)
173
174         if options.copy_file:
175                 ftp_client.copy_file(options.copy_file, options.dest_file)
176
177         if options.remove_file:
178                 ftp_client.remove_file(options.remove_file)
179
180         mainloop.run()