]> git.phdru.name Git - extfs.d.git/blobdiff - obexftp
Version 0.5.1. More comments. Do not need a temp dir for rm and mkdir.
[extfs.d.git] / obexftp
diff --git a/obexftp b/obexftp
index 6149cdd54eaba282538965ccc1d7d9178cdd6955..3f6d25f2c7cf5f191bc5edb024122490c918d657 100755 (executable)
--- a/obexftp
+++ b/obexftp
@@ -13,33 +13,38 @@ and ObexFTP 0.10.4+ (http://triq.net/obexftp).
 
 Edit the full path to the obexftp binary (see below). Put the file to the
 /usr/[local/]lib/mc/extfs, and add a line "obexftp" to the
 
 Edit the full path to the obexftp binary (see below). Put the file to the
 /usr/[local/]lib/mc/extfs, and add a line "obexftp" to the
-/usr/[local/]lib/mc/extfs/extfs.ini. Then create somewhere a file called
-"irda", "bluetooth" or "tty" to connect to the device using IrDA, Bluetooth or
-TTY transport.
+/usr/[local/]lib/mc/extfs/extfs.ini. Then create somewhere a transport file.
 
 
-For the "bluetooth" put there a line "CP:AD:RE:SS channel", where CP:AD:RE:SS
-is the hardware address of the device you want to connect to, and channel is
-the OBEX File Transfer channel; you can discover the address and the channel
-for your device by using commands like "hcitool scan" and "sdptool browse".
-Other lines in the file are ignored.
+The transport file can have any name, and is expected to be a text file with at
+least one line defining the transport to your device. Other lines in the file
+are ignored.
 
 
-Put a device name like /dev/rfcomm0 into the "tty" file.
+First word in the line is a transport name - Bluetooth, IrDA or TTY. The name
+is case-insensitive.
 
 
-The content for the "irda" file is ignored.
+For the Bluetooth transport put there a line "Bluetooth CP:AD:RE:SS channel",
+where CP:AD:RE:SS is the hardware address of the device you want to connect to,
+and channel is the OBEX File Transfer channel; you can discover the address and
+the channel for your device by using commands like "hcitool scan" and "sdptool
+browse".
+
+For the TTY put a device name: "tty /dev/rfcomm0".
+
+The content with the IrDA just put "IrDA" in the file.
 
 Now run this "cd" command in the Midnight Commander (in the "bindings" files
 
 Now run this "cd" command in the Midnight Commander (in the "bindings" files
-the command is "%cd"): cd bluetooth#obexftp. The VFS script use obexftp to try
-to connect to the device and list files and directories. Plese be warned that
+the command is "%cd"): cd description#obexftp. The VFS script uses obexftp to
+connect to the device and list files and directories. Plese be warned that
 opening the VFS for the first time is VERY slow, because the script needs to
 opening the VFS for the first time is VERY slow, because the script needs to
-scan the entire cell phone's filesystem. Often obexftp fails to list a
-directory, and the script retries after a second or two timeouts, which don't
-make the scanning process faster. Midnight Commander caches the result.
+scan the entire cell phone's filesystem. And there must be a timeout between
+connections, which doesn't make the scanning process faster. Midnight Commander
+caches the result, so you can browse directories quickly.
 
 """
 
 
 """
 
-__version__ = "0.3.0"
-__revision__ = "$Id: obexftp,v 1.4 2004/06/13 19:47:25 phd Exp $"
-__date__ = "$Date: 2004/06/13 19:47:25 $"[7:-2]
+__version__ = "0.5.1"
+__revision__ = "$Id: obexftp,v 1.7 2004/06/13 22:04:56 phd Exp $"
+__date__ = "$Date: 2004/06/13 22:04:56 $"[7:-2]
 __author__ = "Oleg Broytmann <phd@phd.pp.ru>"
 __copyright__ = "Copyright (C) 2004 PhiloSoft Design"
 
 __author__ = "Oleg Broytmann <phd@phd.pp.ru>"
 __copyright__ = "Copyright (C) 2004 PhiloSoft Design"
 
@@ -58,33 +63,30 @@ def log_error(msg):
    sys.stderr.write(msg + '\n')
 
 def error(msg):
    sys.stderr.write(msg + '\n')
 
 def error(msg):
-   log_error(msg + '\n')
+   log_error(msg)
    sys.exit(1)
 
 
 if len(sys.argv) < 2:
    error("""\
 It is not a program - it is a VFS for Midnight Commander.
    sys.exit(1)
 
 
 if len(sys.argv) < 2:
    error("""\
 It is not a program - it is a VFS for Midnight Commander.
-Put it in /usr/lib/mc/extfs.""")
+Put it in /usr/lib/mc/extfs. For more information read the source!""")
 
 
 def setup_transport():
    """Setup transport parameters for the obexftp program"""
 
 
 def setup_transport():
    """Setup transport parameters for the obexftp program"""
-   transport_filename = sys.argv[2]
-   base_filename = os.path.basename(transport_filename)
-
-   if base_filename == "bluetooth":
-      transport_file = open(transport_filename, 'r')
-      line = transport_file.readline().strip()
-      transport_file.close()
-      bdaddr, channel = line.split()
-      return ' '.join(["-b", bdaddr, "-B", channel])
-   elif base_filename == "tty":
-      transport_file = open(transport_filename, 'r')
-      device = transport_file.readline().strip()
-      transport_file.close()
-      return ' '.join(["-t", device])
-   elif base_filename == "irda":
+   transport_file = open(sys.argv[2], 'r')
+   line = transport_file.readline().strip()
+   transport_file.close()
+
+   parts = line.split()
+   transport = parts[0].lower()
+
+   if transport == "bluetooth":
+      return ' '.join(["-b", parts[1], "-B", parts[2]])
+   elif transport == "tty":
+      return ' '.join(["-t", parts[1]])
+   elif transport == "irda":
       return "-i"
    else:
       error("Unknown transport '%s'; expected 'bluetooth', 'tty' or 'irda'" % base_filename)
       return "-i"
    else:
       error("Unknown transport '%s'; expected 'bluetooth', 'tty' or 'irda'" % base_filename)
@@ -93,13 +95,15 @@ def setup_transport():
 # Parse ObexFTP XML directory listings
 
 class DirectoryEntry(object):
 # Parse ObexFTP XML directory listings
 
 class DirectoryEntry(object):
+   """Represent remote files and directories"""
+
    def __init__(self, type):
       self.type = type
       self.size = 0
       if type == "file":
          self.perm = "-rw-rw-rw-"
       elif type == "folder":
    def __init__(self, type):
       self.type = type
       self.size = 0
       if type == "file":
          self.perm = "-rw-rw-rw-"
       elif type == "folder":
-         self.perm = "drw-rw-rw-"
+         self.perm = "drwxrwxrwx"
       else:
          raise ValueError, "unknown type '%s'; expected 'file' or 'folder'" % self.type
 
       else:
          raise ValueError, "unknown type '%s'; expected 'file' or 'folder'" % self.type
 
@@ -128,11 +132,11 @@ class DirectoryEntry(object):
             )
       raise ValueError, "unknown type '%s'; expected 'file' or 'folder'" % self.type
 
             )
       raise ValueError, "unknown type '%s'; expected 'file' or 'folder'" % self.type
 
-def get_entries(dom, tag):
+def get_entries(dom, type):
    entries = []
    entries = []
-   for subtag in dom.getElementsByTagName(tag):
-      entry = DirectoryEntry(tag)
-      attrs = subtag.attributes
+   for obj in dom.getElementsByTagName(type):
+      entry = DirectoryEntry(type)
+      attrs = obj.attributes
       for i in range(attrs.length):
          attr = attrs.item(i)
          setattr(entry, attr.name, attr.value)
       for i in range(attrs.length):
          attr = attrs.item(i)
          setattr(entry, attr.name, attr.value)
@@ -142,33 +146,14 @@ def get_entries(dom, tag):
 
 def recursive_list(obexftp_args, directory):
    """List the directory recursively"""
 
 def recursive_list(obexftp_args, directory):
    """List the directory recursively"""
-   debug = open("debug", 'a')
-   for i in range(3):
-      time.sleep(2*i)
-      pipe = os.popen("%s %s -l '%s' 2>/dev/null" % (obexftp_prog, obexftp_args, directory), 'r')
-      listing = pipe.read()
-      pipe.close()
-
-      if listing:
-         break
-
-      debug.write("Cannot list '%s', retrying...\n" % directory)
+   pipe = os.popen("%s %s -l '%s' 2>/dev/null" % (obexftp_prog, obexftp_args, directory), 'r')
+   listing = pipe.read()
+   pipe.close()
 
    if not listing:
 
    if not listing:
-      debug.write("Cannot list '%s'\n" % directory)
-      debug.close()
       return
 
       return
 
-   debug.write("Got listing of '%s'\n" % directory)
-
-   try:
-      dom = xml.dom.minidom.parseString(listing)
-   except:
-      obex_xml = open("obex.xml", 'a')
-      obex_xml.write(listing)
-      obex_xml.close()
-      raise
-
+   dom = xml.dom.minidom.parseString(listing)
    directories = get_entries(dom, "folder")
    files = get_entries(dom, "file")
 
    directories = get_entries(dom, "folder")
    files = get_entries(dom, "file")
 
@@ -176,11 +161,11 @@ def recursive_list(obexftp_args, directory):
       fullpath = "%s/%s" % (directory, entry.name)
       if fullpath.startswith('//'): fullpath = fullpath[1:]
       print entry.perm, "1 user group", entry.size, entry.mtime, fullpath
       fullpath = "%s/%s" % (directory, entry.name)
       if fullpath.startswith('//'): fullpath = fullpath[1:]
       print entry.perm, "1 user group", entry.size, entry.mtime, fullpath
-   debug.close()
 
    for entry in directories:
       fullpath = "%s/%s" % (directory, entry.name)
       if fullpath.startswith('//'): fullpath = fullpath[1:]
 
    for entry in directories:
       fullpath = "%s/%s" % (directory, entry.name)
       if fullpath.startswith('//'): fullpath = fullpath[1:]
+      time.sleep(1)
       recursive_list(obexftp_args, fullpath)
 
 def mcobex_list():
       recursive_list(obexftp_args, fullpath)
 
 def mcobex_list():
@@ -206,58 +191,49 @@ def cleanup_tmpdir():
 def mcobex_copyout():
    """Get a file from the VFS"""
    obexftp_args = setup_transport()
 def mcobex_copyout():
    """Get a file from the VFS"""
    obexftp_args = setup_transport()
-   dummy_filename = sys.argv[3]
+   obex_filename = sys.argv[3]
    real_filename = sys.argv[4]
 
    setup_tmpdir()
    real_filename = sys.argv[4]
 
    setup_tmpdir()
-   os.system("%s %s -g '%s' 2>/dev/null" % (obexftp_prog, obexftp_args, dummy_filename))
-   os.rename(os.path.basename(dummy_filename), real_filename)
+   os.system("%s %s -g '%s' 2>/dev/null" % (obexftp_prog, obexftp_args, obex_filename))
+   try:
+      os.rename(os.path.basename(obex_filename), real_filename)
+   except OSError:
+      pass
    cleanup_tmpdir()
 
 
 def mcobex_copyin():
    """Put a file to the VFS"""
    obexftp_args = setup_transport()
    cleanup_tmpdir()
 
 
 def mcobex_copyin():
    """Put a file to the VFS"""
    obexftp_args = setup_transport()
-   dummy_filename = sys.argv[3]
+   obex_filename = sys.argv[3]
    real_filename = sys.argv[4]
    real_filename = sys.argv[4]
-   dirname, filname = os.path.split(dummy_filename)
+   dirname, filename = os.path.split(obex_filename)
 
    setup_tmpdir()
 
    setup_tmpdir()
-   os.rename(real_filename, )
+   os.rename(real_filename, filename)
    os.system("%s %s -c '%s' -p '%s' 2>/dev/null" % (obexftp_prog, obexftp_args,
       dirname, filename
    ))
    os.system("%s %s -c '%s' -p '%s' 2>/dev/null" % (obexftp_prog, obexftp_args,
       dirname, filename
    ))
+   os.rename(filename, real_filename) # by some reason MC wants the file back
    cleanup_tmpdir()
 
 
 def mcobex_rm():
    """Remove a file from the VFS"""
    obexftp_args = setup_transport()
    cleanup_tmpdir()
 
 
 def mcobex_rm():
    """Remove a file from the VFS"""
    obexftp_args = setup_transport()
-   dummy_filename = sys.argv[3]
-
-   real_file = open(".dummy.tmp", 'a')
-   real_file.write("Remove %s\n" % dummy_filename)
-   real_file.close()
+   obex_filename = sys.argv[3]
+   os.system("%s %s -k '%s' 2>/dev/null" % (obexftp_prog, obexftp_args, obex_filename))
 
 
 def mcobex_mkdir():
    """Create a directory in the VFS"""
    obexftp_args = setup_transport()
 
 
 def mcobex_mkdir():
    """Create a directory in the VFS"""
    obexftp_args = setup_transport()
-   dummy_dirname = sys.argv[3]
+   obex_dirname = sys.argv[3]
+   os.system("%s %s -C '%s' 2>/dev/null" % (obexftp_prog, obexftp_args, obex_dirname))
 
 
-   real_file = open(".dummy.tmp", 'a')
-   real_file.write("Create %s\n" % dummy_dirname)
-   real_file.close()
 
 
-
-def mcobex_rmdir():
-   """Remove a directory from the VFS"""
-   obexftp_args = setup_transport()
-   dummy_dirname = sys.argv[3]
-
-   real_file = open(".dummy.tmp", 'a')
-   real_file.write("Remove %s\n" % dummy_dirname)
-   real_file.close()
+mcobex_rmdir = mcobex_rm
 
 
 g = globals()
 
 
 g = globals()
@@ -267,11 +243,4 @@ procname = "mcobex_" + command
 if not g.has_key(procname):
    error("Unknown command %s" % command)
 
 if not g.has_key(procname):
    error("Unknown command %s" % command)
 
-try:
-   g[procname]()
-except:
-   import traceback
-   error = open("error", 'a')
-   traceback.print_exc(file=error)
-   error.close()
-   sys.exit(1)
+g[procname]()