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"
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')
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
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()
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()