Support basedir spec.
[mime-editor.git] / override.py
blob60cc7a2c370c10f1979105fc88747647d6197489
1 import os
2 import rox
3 from xml.dom import Node, XMLNS_NAMESPACE
5 FREE_NS='http://www.freedesktop.org/standards/shared-mime-info'
7 home_mime = os.path.join(rox.basedir.xdg_data_home, 'mime')
8 user_override = os.path.join(home_mime, 'packages', 'Override.xml')
10 def get_override():
11 from xml.dom import minidom
12 if os.path.exists(user_override):
13 doc = minidom.parse(user_override)
14 else:
15 doc = minidom.Document()
16 node = doc.createElementNS(FREE_NS, 'mime-info')
17 doc.appendChild(node)
18 # Some versions of PyXML lose the namespace?
19 doc.documentElement.setAttributeNS(XMLNS_NAMESPACE, 'xmlns', FREE_NS)
20 return doc
22 def get_override_type(type_name):
23 doc = get_override()
24 root = doc.documentElement
25 for c in root.childNodes:
26 if c.nodeType != Node.ELEMENT_NODE: continue
27 if c.localName == 'mime-type' and c.namespaceURI == FREE_NS:
28 if c.getAttributeNS(None, 'type') == type_name:
29 return doc, c
30 node = doc.createElementNS(FREE_NS, 'mime-type')
31 node.setAttributeNS(None, 'type', type_name)
32 root.appendChild(node)
33 return doc, node
35 def write_override(doc):
36 home_packages = os.path.join(home_mime, 'packages')
37 if not os.path.isdir(home_packages):
38 os.makedirs(home_packages)
39 path = os.path.join(home_packages, 'Override.xml.new')
40 doc.writexml(file(path, 'w'))
41 os.rename(path, path[:-4])
42 r, w = os.pipe()
43 child = os.fork()
44 if child == 0:
45 # Child
46 try:
47 os.close(r)
48 os.dup2(w, 1)
49 os.dup2(w, 2)
50 os.execlp('update-mime-database', 'update-mime-database', home_mime)
51 finally:
52 os._exit(1)
53 os.close(w)
54 message = os.fdopen(r, 'r').read()
55 pid, status = os.waitpid(child, 0)
56 if status or message.count('\n') != 3:
57 rox.info(message)
59 import __main__
60 __main__.box.update()