upgrade obexd to 0.47
[profile/ivi/obexd.git] / test / ftp-client
index 9bc038d..064a81a 100755 (executable)
@@ -9,162 +9,175 @@ import dbus.mainloop.glib
 import os.path
 from optparse import OptionParser
 
-class Agent(dbus.service.Object):
-    def __init__(self, conn=None, obj_path=None, verbose=False):
-        dbus.service.Object.__init__(self, conn, obj_path)
-        self.verbose = verbose
-
-    @dbus.service.method("org.openobex.Agent",
-                    in_signature="o", out_signature="s")
-    def Request(self, path):
-        return ""
-
-    @dbus.service.method("org.openobex.Agent",
-                    in_signature="ot", out_signature="")
-    def Progress(self, path, transferred):
-        if self.verbose:
-            print "Transfer progress (%d bytes)" % (transferred)
-        return
-
-    @dbus.service.method("org.openobex.Agent",
-                    in_signature="o", out_signature="")
-    def Complete(self, path):
-        if self.verbose:
-            print "Transfer finished"
-        mainloop.quit()
-
-    @dbus.service.method("org.openobex.Agent",
-                    in_signature="os", out_signature="")
-    def Error(self, path, error):
-        print "Transfer finished with an error: %s" % (error)
-        mainloop.quit()
-
-    @dbus.service.method("org.openobex.Agent",
-                    in_signature="", out_signature="")
-    def Release(self):
-        mainloop.quit()
-
-
 def parse_options():
-    parser.add_option("-d", "--device", dest="device",
-                      help="Device to connect", metavar="DEVICE")
-    parser.add_option("-c", "--chdir", dest="new_dir",
-                      help="Change current directory to DIR", metavar="DIR")
-    parser.add_option("-l", "--list", action="store_true", dest="list_dir",
-                      help="List the current directory")
-    parser.add_option("-g", "--get", dest="get_file",
-                      help="Get FILE", metavar="FILE")
-    parser.add_option("-p", "--put", dest="put_file",
-                      help="Put FILE", metavar="FILE")
-    parser.add_option("-y", "--copy", dest="copy_file",
-                      help="Copy FILE", metavar="FILE")
-    parser.add_option("-m", "--move", dest="move_file",
-                      help="Move FILE", metavar="FILE")
-    parser.add_option("-n", "--destname", dest="dest_file",
-                      help="Destination FILE", metavar="FILE")
-    parser.add_option("-r", "--remove", dest="remove_file",
-                      help="Remove FILE", metavar="FILE")
-    parser.add_option("-v", "--verbose", action="store_true", dest="verbose")
-
-    return parser.parse_args()
-
-def error(err):
-    print err
-
-def void_reply():
-    pass
-
-def change_folder(session, new_dir):
-    for node in new_dir.split("/"):
-        session.ChangeFolder(node)
-
-def list_folder(session):
-    for i in session.ListFolder():
-        if i["Type"] == "folder":
-            print "%s/" % (i["Name"])
-        else:
-            print "%s" % (i["Name"])
-
-def put_file(session, filename):
-    session.PutFile(os.path.abspath(filename),
-                    os.path.basename(filename),
-                    reply_handler=void_reply,
-                    error_handler=error)
-
-def get_file(session, filename):
-    session.GetFile(os.path.abspath(filename),
-                    os.path.basename(filename),
-                    reply_handler=void_reply,
-                    error_handler=error)
-
-def remove_file(session, filename):
-    session.Delete(filename,
-                    reply_handler=void_reply,
-                    error_handler=error)
-
-def move_file(session, filename, destname):
-    session.MoveFile(filename,
-                    destname,
-                    reply_handler=void_reply,
-                    error_handler=error)
-
-def copy_file(session, filename, destname):
-    session.CopyFile(filename,
-                    destname,
-                    reply_handler=void_reply,
-                    error_handler=error)
+       parser.add_option("-d", "--device", dest="device",
+                       help="Device to connect", metavar="DEVICE")
+       parser.add_option("-c", "--chdir", dest="new_dir",
+                       help="Change current directory to DIR", metavar="DIR")
+       parser.add_option("-l", "--list", action="store_true", dest="list_dir",
+                       help="List the current directory")
+       parser.add_option("-g", "--get", dest="get_file",
+                       help="Get FILE", metavar="FILE")
+       parser.add_option("-p", "--put", dest="put_file",
+                       help="Put FILE", metavar="FILE")
+       parser.add_option("-y", "--copy", dest="copy_file",
+                       help="Copy FILE", metavar="FILE")
+       parser.add_option("-m", "--move", dest="move_file",
+                       help="Move FILE", metavar="FILE")
+       parser.add_option("-n", "--destname", dest="dest_file",
+                       help="Destination FILE", metavar="FILE")
+       parser.add_option("-r", "--remove", dest="remove_file",
+                       help="Remove FILE", metavar="FILE")
+       parser.add_option("-v", "--verbose", action="store_true",
+                       dest="verbose")
+
+       return parser.parse_args()
+
+class FtpClient:
+       def __init__(self, session_path, verbose=False):
+               self.progress = 0
+               self.transfer_path = None
+               self.transfer_size = 0
+               self.verbose = verbose
+               bus = dbus.SessionBus()
+               obj = bus.get_object("org.bluez.obex.client", session_path)
+               self.session = dbus.Interface(obj, "org.bluez.obex.Session")
+               self.ftp = dbus.Interface(obj, "org.bluez.obex.FileTransfer")
+               bus.add_signal_receiver(self.transfer_complete,
+                               dbus_interface="org.bluez.obex.Transfer",
+                               signal_name="Complete",
+                               path_keyword="path")
+               bus.add_signal_receiver(self.transfer_error,
+                               dbus_interface="org.bluez.obex.Transfer",
+                               signal_name="Error",
+                               path_keyword="path")
+               if self.verbose:
+                       bus.add_signal_receiver(self.transfer_progress,
+                               dbus_interface="org.bluez.obex.Transfer",
+                               signal_name="PropertyChanged",
+                               path_keyword="path")
+
+       def create_transfer_reply(self, reply):
+               (path, properties) = reply
+               self.transfer_path = path
+               self.transfer_size = properties["Size"]
+               if self.verbose:
+                       print "Transfer created: %s" % path
+
+       def generic_reply(self):
+               if self.verbose:
+                       print "Operation succeeded"
+
+       def error(self, err):
+               print err
+               mainloop.quit()
+
+       def transfer_complete(self, path):
+               if path != self.transfer_path:
+                       return
+               if self.verbose:
+                       print "Transfer finished"
+               mainloop.quit()
+
+       def transfer_error(self, code, message, path):
+               if path != self.transfer_path:
+                       return
+               print "Transfer finished with error %s: %s" % (code, message)
+               mainloop.quit()
+
+       def transfer_progress(self, prop, value, path):
+               if path != self.transfer_path:
+                       return
+
+               if prop != "Progress":
+                       return
+
+               speed = (value - self.progress) / 1000
+               print "Transfer progress %d/%d at %d kBps" % (value,
+                                                       self.transfer_size,
+                                                       speed)
+               self.progress = value
+
+       def change_folder(self, new_dir):
+               for node in new_dir.split("/"):
+                       self.ftp.ChangeFolder(node)
+
+       def list_folder(self):
+               for i in self.ftp.ListFolder():
+                       if i["Type"] == "folder":
+                               print "%s/" % (i["Name"])
+                       else:
+                               print "%s" % (i["Name"])
+
+       def put_file(self, filename):
+               self.ftp.PutFile(os.path.abspath(filename),
+                               os.path.basename(filename),
+                               reply_handler=self.create_transfer_reply,
+                               error_handler=self.error)
+
+       def get_file(self, filename):
+               self.ftp.GetFile(os.path.abspath(filename),
+                               os.path.basename(filename),
+                               reply_handler=self.create_transfer_reply,
+                               error_handler=self.error)
+
+       def remove_file(self, filename):
+               self.ftp.Delete(filename,
+                               reply_handler=self.generic_reply,
+                               error_handler=self.error)
+
+       def move_file(self, filename, destname):
+               self.ftp.MoveFile(filename, destname,
+                               reply_handler=self.generic_reply,
+                               error_handler=self.error)
+
+       def copy_file(self, filename, destname):
+               self.ftp.CopyFile(filename, destname,
+                               reply_handler=self.generic_reply,
+                               error_handler=self.error)
 
 if  __name__ == '__main__':
 
-    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-
-    parser = OptionParser()
-
-    (options, args) = parse_options()
-
-    if not options.device:
-        parser.print_help()
-        sys.exit(0)
+       dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
 
-    bus = dbus.SessionBus()
-    mainloop = gobject.MainLoop()
+       parser = OptionParser()
 
-    path = "/test/agent"
-    agent = Agent(bus, path, options.verbose)
+       (options, args) = parse_options()
 
-    client = dbus.Interface(bus.get_object("org.openobex.client", "/"),
-                            "org.openobex.Client")
+       if not options.device:
+               parser.print_help()
+               sys.exit(0)
 
-    session_path = client.CreateSession({ "Destination": options.device,
-                                          "Target": "ftp"})
+       bus = dbus.SessionBus()
+       mainloop = gobject.MainLoop()
 
-    session = dbus.Interface(bus.get_object("org.openobex.client", session_path),
-                 "org.openobex.Session")
+       client = dbus.Interface(bus.get_object("org.bluez.obex.client", "/"),
+                               "org.bluez.obex.Client")
 
-    session.AssignAgent(path)
+       print "Creating Session"
+       path = client.CreateSession(options.device, { "Target": "ftp" })
 
-    ftp = dbus.Interface(bus.get_object("org.openobex.client", session_path),
-                 "org.openobex.FileTransfer")
+       ftp_client = FtpClient(path, options.verbose)
 
-    if options.new_dir:
-        change_folder(ftp, options.new_dir)
+       if options.new_dir:
+               ftp_client.change_folder(options.new_dir)
 
-    if options.list_dir:
-        list_folder(ftp)
+       if options.list_dir:
+               ftp_client.list_folder()
 
-    if options.get_file:
-        get_file(ftp, options.get_file)
+       if options.get_file:
+               ftp_client.get_file(options.get_file)
 
-    if options.put_file:
-        put_file(ftp, options.put_file)
+       if options.put_file:
+               ftp_client.put_file(options.put_file)
 
-    if options.move_file:
-        move_file(ftp, options.move_file, options.dest_file)
+       if options.move_file:
+               ftp_client.move_file(options.move_file, options.dest_file)
 
-    if options.copy_file:
-        copy_file(ftp, options.copy_file, options.dest_file)
+       if options.copy_file:
+               ftp_client.copy_file(options.copy_file, options.dest_file)
 
-    if options.remove_file:
-       remove_file(ftp, options.remove_file)
+       if options.remove_file:
+               ftp_client.remove_file(options.remove_file)
 
-    mainloop.run()
+       mainloop.run()