home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_2843 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  15.5 KB  |  623 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import os
  5. import shlex
  6. import sys
  7. import stat
  8. import subprocess
  9. import time
  10. __all__ = [
  11.     'Error',
  12.     'open',
  13.     'open_new',
  14.     'open_new_tab',
  15.     'get',
  16.     'register']
  17.  
  18. class Error(Exception):
  19.     pass
  20.  
  21. _browsers = { }
  22. _tryorder = []
  23.  
  24. def register(name, klass, instance = None, update_tryorder = 1):
  25.     _browsers[name.lower()] = [
  26.         klass,
  27.         instance]
  28.     if update_tryorder > 0:
  29.         _tryorder.append(name)
  30.     elif update_tryorder < 0:
  31.         _tryorder.insert(0, name)
  32.     
  33.  
  34.  
  35. def get(using = None):
  36.     if using is not None:
  37.         alternatives = [
  38.             using]
  39.     else:
  40.         alternatives = _tryorder
  41.     for browser in alternatives:
  42.         if '%s' in browser:
  43.             browser = shlex.split(browser)
  44.             if browser[-1] == '&':
  45.                 return BackgroundBrowser(browser[:-1])
  46.             return GenericBrowser(browser)
  47.         '%s' in browser
  48.         
  49.         try:
  50.             command = _browsers[browser.lower()]
  51.         except KeyError:
  52.             command = _synthesize(browser)
  53.  
  54.         if command[1] is not None:
  55.             return command[1]
  56.         if command[0] is not None:
  57.             return command[0]()
  58.     
  59.     raise Error('could not locate runnable browser')
  60.  
  61.  
  62. def open(url, new = 0, autoraise = 1):
  63.     for name in _tryorder:
  64.         browser = get(name)
  65.         if browser.open(url, new, autoraise):
  66.             return True
  67.     
  68.     return False
  69.  
  70.  
  71. def open_new(url):
  72.     return open(url, 1)
  73.  
  74.  
  75. def open_new_tab(url):
  76.     return open(url, 2)
  77.  
  78.  
  79. def _synthesize(browser, update_tryorder = 1):
  80.     cmd = browser.split()[0]
  81.     if not _iscommand(cmd):
  82.         return [
  83.             None,
  84.             None]
  85.     name = os.path.basename(cmd)
  86.     
  87.     try:
  88.         command = _browsers[name.lower()]
  89.     except KeyError:
  90.         _iscommand(cmd)
  91.         _iscommand(cmd)
  92.         return [
  93.             None,
  94.             None]
  95.  
  96.     controller = command[1]
  97.     if controller and name.lower() == controller.basename:
  98.         import copy
  99.         controller = copy.copy(controller)
  100.         controller.name = browser
  101.         controller.basename = os.path.basename(browser)
  102.         register(browser, None, controller, update_tryorder)
  103.         return [
  104.             None,
  105.             controller]
  106.     return [
  107.         None,
  108.         None]
  109.  
  110. if sys.platform[:3] == 'win':
  111.     
  112.     def _isexecutable(cmd):
  113.         cmd = cmd.lower()
  114.         if os.path.isfile(cmd) and cmd.endswith(('.exe', '.bat')):
  115.             return True
  116.         for ext in ('.exe', '.bat'):
  117.             if os.path.isfile(cmd + ext):
  118.                 return True
  119.         
  120.         return False
  121.  
  122. else:
  123.     
  124.     def _isexecutable(cmd):
  125.         if os.path.isfile(cmd):
  126.             mode = os.stat(cmd)[stat.ST_MODE]
  127.             if mode & stat.S_IXUSR and mode & stat.S_IXGRP or mode & stat.S_IXOTH:
  128.                 return True
  129.         
  130.         return False
  131.  
  132.  
  133. def _iscommand(cmd):
  134.     if _isexecutable(cmd):
  135.         return True
  136.     path = os.environ.get('PATH')
  137.     if not path:
  138.         return False
  139.     for d in path.split(os.pathsep):
  140.         exe = os.path.join(d, cmd)
  141.         if _isexecutable(exe):
  142.             return True
  143.     
  144.     return False
  145.  
  146.  
  147. class BaseBrowser(object):
  148.     args = [
  149.         '%s']
  150.     
  151.     def __init__(self, name = ''):
  152.         self.name = name
  153.         self.basename = name
  154.  
  155.     
  156.     def open(self, url, new = 0, autoraise = 1):
  157.         raise NotImplementedError
  158.  
  159.     
  160.     def open_new(self, url):
  161.         return self.open(url, 1)
  162.  
  163.     
  164.     def open_new_tab(self, url):
  165.         return self.open(url, 2)
  166.  
  167.  
  168.  
  169. class GenericBrowser(BaseBrowser):
  170.     
  171.     def __init__(self, name):
  172.         if isinstance(name, basestring):
  173.             self.name = name
  174.             self.args = [
  175.                 '%s']
  176.         else:
  177.             self.name = name[0]
  178.             self.args = name[1:]
  179.         self.basename = os.path.basename(self.name)
  180.  
  181.     
  182.     def open(self, url, new = 0, autoraise = 1):
  183.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  184.         
  185.         try:
  186.             return not p.wait()
  187.         except OSError:
  188.             []
  189.             []
  190.             [
  191.                 self.name]
  192.             return False
  193.  
  194.  
  195.  
  196.  
  197. class BackgroundBrowser(GenericBrowser):
  198.     
  199.     def open(self, url, new = 0, autoraise = 1):
  200.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  201.         
  202.         try:
  203.             if sys.platform[:3] == 'win':
  204.                 p = subprocess.Popen(cmdline)
  205.             else:
  206.                 setsid = getattr(os, 'setsid', None)
  207.                 if not setsid:
  208.                     setsid = getattr(os, 'setpgrp', None)
  209.                 
  210.                 p = subprocess.Popen(cmdline, close_fds = True, preexec_fn = setsid)
  211.             return p.poll() is None
  212.         except OSError:
  213.             []
  214.             []
  215.             [
  216.                 self.name]
  217.             return False
  218.  
  219.  
  220.  
  221.  
  222. class UnixBrowser(BaseBrowser):
  223.     raise_opts = None
  224.     remote_args = [
  225.         '%action',
  226.         '%s']
  227.     remote_action = None
  228.     remote_action_newwin = None
  229.     remote_action_newtab = None
  230.     background = False
  231.     redirect_stdout = True
  232.     
  233.     def _invoke(self, args, remote, autoraise):
  234.         raise_opt = []
  235.         if remote and self.raise_opts:
  236.             autoraise = int(bool(autoraise))
  237.             opt = self.raise_opts[autoraise]
  238.             if opt:
  239.                 raise_opt = [
  240.                     opt]
  241.             
  242.         
  243.         cmdline = [
  244.             self.name] + raise_opt + args
  245.         if remote or self.background:
  246.             inout = file(os.devnull, 'r+')
  247.         else:
  248.             inout = None
  249.         setsid = getattr(os, 'setsid', None)
  250.         if not setsid:
  251.             setsid = getattr(os, 'setpgrp', None)
  252.         
  253.         if not self.redirect_stdout or inout:
  254.             pass
  255.         p = subprocess.Popen(cmdline, close_fds = True, stdin = inout, stdout = None, stderr = inout, preexec_fn = setsid)
  256.         if remote:
  257.             time.sleep(1)
  258.             rc = p.poll()
  259.             if rc is None:
  260.                 time.sleep(4)
  261.                 rc = p.poll()
  262.                 if rc is None:
  263.                     return True
  264.             
  265.             return not rc
  266.         if self.background:
  267.             if p.poll() is None:
  268.                 return True
  269.             return False
  270.         self.background
  271.         return not p.wait()
  272.  
  273.     
  274.     def open(self, url, new = 0, autoraise = 1):
  275.         if new == 0:
  276.             action = self.remote_action
  277.         elif new == 1:
  278.             action = self.remote_action_newwin
  279.         elif new == 2:
  280.             if self.remote_action_newtab is None:
  281.                 action = self.remote_action_newwin
  282.             else:
  283.                 action = self.remote_action_newtab
  284.         else:
  285.             raise Error("Bad 'new' parameter to open(); " + 'expected 0, 1, or 2, got %s' % new)
  286.         args = [ arg.replace('%s', url).replace('%action', action) for arg in self.remote_args ]
  287.         success = self._invoke(args, True, autoraise)
  288.         if not success:
  289.             args = [ arg.replace('%s', url) for arg in self.args ]
  290.             return self._invoke(args, False, False)
  291.         return True
  292.  
  293.  
  294.  
  295. class Mozilla(UnixBrowser):
  296.     raise_opts = [
  297.         '-noraise',
  298.         '-raise']
  299.     remote_args = [
  300.         '-remote',
  301.         'openURL(%s%action)']
  302.     remote_action = ''
  303.     remote_action_newwin = ',new-window'
  304.     remote_action_newtab = ',new-tab'
  305.     background = True
  306.  
  307. Netscape = Mozilla
  308.  
  309. class Galeon(UnixBrowser):
  310.     raise_opts = [
  311.         '-noraise',
  312.         '']
  313.     remote_args = [
  314.         '%action',
  315.         '%s']
  316.     remote_action = '-n'
  317.     remote_action_newwin = '-w'
  318.     background = True
  319.  
  320.  
  321. class Opera(UnixBrowser):
  322.     raise_opts = [
  323.         '',
  324.         '-raise']
  325.     remote_args = [
  326.         '-remote',
  327.         'openURL(%s%action)']
  328.     remote_action = ''
  329.     remote_action_newwin = ',new-window'
  330.     remote_action_newtab = ',new-page'
  331.     background = True
  332.  
  333.  
  334. class Elinks(UnixBrowser):
  335.     remote_args = [
  336.         '-remote',
  337.         'openURL(%s%action)']
  338.     remote_action = ''
  339.     remote_action_newwin = ',new-window'
  340.     remote_action_newtab = ',new-tab'
  341.     background = False
  342.     redirect_stdout = False
  343.  
  344.  
  345. class Konqueror(BaseBrowser):
  346.     
  347.     def open(self, url, new = 0, autoraise = 1):
  348.         if new == 2:
  349.             action = 'newTab'
  350.         else:
  351.             action = 'openURL'
  352.         devnull = file(os.devnull, 'r+')
  353.         setsid = getattr(os, 'setsid', None)
  354.         if not setsid:
  355.             setsid = getattr(os, 'setpgrp', None)
  356.         
  357.         
  358.         try:
  359.             p = subprocess.Popen([
  360.                 'kfmclient',
  361.                 action,
  362.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull)
  363.         except OSError:
  364.             pass
  365.  
  366.         p.wait()
  367.         return True
  368.         
  369.         try:
  370.             p = subprocess.Popen([
  371.                 'konqueror',
  372.                 '--silent',
  373.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  374.         except OSError:
  375.             pass
  376.  
  377.         if p.poll() is None:
  378.             return True
  379.         
  380.         try:
  381.             p = subprocess.Popen([
  382.                 'kfm',
  383.                 '-d',
  384.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  385.         except OSError:
  386.             p.poll() is None
  387.             p.poll() is None
  388.             return False
  389.  
  390.         return p.poll() is None
  391.  
  392.  
  393.  
  394. class Grail(BaseBrowser):
  395.     
  396.     def _find_grail_rc(self):
  397.         import glob
  398.         import pwd
  399.         import socket
  400.         import tempfile
  401.         tempdir = os.path.join(tempfile.gettempdir(), '.grail-unix')
  402.         user = pwd.getpwuid(os.getuid())[0]
  403.         filename = os.path.join(tempdir, user + '-*')
  404.         maybes = glob.glob(filename)
  405.         if not maybes:
  406.             return None
  407.         s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  408.         for fn in maybes:
  409.             
  410.             try:
  411.                 s.connect(fn)
  412.             except socket.error:
  413.                 maybes
  414.                 maybes
  415.                 
  416.                 try:
  417.                     os.unlink(fn)
  418.                 except IOError:
  419.                     pass
  420.                 except:
  421.                     None<EXCEPTION MATCH>IOError
  422.                 
  423.  
  424.                 None<EXCEPTION MATCH>IOError
  425.  
  426.             return s
  427.         
  428.  
  429.     
  430.     def _remote(self, action):
  431.         s = self._find_grail_rc()
  432.         if not s:
  433.             return 0
  434.         s.send(action)
  435.         s.close()
  436.         return 1
  437.  
  438.     
  439.     def open(self, url, new = 0, autoraise = 1):
  440.         if new:
  441.             ok = self._remote('LOADNEW ' + url)
  442.         else:
  443.             ok = self._remote('LOAD ' + url)
  444.         return ok
  445.  
  446.  
  447.  
  448. def register_X_browsers():
  449.     if 'GNOME_DESKTOP_SESSION_ID' in os.environ and _iscommand('gnome-open'):
  450.         register('gnome-open', None, BackgroundBrowser('gnome-open'))
  451.     
  452.     if 'KDE_FULL_SESSION' in os.environ and _iscommand('kfmclient'):
  453.         register('kfmclient', Konqueror, Konqueror('kfmclient'))
  454.     
  455.     for browser in ('mozilla-firefox', 'firefox', 'mozilla-firebird', 'firebird', 'seamonkey', 'mozilla', 'netscape'):
  456.         if _iscommand(browser):
  457.             register(browser, None, Mozilla(browser))
  458.             continue
  459.     
  460.     if _iscommand('kfm'):
  461.         register('kfm', Konqueror, Konqueror('kfm'))
  462.     elif _iscommand('konqueror'):
  463.         register('konqueror', Konqueror, Konqueror('konqueror'))
  464.     
  465.     for browser in ('galeon', 'epiphany'):
  466.         if _iscommand(browser):
  467.             register(browser, None, Galeon(browser))
  468.             continue
  469.     
  470.     if _iscommand('skipstone'):
  471.         register('skipstone', None, BackgroundBrowser('skipstone'))
  472.     
  473.     if _iscommand('opera'):
  474.         register('opera', None, Opera('opera'))
  475.     
  476.     if _iscommand('mosaic'):
  477.         register('mosaic', None, BackgroundBrowser('mosaic'))
  478.     
  479.     if _iscommand('grail'):
  480.         register('grail', Grail, None)
  481.     
  482.  
  483. if os.environ.get('DISPLAY'):
  484.     register_X_browsers()
  485.  
  486. if os.environ.get('TERM'):
  487.     if _iscommand('links'):
  488.         register('links', None, GenericBrowser('links'))
  489.     
  490.     if _iscommand('elinks'):
  491.         register('elinks', None, Elinks('elinks'))
  492.     
  493.     if _iscommand('lynx'):
  494.         register('lynx', None, GenericBrowser('lynx'))
  495.     
  496.     if _iscommand('w3m'):
  497.         register('w3m', None, GenericBrowser('w3m'))
  498.     
  499.  
  500. if sys.platform[:3] == 'win':
  501.     
  502.     class WindowsDefault(BaseBrowser):
  503.         
  504.         def open(self, url, new = 0, autoraise = 1):
  505.             
  506.             try:
  507.                 os.startfile(url)
  508.             except WindowsError:
  509.                 return False
  510.  
  511.             return True
  512.  
  513.  
  514.     _tryorder = []
  515.     _browsers = { }
  516.     register('windows-default', WindowsDefault)
  517.     iexplore = os.path.join(os.environ.get('PROGRAMFILES', 'C:\\Program Files'), 'Internet Explorer\\IEXPLORE.EXE')
  518.     for browser in ('firefox', 'firebird', 'seamonkey', 'mozilla', 'netscape', 'opera', iexplore):
  519.         if _iscommand(browser):
  520.             register(browser, None, BackgroundBrowser(browser))
  521.             continue
  522.     
  523.  
  524.  
  525. try:
  526.     import ic
  527. except ImportError:
  528.     pass
  529.  
  530.  
  531. class InternetConfig(BaseBrowser):
  532.     
  533.     def open(self, url, new = 0, autoraise = 1):
  534.         ic.launchurl(url)
  535.         return True
  536.  
  537.  
  538. register('internet-config', InternetConfig, update_tryorder = -1)
  539. if sys.platform == 'darwin':
  540.     
  541.     class MacOSX(BaseBrowser):
  542.         
  543.         def __init__(self, name):
  544.             self.name = name
  545.  
  546.         
  547.         def open(self, url, new = 0, autoraise = 1):
  548.             if ':' not in url:
  549.                 url = 'file:' + url
  550.             
  551.             new = int(bool(new))
  552.             if self.name == 'default':
  553.                 script = 'open location "%s"' % url.replace('"', '%22')
  554.             elif self.name == 'OmniWeb':
  555.                 toWindow = ''
  556.             else:
  557.                 toWindow = 'toWindow %d' % (new - 1)
  558.             cmd = 'OpenURL "%s"' % url.replace('"', '%22')
  559.             script = 'tell application "%s"\n                                activate\n                                %s %s\n                            end tell' % (self.name, cmd, toWindow)
  560.             osapipe = os.popen('osascript', 'w')
  561.             if osapipe is None:
  562.                 return False
  563.             osapipe.write(script)
  564.             rc = osapipe.close()
  565.             return not rc
  566.  
  567.  
  568.     register('MacOSX', None, MacOSX('default'), -1)
  569.  
  570. if sys.platform[:3] == 'os2' and _iscommand('netscape'):
  571.     _tryorder = []
  572.     _browsers = { }
  573.     register('os2netscape', None, GenericBrowser([
  574.         'start',
  575.         'netscape',
  576.         '%s']), -1)
  577.  
  578. if 'BROWSER' in os.environ:
  579.     _userchoices = os.environ['BROWSER'].split(os.pathsep)
  580.     _userchoices.reverse()
  581.     for cmdline in _userchoices:
  582.         if cmdline != '':
  583.             _synthesize(cmdline, -1)
  584.             continue
  585.     
  586.     cmdline = None
  587.     del cmdline
  588.     del _userchoices
  589.  
  590.  
  591. def main():
  592.     import getopt
  593.     usage = 'Usage: %s [-n | -t] url\n    -n: open new window\n    -t: open new tab' % sys.argv[0]
  594.     
  595.     try:
  596.         (opts, args) = getopt.getopt(sys.argv[1:], 'ntd')
  597.     except getopt.error:
  598.         msg = None
  599.         print >>sys.stderr, msg
  600.         print >>sys.stderr, usage
  601.         sys.exit(1)
  602.  
  603.     new_win = 0
  604.     for o, a in opts:
  605.         if o == '-n':
  606.             new_win = 1
  607.             continue
  608.         if o == '-t':
  609.             new_win = 2
  610.             continue
  611.     
  612.     if len(args) != 1:
  613.         print >>sys.stderr, usage
  614.         sys.exit(1)
  615.     
  616.     url = args[0]
  617.     open(url, new_win)
  618.     print '\x07'
  619.  
  620. if __name__ == '__main__':
  621.     main()
  622.  
  623.