annotate Lib/msilib/__init__.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents ec84bd4c5ac4
children cd0191a9b5c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1 # -*- coding: iso-8859-1 -*-
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
2 # Copyright (C) 2005 Martin v. Löwis
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
3 # Licensed to PSF under a Contributor Agreement.
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
4 from _msi import *
54729
b43398ea549d Merged revisions 73390 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48921
diff changeset
5 import os, string, re, sys
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
6
54729
b43398ea549d Merged revisions 73390 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48921
diff changeset
7 AMD64 = "AMD64" in sys.version
b43398ea549d Merged revisions 73390 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48921
diff changeset
8 Itanium = "Itanium" in sys.version
b43398ea549d Merged revisions 73390 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48921
diff changeset
9 Win64 = AMD64 or Itanium
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
10
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
11 # Partially taken from Wine
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
12 datasizemask= 0x00ff
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
13 type_valid= 0x0100
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
14 type_localizable= 0x0200
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
15
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
16 typemask= 0x0c00
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
17 type_long= 0x0000
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
18 type_short= 0x0400
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
19 type_string= 0x0c00
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
20 type_binary= 0x0800
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
21
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
22 type_nullable= 0x1000
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
23 type_key= 0x2000
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
24 # XXX temporary, localizable?
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
25 knownbits = datasizemask | type_valid | type_localizable | \
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
26 typemask | type_nullable | type_key
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
27
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
28 class Table:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
29 def __init__(self, name):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
30 self.name = name
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
31 self.fields = []
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
32
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
33 def add_field(self, index, name, type):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
34 self.fields.append((index,name,type))
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
35
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
36 def sql(self):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
37 fields = []
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
38 keys = []
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
39 self.fields.sort()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
40 fields = [None]*len(self.fields)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
41 for index, name, type in self.fields:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
42 index -= 1
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
43 unk = type & ~knownbits
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
44 if unk:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
45 print "%s.%s unknown bits %x" % (self.name, name, unk)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
46 size = type & datasizemask
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
47 dtype = type & typemask
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
48 if dtype == type_string:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
49 if size:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
50 tname="CHAR(%d)" % size
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
51 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
52 tname="CHAR"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
53 elif dtype == type_short:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
54 assert size==2
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
55 tname = "SHORT"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
56 elif dtype == type_long:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
57 assert size==4
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
58 tname="LONG"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
59 elif dtype == type_binary:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
60 assert size==0
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
61 tname="OBJECT"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
62 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
63 tname="unknown"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
64 print "%s.%sunknown integer type %d" % (self.name, name, size)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
65 if type & type_nullable:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
66 flags = ""
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
67 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
68 flags = " NOT NULL"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
69 if type & type_localizable:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
70 flags += " LOCALIZABLE"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
71 fields[index] = "`%s` %s%s" % (name, tname, flags)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
72 if type & type_key:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
73 keys.append("`%s`" % name)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
74 fields = ", ".join(fields)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
75 keys = ", ".join(keys)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
76 return "CREATE TABLE %s (%s PRIMARY KEY %s)" % (self.name, fields, keys)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
77
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
78 def create(self, db):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
79 v = db.OpenView(self.sql())
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
80 v.Execute(None)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
81 v.Close()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
82
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
83 class _Unspecified:pass
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
84 def change_sequence(seq, action, seqno=_Unspecified, cond = _Unspecified):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
85 "Change the sequence number of an action in a sequence list"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
86 for i in range(len(seq)):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
87 if seq[i][0] == action:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
88 if cond is _Unspecified:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
89 cond = seq[i][1]
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
90 if seqno is _Unspecified:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
91 seqno = seq[i][2]
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
92 seq[i] = (action, cond, seqno)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
93 return
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
94 raise ValueError, "Action not found in sequence"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
95
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
96 def add_data(db, table, values):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
97 v = db.OpenView("SELECT * FROM `%s`" % table)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
98 count = v.GetColumnInfo(MSICOLINFO_NAMES).GetFieldCount()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
99 r = CreateRecord(count)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
100 for value in values:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
101 assert len(value) == count, value
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
102 for i in range(count):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
103 field = value[i]
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
104 if isinstance(field, (int, long)):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
105 r.SetInteger(i+1,field)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
106 elif isinstance(field, basestring):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
107 r.SetString(i+1,field)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
108 elif field is None:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
109 pass
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
110 elif isinstance(field, Binary):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
111 r.SetStream(i+1, field.name)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
112 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
113 raise TypeError, "Unsupported type %s" % field.__class__.__name__
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
114 try:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
115 v.Modify(MSIMODIFY_INSERT, r)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
116 except Exception, e:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
117 raise MSIError("Could not insert "+repr(values)+" into "+table)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
118
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
119 r.ClearData()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
120 v.Close()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
121
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
122
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
123 def add_stream(db, name, path):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
124 v = db.OpenView("INSERT INTO _Streams (Name, Data) VALUES ('%s', ?)" % name)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
125 r = CreateRecord(1)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
126 r.SetStream(1, path)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
127 v.Execute(r)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
128 v.Close()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
129
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
130 def init_database(name, schema,
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
131 ProductName, ProductCode, ProductVersion,
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
132 Manufacturer):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
133 try:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
134 os.unlink(name)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
135 except OSError:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
136 pass
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
137 ProductCode = ProductCode.upper()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
138 # Create the database
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
139 db = OpenDatabase(name, MSIDBOPEN_CREATE)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
140 # Create the tables
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
141 for t in schema.tables:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
142 t.create(db)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
143 # Fill the validation table
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
144 add_data(db, "_Validation", schema._Validation_records)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
145 # Initialize the summary information, allowing atmost 20 properties
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
146 si = db.GetSummaryInformation(20)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
147 si.SetProperty(PID_TITLE, "Installation Database")
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
148 si.SetProperty(PID_SUBJECT, ProductName)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
149 si.SetProperty(PID_AUTHOR, Manufacturer)
54729
b43398ea549d Merged revisions 73390 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48921
diff changeset
150 if Itanium:
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
151 si.SetProperty(PID_TEMPLATE, "Intel64;1033")
54729
b43398ea549d Merged revisions 73390 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48921
diff changeset
152 elif AMD64:
b43398ea549d Merged revisions 73390 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48921
diff changeset
153 si.SetProperty(PID_TEMPLATE, "x64;1033")
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
154 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
155 si.SetProperty(PID_TEMPLATE, "Intel;1033")
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
156 si.SetProperty(PID_REVNUMBER, gen_uuid())
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
157 si.SetProperty(PID_WORDCOUNT, 2) # long file names, compressed, original media
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
158 si.SetProperty(PID_PAGECOUNT, 200)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
159 si.SetProperty(PID_APPNAME, "Python MSI Library")
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
160 # XXX more properties
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
161 si.Persist()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
162 add_data(db, "Property", [
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
163 ("ProductName", ProductName),
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
164 ("ProductCode", ProductCode),
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
165 ("ProductVersion", ProductVersion),
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
166 ("Manufacturer", Manufacturer),
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
167 ("ProductLanguage", "1033")])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
168 db.Commit()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
169 return db
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
170
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
171 def add_tables(db, module):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
172 for table in module.tables:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
173 add_data(db, table, getattr(module, table))
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
174
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
175 def make_id(str):
69016
ec84bd4c5ac4 Closes #11696: Fix ID generation in msilib.
Martin v. Löwis <martin@v.loewis.de>
parents: 68999
diff changeset
176 identifier_chars = string.ascii_letters + string.digits + "._"
ec84bd4c5ac4 Closes #11696: Fix ID generation in msilib.
Martin v. Löwis <martin@v.loewis.de>
parents: 68999
diff changeset
177 str = "".join([c if c in identifier_chars else "_" for c in str])
68999
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
178 if str[0] in (string.digits + "."):
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
179 str = "_" + str
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
180 assert re.match("^[A-Za-z_][A-Za-z0-9_.]*$", str), "FILE"+str
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
181 return str
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
182
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
183 def gen_uuid():
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
184 return "{"+UuidCreate().upper()+"}"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
185
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
186 class CAB:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
187 def __init__(self, name):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
188 self.name = name
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
189 self.files = []
48921
8cda615ef22b Issue #3732: Backported r53335 to supress deprecation warning.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 39031
diff changeset
190 self.filenames = set()
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
191 self.index = 0
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
192
39031
8fefa99e87c0 Properly generate logical file ids. Fixes #1515998.
Martin v. Löwis <martin@v.loewis.de>
parents: 38072
diff changeset
193 def gen_id(self, file):
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
194 logical = _logical = make_id(file)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
195 pos = 1
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
196 while logical in self.filenames:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
197 logical = "%s.%d" % (_logical, pos)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
198 pos += 1
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
199 self.filenames.add(logical)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
200 return logical
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
201
39031
8fefa99e87c0 Properly generate logical file ids. Fixes #1515998.
Martin v. Löwis <martin@v.loewis.de>
parents: 38072
diff changeset
202 def append(self, full, file, logical):
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
203 if os.path.isdir(full):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
204 return
39031
8fefa99e87c0 Properly generate logical file ids. Fixes #1515998.
Martin v. Löwis <martin@v.loewis.de>
parents: 38072
diff changeset
205 if not logical:
8fefa99e87c0 Properly generate logical file ids. Fixes #1515998.
Martin v. Löwis <martin@v.loewis.de>
parents: 38072
diff changeset
206 logical = self.gen_id(file)
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
207 self.index += 1
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
208 self.files.append((full, logical))
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
209 return self.index, logical
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
210
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
211 def commit(self, db):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
212 from tempfile import mktemp
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
213 filename = mktemp()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
214 FCICreate(filename, self.files)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
215 add_data(db, "Media",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
216 [(1, self.index, None, "#"+self.name, None, None)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
217 add_stream(db, self.name, filename)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
218 os.unlink(filename)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
219 db.Commit()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
220
48921
8cda615ef22b Issue #3732: Backported r53335 to supress deprecation warning.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 39031
diff changeset
221 _directories = set()
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
222 class Directory:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
223 def __init__(self, db, cab, basedir, physical, _logical, default, componentflags=None):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
224 """Create a new directory in the Directory table. There is a current component
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
225 at each point in time for the directory, which is either explicitly created
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
226 through start_component, or implicitly when files are added for the first
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
227 time. Files are added into the current component, and into the cab file.
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
228 To create a directory, a base directory object needs to be specified (can be
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
229 None), the path to the physical directory, and a logical directory name.
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
230 Default specifies the DefaultDir slot in the directory table. componentflags
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
231 specifies the default flags that new components get."""
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
232 index = 1
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
233 _logical = make_id(_logical)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
234 logical = _logical
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
235 while logical in _directories:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
236 logical = "%s%d" % (_logical, index)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
237 index += 1
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
238 _directories.add(logical)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
239 self.db = db
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
240 self.cab = cab
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
241 self.basedir = basedir
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
242 self.physical = physical
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
243 self.logical = logical
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
244 self.component = None
48921
8cda615ef22b Issue #3732: Backported r53335 to supress deprecation warning.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 39031
diff changeset
245 self.short_names = set()
8cda615ef22b Issue #3732: Backported r53335 to supress deprecation warning.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 39031
diff changeset
246 self.ids = set()
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
247 self.keyfiles = {}
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
248 self.componentflags = componentflags
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
249 if basedir:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
250 self.absolute = os.path.join(basedir.absolute, physical)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
251 blogical = basedir.logical
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
252 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
253 self.absolute = physical
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
254 blogical = None
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
255 add_data(db, "Directory", [(logical, blogical, default)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
256
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
257 def start_component(self, component = None, feature = None, flags = None, keyfile = None, uuid=None):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
258 """Add an entry to the Component table, and make this component the current for this
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
259 directory. If no component name is given, the directory name is used. If no feature
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
260 is given, the current feature is used. If no flags are given, the directory's default
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
261 flags are used. If no keyfile is given, the KeyPath is left null in the Component
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
262 table."""
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
263 if flags is None:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
264 flags = self.componentflags
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
265 if uuid is None:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
266 uuid = gen_uuid()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
267 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
268 uuid = uuid.upper()
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
269 if component is None:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
270 component = self.logical
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
271 self.component = component
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
272 if Win64:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
273 flags |= 256
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
274 if keyfile:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
275 keyid = self.cab.gen_id(self.absolute, keyfile)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
276 self.keyfiles[keyfile] = keyid
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
277 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
278 keyid = None
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
279 add_data(self.db, "Component",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
280 [(component, uuid, self.logical, flags, None, keyid)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
281 if feature is None:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
282 feature = current_feature
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
283 add_data(self.db, "FeatureComponents",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
284 [(feature.id, component)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
285
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
286 def make_short(self, file):
68999
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
287 oldfile = file
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
288 file = file.replace('+', '_')
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
289 file = ''.join(c for c in file if not c in ' "/\[]:;=,')
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
290 parts = file.split(".")
68999
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
291 if len(parts) > 1:
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
292 prefix = "".join(parts[:-1]).upper()
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
293 suffix = parts[-1].upper()
68999
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
294 if not prefix:
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
295 prefix = suffix
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
296 suffix = None
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
297 else:
68999
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
298 prefix = file.upper()
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
299 suffix = None
68999
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
300 if len(parts) < 3 and len(prefix) <= 8 and file == oldfile and (
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
301 not suffix or len(suffix) <= 3):
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
302 if suffix:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
303 file = prefix+"."+suffix
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
304 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
305 file = prefix
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
306 else:
68999
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
307 file = None
e51366a05b84 Fix short file name generation in bdist_msi.
Martin v. Löwis <martin@v.loewis.de>
parents: 56436
diff changeset
308 if file is None or file in self.short_names:
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
309 prefix = prefix[:6]
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
310 if suffix:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
311 suffix = suffix[:3]
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
312 pos = 1
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
313 while 1:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
314 if suffix:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
315 file = "%s~%d.%s" % (prefix, pos, suffix)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
316 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
317 file = "%s~%d" % (prefix, pos)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
318 if file not in self.short_names: break
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
319 pos += 1
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
320 assert pos < 10000
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
321 if pos in (10, 100, 1000):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
322 prefix = prefix[:-1]
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
323 self.short_names.add(file)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
324 assert not re.search(r'[\?|><:/*"+,;=\[\]]', file) # restrictions on short names
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
325 return file
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
326
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
327 def add_file(self, file, src=None, version=None, language=None):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
328 """Add a file to the current component of the directory, starting a new one
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
329 one if there is no current component. By default, the file name in the source
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
330 and the file table will be identical. If the src file is specified, it is
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
331 interpreted relative to the current directory. Optionally, a version and a
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
332 language can be specified for the entry in the File table."""
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
333 if not self.component:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
334 self.start_component(self.logical, current_feature, 0)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
335 if not src:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
336 # Allow relative paths for file if src is not specified
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
337 src = file
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
338 file = os.path.basename(file)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
339 absolute = os.path.join(self.absolute, src)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
340 assert not re.search(r'[\?|><:/*]"', file) # restrictions on long names
56436
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 54729
diff changeset
341 if file in self.keyfiles:
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
342 logical = self.keyfiles[file]
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
343 else:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
344 logical = None
39031
8fefa99e87c0 Properly generate logical file ids. Fixes #1515998.
Martin v. Löwis <martin@v.loewis.de>
parents: 38072
diff changeset
345 sequence, logical = self.cab.append(absolute, file, logical)
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
346 assert logical not in self.ids
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
347 self.ids.add(logical)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
348 short = self.make_short(file)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
349 full = "%s|%s" % (short, file)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
350 filesize = os.stat(absolute).st_size
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
351 # constants.msidbFileAttributesVital
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
352 # Compressed omitted, since it is the database default
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
353 # could add r/o, system, hidden
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
354 attributes = 512
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
355 add_data(self.db, "File",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
356 [(logical, self.component, full, filesize, version,
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
357 language, attributes, sequence)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
358 #if not version:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
359 # # Add hash if the file is not versioned
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
360 # filehash = FileHash(absolute, 0)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
361 # add_data(self.db, "MsiFileHash",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
362 # [(logical, 0, filehash.IntegerData(1),
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
363 # filehash.IntegerData(2), filehash.IntegerData(3),
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
364 # filehash.IntegerData(4))])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
365 # Automatically remove .pyc/.pyo files on uninstall (2)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
366 # XXX: adding so many RemoveFile entries makes installer unbelievably
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
367 # slow. So instead, we have to use wildcard remove entries
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
368 if file.endswith(".py"):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
369 add_data(self.db, "RemoveFile",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
370 [(logical+"c", self.component, "%sC|%sc" % (short, file),
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
371 self.logical, 2),
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
372 (logical+"o", self.component, "%sO|%so" % (short, file),
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
373 self.logical, 2)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
374 return logical
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
375
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
376 def glob(self, pattern, exclude = None):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
377 """Add a list of files to the current component as specified in the
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
378 glob pattern. Individual files can be excluded in the exclude list."""
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
379 files = glob.glob1(self.absolute, pattern)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
380 for f in files:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
381 if exclude and f in exclude: continue
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
382 self.add_file(f)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
383 return files
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
384
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
385 def remove_pyc(self):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
386 "Remove .pyc/.pyo files on uninstall"
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
387 add_data(self.db, "RemoveFile",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
388 [(self.component+"c", self.component, "*.pyc", self.logical, 2),
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
389 (self.component+"o", self.component, "*.pyo", self.logical, 2)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
390
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
391 class Binary:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
392 def __init__(self, fname):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
393 self.name = fname
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
394 def __repr__(self):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
395 return 'msilib.Binary(os.path.join(dirname,"%s"))' % self.name
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
396
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
397 class Feature:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
398 def __init__(self, db, id, title, desc, display, level = 1,
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
399 parent=None, directory = None, attributes=0):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
400 self.id = id
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
401 if parent:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
402 parent = parent.id
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
403 add_data(db, "Feature",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
404 [(id, parent, title, desc, display,
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
405 level, directory, attributes)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
406 def set_current(self):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
407 global current_feature
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
408 current_feature = self
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
409
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
410 class Control:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
411 def __init__(self, dlg, name):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
412 self.dlg = dlg
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
413 self.name = name
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
414
38072
ee98ecf05773 Rename parameters to match the documentation (which
Martin v. Löwis <martin@v.loewis.de>
parents: 36845
diff changeset
415 def event(self, event, argument, condition = "1", ordering = None):
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
416 add_data(self.dlg.db, "ControlEvent",
38072
ee98ecf05773 Rename parameters to match the documentation (which
Martin v. Löwis <martin@v.loewis.de>
parents: 36845
diff changeset
417 [(self.dlg.name, self.name, event, argument,
ee98ecf05773 Rename parameters to match the documentation (which
Martin v. Löwis <martin@v.loewis.de>
parents: 36845
diff changeset
418 condition, ordering)])
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
419
39031
8fefa99e87c0 Properly generate logical file ids. Fixes #1515998.
Martin v. Löwis <martin@v.loewis.de>
parents: 38072
diff changeset
420 def mapping(self, event, attribute):
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
421 add_data(self.dlg.db, "EventMapping",
38072
ee98ecf05773 Rename parameters to match the documentation (which
Martin v. Löwis <martin@v.loewis.de>
parents: 36845
diff changeset
422 [(self.dlg.name, self.name, event, attribute)])
36845
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
423
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
424 def condition(self, action, condition):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
425 add_data(self.dlg.db, "ControlCondition",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
426 [(self.dlg.name, self.name, action, condition)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
427
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
428 class RadioButtonGroup(Control):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
429 def __init__(self, dlg, name, property):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
430 self.dlg = dlg
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
431 self.name = name
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
432 self.property = property
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
433 self.index = 1
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
434
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
435 def add(self, name, x, y, w, h, text, value = None):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
436 if value is None:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
437 value = name
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
438 add_data(self.dlg.db, "RadioButton",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
439 [(self.property, self.index, value,
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
440 x, y, w, h, text, None)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
441 self.index += 1
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
442
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
443 class Dialog:
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
444 def __init__(self, db, name, x, y, w, h, attr, title, first, default, cancel):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
445 self.db = db
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
446 self.name = name
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
447 self.x, self.y, self.w, self.h = x,y,w,h
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
448 add_data(db, "Dialog", [(name, x,y,w,h,attr,title,first,default,cancel)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
449
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
450 def control(self, name, type, x, y, w, h, attr, prop, text, next, help):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
451 add_data(self.db, "Control",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
452 [(self.name, name, type, x, y, w, h, attr, prop, text, next, help)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
453 return Control(self, name)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
454
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
455 def text(self, name, x, y, w, h, attr, text):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
456 return self.control(name, "Text", x, y, w, h, attr, None,
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
457 text, None, None)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
458
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
459 def bitmap(self, name, x, y, w, h, text):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
460 return self.control(name, "Bitmap", x, y, w, h, 1, None, text, None, None)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
461
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
462 def line(self, name, x, y, w, h):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
463 return self.control(name, "Line", x, y, w, h, 1, None, None, None, None)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
464
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
465 def pushbutton(self, name, x, y, w, h, attr, text, next):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
466 return self.control(name, "PushButton", x, y, w, h, attr, None, text, next, None)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
467
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
468 def radiogroup(self, name, x, y, w, h, attr, prop, text, next):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
469 add_data(self.db, "Control",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
470 [(self.name, name, "RadioButtonGroup",
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
471 x, y, w, h, attr, prop, text, next, None)])
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
472 return RadioButtonGroup(self, name, prop)
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
473
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
474 def checkbox(self, name, x, y, w, h, attr, prop, text, next):
391f74c9c263 Import bdist_msi
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
475 return self.control(name, "CheckBox", x, y, w, h, attr, prop, text, next, None)