1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
"""Remote-control interfaces to some browsers."""
import os
import string
import sys
DEFAULT_CONFIG_FILE = "~/.browser.ini"
PROCESS_CREATION_DELAY = 4
DEFAULT_BROWSER = "netscape"
_browsers = {}
def get(name=None):
if name is None:
name = get_default_browser()
else:
name = string.lower(name)
L = _browsers[name]
if L[1] is None:
L[1] = L[0]()
return L[1]
def get_default_browser(file=None):
if file is None:
files = [DEFAULT_CONFIG_FILE]
else:
files = [file, DEFAULT_CONFIG_FILE]
for file in files:
file = os.path.expandvars(os.path.expanduser(file))
if file and os.path.isfile(file):
import ConfigParser
cf = ConfigParser.ConfigParser()
cf.read([file])
try:
return string.lower(cf.get("Browser", "name"))
except ConfigParser.Error:
pass
return DEFAULT_BROWSER
_default_browser = None
def _get_browser():
global _default_browser
if _default_browser is None:
_default_browser = get()
return _default_browser
def open(url, new=0):
_get_browser().open(url, new)
def open_new(url):
_get_browser().open_new(url)
def register(name, klass):
_browsers[string.lower(name)] = [klass, None]
class Netscape:
autoRaise = 0
def _remote(self, action):
raise_opt = ("-noraise", "-raise")[self.autoRaise]
cmd = "netscape %s -remote '%s' >/dev/null 2>&1" % (raise_opt, action)
rc = os.system(cmd)
if rc:
import time
os.system("netscape -no-about-splash &")
time.sleep(PROCESS_CREATION_DELAY)
rc = os.system(cmd)
return not rc
def open(self, url, new=0):
if new:
self.open_new(url)
else:
self._remote("openURL(%s)" % url)
def open_new(self, url):
self._remote("openURL(%s, new-window)" % url)
register("netscape", Netscape)
class Grail:
# There should be a way to maintain a connection to Grail, but the
# Grail remote control protocol doesn't really allow that at this
# point. It probably never will!
def _find_grail_rc(self):
import glob
import pwd
import socket
import tempfile
tempdir = os.path.join(tempfile.gettempdir(), ".grail-unix")
user = pwd.getpwuid(_os.getuid())[0]
filename = os.path.join(tempdir, user + "-*")
maybes = glob.glob(filename)
if not maybes:
return None
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
for fn in maybes:
# need to PING each one until we find one that's live
try:
s.connect(fn)
except socket.error:
# no good; attempt to clean it out, but don't fail:
try:
os.unlink(fn)
except IOError:
pass
else:
return s
def _remote(self, action):
s = self._find_grail_rc()
if not s:
return 0
s.send(action)
s.close()
return 1
def open(self, url, new=0):
if new:
self.open_new(url)
else:
self._remote("LOAD " + url)
def open_new(self, url):
self._remote("LOADNEW " + url)
register("grail", Grail)
class WindowsDefault:
def open(self, url, new=0):
import win32api, win32con
try:
win32api.ShellExecute(0, "open", url, None, ".",
win32con.SW_SHOWNORMAL)
except:
traceback.print_exc()
raise
def open_new(self, url):
self.open(url)
if sys.platform[:3] == "win":
register("windows-default", WindowsDefault)
DEFAULT_BROWSER = "windows-default"
|