import urllib
import zipfile
-try:
- import gtk
-except:
- gtk = None
+import gtk
import ninix.home
import ninix.version
-# mode masks ## FIXME
-INTERACTIVE = 1
-DOWNLOAD = 2
-
class URLopener(urllib.FancyURLopener):
version = 'ninix-aya/{0}'.format(ninix.version.VERSION)
class Installer(object):
- def __init__(self, mode=INTERACTIVE|DOWNLOAD, gui=1):
+ def __init__(self):
self.fs_encoding = 'mbcs' if os.name == 'nt' else 'utf-8'
- self.mode = mode
- if gui and gtk is not None:
- self.dialog = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION,
- buttons=gtk.BUTTONS_YES_NO)
- self.select_dialog = gtk.Dialog(
- buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
- gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
- ls = gtk.ListStore(int, str)
- tv = gtk.TreeView(model=ls)
- tv.set_rules_hint(True)
- renderer = gtk.CellRendererText()
- col0 = gtk.TreeViewColumn('No.',renderer,text=0)
- col1 = gtk.TreeViewColumn('Path',renderer,text=1)
- tv.append_column(col0)
- tv.append_column(col1)
- sw = gtk.ScrolledWindow()
- sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
- sw.add(tv)
- sw.show_all() # XXX
- self.treeview = tv
- label = gtk.Label(
- 'Multiple candidates found.\n'
- 'Select the path name of the supplement target.') ## FIXME
- ##label.set_use_markup(True)
- self.select_dialog.vbox.pack_start(label)
- label.show()
- self.select_dialog.vbox.pack_start(sw) # XXX
- self.select_dialog.set_title('Select the target') ## FIXME
- else:
- self.dialog = None
- self.select_dialog = None
- self.treeview = None
+ self.dialog = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION,
+ buttons=gtk.BUTTONS_YES_NO)
+ self.select_dialog = gtk.Dialog(
+ buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
+ gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
+ ls = gtk.ListStore(int, str)
+ tv = gtk.TreeView(model=ls)
+ tv.set_rules_hint(True)
+ renderer = gtk.CellRendererText()
+ col0 = gtk.TreeViewColumn('No.',renderer,text=0)
+ col1 = gtk.TreeViewColumn('Path',renderer,text=1)
+ tv.append_column(col0)
+ tv.append_column(col1)
+ sw = gtk.ScrolledWindow()
+ sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ sw.add(tv)
+ sw.show_all() # XXX
+ self.treeview = tv
+ label = gtk.Label(
+ 'Multiple candidates found.\n'
+ 'Select the path name of the supplement target.') ## FIXME
+ ##label.set_use_markup(True)
+ self.select_dialog.vbox.pack_start(label)
+ label.show()
+ self.select_dialog.vbox.pack_start(sw) # XXX
+ self.select_dialog.set_title('Select the target') ## FIXME
def check_archive(self, filename):
# check archive format
if filename is None:
shutil.rmtree(tmpdir)
fatal('cannot download the archive file')
- zf = zipfile.ZipFile(filename)
try:
- zf.extractall(tmpdir)
- zf.close()
+ with zipfile.ZipFile(filename) as zf:
+ for name in zf.namelist():
+ uname = name.decode('cp932') # XXX
+ buf = zf.read(name)
+ path = os.path.join(tmpdir, uname.encode(self.fs_encoding))
+ dname, fname = os.path.split(path)
+ if not os.path.exists(dname):
+ os.makedirs(dname)
+ with open(path, 'wb') as of:
+ of.write(buf)
except:
shutil.rmtree(tmpdir)
fatal('cannot extract files from the archive')
- if url and not self.mode & DOWNLOAD: ## FIXME
- os.remove(filename)
for (dirpath, dirnames, filenames) in os.walk(tmpdir):
for name in dirnames:
path = os.path.join(dirpath, name)
# logging.debug(
# '(size = {0} bytes)'.format(headers.get('content-length')))
arcdir = ninix.home.get_archive_dir()
- if self.mode & DOWNLOAD: ## FIXME
- if not os.path.exists(arcdir):
- os.makedirs(arcdir)
if not os.path.exists(arcdir):
os.makedirs(arcdir)
basedir = arcdir
return n
def confirm(self, message):
- if self.dialog is not None:
- self.dialog.set_markup(message)
- response = self.dialog.run()
- self.dialog.hide()
- return response == gtk.RESPONSE_YES
- else:
- if not self.mode & INTERACTIVE:
- return True
- print ''.join(('Ninix Install:', message, '(yes/no)'))
- try:
- answer = raw_input()
- except EOFError:
- answer = None
- except KeyboardInterrupt:
- raise SystemExit
- if not answer:
- return False
- return answer.lower().startswith('y')
+ self.dialog.set_markup(message)
+ response = self.dialog.run()
+ self.dialog.hide()
+ return response == gtk.RESPONSE_YES
def confirm_overwrite(self, path, type_string):
if os.name == 'nt':
assert len(candidates) >= 1
if len(candidates) == 1:
return candidates[0]
- if self.select_dialog is not None:
- ls = self.treeview.get_model()
- ls.clear()
- for i, item in enumerate(candidates):
- ls.append((i, item))
- ts = self.treeview.get_selection()
- ts.select_iter(ls.get_iter_first())
- response = self.select_dialog.run()
- self.select_dialog.hide()
- if response != gtk.RESPONSE_ACCEPT:
- return None
- model, it = ts.get_selected()
- return model.get_value(it, 1)
- else:
- print 'multiple candidates found'
- for i, candidate in enumerate(candidates):
- print ' ', i, candidate
- if not self.mode & INTERACTIVE: ## FIXME
- raise SystemExit
- print 'Input target number:'
- try:
- answer = raw_input()
- except EOFError:
- answer = None
- except KeyboardInterrupt:
- raise SystemExit
- try:
- num = int(answer)
- assert num < len(candidates)
- except:
- raise SystemExit
- return candidate[num]
+ ls = self.treeview.get_model()
+ ls.clear()
+ for i, item in enumerate(candidates):
+ ls.append((i, item))
+ ts = self.treeview.get_selection()
+ ts.select_iter(ls.get_iter_first())
+ response = self.select_dialog.run()
+ self.select_dialog.hide()
+ if response != gtk.RESPONSE_ACCEPT:
+ return None
+ model, it = ts.get_selected()
+ return model.get_value(it, 1)
def install_ghost(self, archive, tmpdir, homedir):
# find install.txt
self.install_files(balloon_list)
if os.path.exists(prefix):
inst_dst = ninix.home.read_install_txt(prefix)
- if not inst_dst or inst_dst.get('name') != inst.get('name'):
- self.mode |= INTERACTIVE ## FIXME
if inst.get_with_type('refresh', int, 0):
# uninstall older versions of the ghost
if self.confirm_removal(prefix, 'ghost'):
## os.path.join(dstdir, 'install.txt')))
if os.path.exists(dstdir):
inst_dst = ninix.home.read_install_txt(dstdir)
- if not inst_dst or inst_dst.get('name') != inst.get('name'):
- self.mode |= INTERACTIVE
if inst.get_with_type('refresh', int, 0):
# uninstall older versions of the balloon
if self.confirm_removal(dstdir, 'balloon'):