]> git.phdru.name Git - extfs.d.git/blobdiff - obexftp
Version 0.4.0. rm, mkdir, rmdir. A lot of bugfixes in copy-in/out.
[extfs.d.git] / obexftp
diff --git a/obexftp b/obexftp
index a8ad677a9572cddc78732e1128b7dd6b87b64dfb..163e793bd797154fada953fac2cd42cae933a219 100755 (executable)
--- a/obexftp
+++ b/obexftp
@@ -31,15 +31,15 @@ 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
 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.
 
 """
 
-__version__ = "0.1.0"
-__revision__ = "$Id: obexftp,v 1.2 2004/06/13 18:49:25 phd Exp $"
-__date__ = "$Date: 2004/06/13 18:49:25 $"[7:-2]
+__version__ = "0.4.0"
+__revision__ = "$Id: obexftp,v 1.5 2004/06/13 21:31:52 phd Exp $"
+__date__ = "$Date: 2004/06/13 21:31:52 $"[7:-2]
 __author__ = "Oleg Broytmann <phd@phd.pp.ru>"
 __copyright__ = "Copyright (C) 2004 PhiloSoft Design"
 
@@ -48,8 +48,11 @@ __copyright__ = "Copyright (C) 2004 PhiloSoft Design"
 obexftp_prog = "/usr/local/obex/bin/obexftp"
 
 
-import sys, os, time
+import sys, time
+import os, shutil
 import xml.dom.minidom
+from tempfile import mkdtemp
+
 
 def log_error(msg):
    sys.stderr.write(msg + '\n')
@@ -96,7 +99,7 @@ class DirectoryEntry(object):
       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
 
@@ -137,20 +140,13 @@ def get_entries(dom, tag):
    return entries
 
 
-def _recursive_list(obexftp_args, directory):
+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()
 
+   debug = open("debug", 'a')
    if not listing:
       debug.write("Cannot list '%s'\n" % directory)
       debug.close()
@@ -178,66 +174,81 @@ def _recursive_list(obexftp_args, directory):
    for entry in directories:
       fullpath = "%s/%s" % (directory, entry.name)
       if fullpath.startswith('//'): fullpath = fullpath[1:]
-      _recursive_list(obexftp_args, fullpath)
+      time.sleep(1)
+      recursive_list(obexftp_args, fullpath)
 
 def mcobex_list():
    """List the entire VFS"""
    obexftp_args = setup_transport()
-   _recursive_list(obexftp_args, '/')
+   recursive_list(obexftp_args, '/')
+
+
+# A unique directory for temporary files
+
+tmpdir_name = None
+
+def setup_tmpdir():
+   global tmpdir_name
+   tmpdir_name = mkdtemp(".tmp", "mcobex-")
+   os.chdir(tmpdir_name)
+
+def cleanup_tmpdir():
+   os.chdir(os.pardir)
+   shutil.rmtree(tmpdir_name)
 
 
 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]
 
-   real_file = open(real_filename, 'w')
-   real_file.write("Copied from %s\n" % dummy_filename)
-   real_file.write("Copied  to  %s\n" % real_filename)
-   real_file.close()
+   setup_tmpdir()
+   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()
-   dummy_filename = sys.argv[3]
+   obex_filename = sys.argv[3]
    real_filename = sys.argv[4]
+   dirname, filename = os.path.split(obex_filename)
 
-   real_file = open(real_filename + "-dummy.tmp", 'w')
-   real_file.write("Copied from %s\n" % real_filename)
-   real_file.write("Copied  to  %s\n" % dummy_filename)
-   real_file.close()
+   setup_tmpdir()
+   os.rename(real_filename, 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()
-   dummy_filename = sys.argv[3]
+   obex_filename = sys.argv[3]
 
-   real_file = open(".dummy.tmp", 'a')
-   real_file.write("Remove %s\n" % dummy_filename)
-   real_file.close()
+   setup_tmpdir()
+   os.system("%s %s -k '%s' 2>/dev/null" % (obexftp_prog, obexftp_args, obex_filename))
+   cleanup_tmpdir()
 
 
 def mcobex_mkdir():
    """Create a directory in the VFS"""
    obexftp_args = setup_transport()
-   dummy_dirname = sys.argv[3]
-
-   real_file = open(".dummy.tmp", 'a')
-   real_file.write("Create %s\n" % dummy_dirname)
-   real_file.close()
+   obex_dirname = sys.argv[3]
 
+   setup_tmpdir()
+   os.system("%s %s -C '%s' 2>/dev/null" % (obexftp_prog, obexftp_args, obex_dirname))
+   cleanup_tmpdir()
 
-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()