Copyright (C) 2004 PhiloSoft Design.
License: GPL.
-To use it install OpenOBEX (http://openobex.sourceforge.net/) and ObexFTP
-(http://triq.net/obexftp) and edit the full path to the obexftp binary.
+The script requires Midnight Commander 3.1+ (http://www.ibiblio.org/mc/),
+Python 2.2+ (http://www.python.org/), OpenOBEX 1.0.1+ (http://openobex.sourceforge.net/)
+and ObexFTP 0.10.4+ (http://triq.net/obexftp).
-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.
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. It could be very slow...
+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. 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.1 2004/06/13 13:27:47 phd Exp $"
-__date__ = "$Date: 2004/06/13 13:27:47 $"[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"
+# Change this to suite your needs
obexftp_prog = "/usr/local/obex/bin/obexftp"
-import sys, os
+import sys, time
+import os, shutil
import xml.dom.minidom
+from tempfile import mkdtemp
+
def log_error(msg):
sys.stderr.write(msg + '\n')
transport_file.close()
return ' '.join(["-t", device])
elif base_filename == "irda":
- return ' '.join(["-i"])
+ return "-i"
else:
error("Unknown transport '%s'; expected 'bluetooth', 'tty' or 'irda'" % base_filename)
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"""
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()
return
+ debug.write("Got listing of '%s'\n" % directory)
+
try:
dom = xml.dom.minidom.parseString(listing)
except:
directories = get_entries(dom, "folder")
files = get_entries(dom, "file")
- prefix = directory[1:] # omit leading slash
- debug = open("debug", 'a')
for entry in directories + files:
- print >>debug, entry.perm, "1 user group", entry.size, entry.mtime, "%s/%s" % (prefix, entry.name)
- print entry.perm, "1 user group", entry.size, entry.mtime, "%s/%s" % (prefix, entry.name)
+ 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:
- _recursive_list(obexftp_args, "%s/%s" % (directory, entry.name))
+ fullpath = "%s/%s" % (directory, entry.name)
+ if fullpath.startswith('//'): fullpath = fullpath[1:]
+ 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()