You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
521 lines
14 KiB
521 lines
14 KiB
14 years ago
|
#!/usr/bin/python
|
||
|
|
||
|
import sys, getopt, os, os.path, fnmatch, string, StringIO
|
||
|
|
||
|
#---------- globals ----------
|
||
|
|
||
|
FALSE = 0
|
||
|
TRUE = not FALSE
|
||
|
|
||
|
ops = ['tr', 'qtNoTr', 'shpix', 'notify', 'varhier', 'appQuit', "kjsfix", "fixQVariant", "fixSignal"]
|
||
|
operation = ''
|
||
|
opPath = ''
|
||
|
pattern = ''
|
||
|
|
||
|
|
||
|
# --------- support functions ----------
|
||
|
|
||
|
def getOptions ():
|
||
|
global pattern
|
||
|
arglist = sys.argv [1:]
|
||
|
shortOptions = "p:o:"
|
||
|
longOptions = "path= op="
|
||
|
|
||
|
try:
|
||
|
optlist, args = getopt.getopt (arglist, shortOptions, longOptions)
|
||
|
except getopt.GetoptError:
|
||
|
optlist = []
|
||
|
args = []
|
||
|
|
||
|
if (optlist == []) or (len (args) != 1):
|
||
|
print '\nUsage: postproc -p<path> -o<operation> <filespec>\n'
|
||
|
return FALSE
|
||
|
|
||
|
pattern = args [0]
|
||
|
return checkOptions (optlist)
|
||
|
|
||
|
def checkOptions (optlist):
|
||
|
havePath = FALSE
|
||
|
haveOp = FALSE
|
||
|
|
||
|
for pair in optlist:
|
||
|
if (pair [0] == '--path') or (pair [0] == '-p'):
|
||
|
if not checkPath (pair [1]):
|
||
|
print '\nPath ' + pair [1] + ' does not exist\n'
|
||
|
else:
|
||
|
havePath = TRUE
|
||
|
|
||
|
elif (pair [0] == '--op') or (pair [0] == '-o'):
|
||
|
if not checkOp (pair [1]):
|
||
|
print '\nOperation ' + pair [1] + ' does not exist\n'
|
||
|
else:
|
||
|
haveOp = TRUE
|
||
|
|
||
|
return havePath and haveOp
|
||
|
|
||
|
def checkPath (path):
|
||
|
global opPath
|
||
|
if not os.path.exists (path):
|
||
|
return FALSE
|
||
|
|
||
|
opPath = path
|
||
|
if not (opPath [-1] == '/'):
|
||
|
opPath = opPath + '/'
|
||
|
|
||
|
return TRUE
|
||
|
|
||
|
|
||
|
def checkOp (op):
|
||
|
global operation
|
||
|
if not op in ops:
|
||
|
return FALSE
|
||
|
|
||
|
operation = op
|
||
|
return TRUE
|
||
|
|
||
|
def getFilelist ():
|
||
|
filelist = []
|
||
|
tmpfilelist = os.listdir (opPath)
|
||
|
for fn in tmpfilelist:
|
||
|
if fnmatch.fnmatchcase (fn, pattern):
|
||
|
filelist.append (fn)
|
||
|
|
||
|
return filelist
|
||
|
|
||
|
# --------- operations ----------
|
||
|
|
||
|
# removes sipDo_<classname>_tr and table reference ('sipName_qt_tr')
|
||
|
# because KDE2 is compiled with QT_NO_TRANSLATION defined (which also
|
||
|
# makes QObject::tr methods invisible to any KDE2 QObject descendants)
|
||
|
|
||
|
def trFix (filelist):
|
||
|
for fn in filelist:
|
||
|
m = open (opPath + fn, 'r')
|
||
|
tmpname = os.path.splitext (fn) [0] + '.tmp'
|
||
|
tmp = StringIO.StringIO ()
|
||
|
|
||
|
buff = m.readlines ()
|
||
|
m.close ()
|
||
|
|
||
|
i = 0
|
||
|
nLines = len (buff)
|
||
|
|
||
|
# skip leading comments
|
||
|
while (i < nLines) and (buff [i][0:1] == '//'):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
# find classname
|
||
|
while (i < nLines) and (not string.find (buff [i], 'PyObject *sipClass_') == 0):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
if i >= nLines: # no classname - don't bother
|
||
|
tmp.close ()
|
||
|
continue
|
||
|
|
||
|
classname = buff [i][19:-2]
|
||
|
|
||
|
trStr = 'static PyObject *sipDo_' + classname + '_tr(PyObject *sipThisObj,PyObject *sipArgs)\n'
|
||
|
|
||
|
while (i < nLines) and (buff [i] != trStr):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
if i >= nLines: # no sipDo_*_tr - done
|
||
|
tmp.close ()
|
||
|
continue
|
||
|
|
||
|
# skip over this method without writing it out
|
||
|
while (i < nLines) and (buff [i][0] != '}'):
|
||
|
i = i + 1
|
||
|
|
||
|
i = i + 1 # skip the '}' too
|
||
|
|
||
|
|
||
|
while (i < nLines):
|
||
|
# skip sipName_qt_tr table entry/write out everything else
|
||
|
if string.find (buff [i], '{sipName_qt_tr') < 0:
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
tmpfile = open (opPath + tmpname, 'w')
|
||
|
tmpfile.write (tmp.getvalue ())
|
||
|
tmpfile.close ()
|
||
|
tmp.close ()
|
||
|
os.unlink (opPath + fn)
|
||
|
os.rename (opPath + tmpname, opPath + fn)
|
||
|
|
||
|
return TRUE
|
||
|
|
||
|
def qtNoTr (filelist):
|
||
|
for fn in filelist:
|
||
|
m = open (opPath + fn, 'r')
|
||
|
tmpname = os.path.splitext (fn) [0] + '.tmp'
|
||
|
tmp = StringIO.StringIO ()
|
||
|
|
||
|
buff = m.readlines ()
|
||
|
m.close ()
|
||
|
|
||
|
i = 0
|
||
|
nLines = len (buff)
|
||
|
|
||
|
while (i < nLines) and (string.find (buff [i], 'Q_OBJECT') < 0):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
tmp.write ("#define QT_NO_TRANSLATION\n")
|
||
|
|
||
|
while (i < nLines):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
tmpfile = open (opPath + tmpname, 'w')
|
||
|
tmpfile.write (tmp.getvalue ())
|
||
|
tmpfile.close ()
|
||
|
tmp.close ()
|
||
|
os.unlink (opPath + fn)
|
||
|
os.rename (opPath + tmpname, opPath + fn)
|
||
|
|
||
|
return TRUE
|
||
|
|
||
|
# changes QPaintDevice to KPixmap for two method calls
|
||
|
# gcc reports QPaintDevice as "ambiguous"
|
||
|
|
||
|
def shpix ():
|
||
|
# if concatenated, the sip*.cpp file doesn't exist
|
||
|
fn = ['sipkdeuiKSharedPixmap.cpp']
|
||
|
if not os.path.exists (os.path.join (opPath, fn [0])):
|
||
|
files = os.listdir (opPath)
|
||
|
fn = []
|
||
|
for file in files:
|
||
|
if string.find (file, "kdeuipart") >= 0 and file [-4:] == ".cpp":
|
||
|
fn.append (file)
|
||
|
|
||
|
if not fn:
|
||
|
return FALSE
|
||
|
|
||
|
for file in fn:
|
||
|
m = open (os.path.join (opPath, file), 'r')
|
||
|
tmpname = os.path.splitext (file) [0] + '.tmp'
|
||
|
|
||
|
buff = m.readlines ()
|
||
|
m.close ()
|
||
|
|
||
|
changed = 0
|
||
|
state = None
|
||
|
for ln in range (0, len (buff)):
|
||
|
line = buff [ln]
|
||
|
if string.find (line, "sipKSharedPixmap::resolution") >= 0:
|
||
|
state = "res"
|
||
|
elif string.find (line, "sipKSharedPixmap::setResolution") >= 0:
|
||
|
state = "setRes"
|
||
|
else:
|
||
|
state = None
|
||
|
|
||
|
if state and changed < 2:
|
||
|
changed = changed + 1
|
||
|
while "}" not in line:
|
||
|
ln = ln + 1
|
||
|
line = buff [ln]
|
||
|
if state == "res":
|
||
|
buff [ln] = string.replace (line, "QPaintDevice::resolution", "KPixmap::resolution")
|
||
|
elif state == "setRes":
|
||
|
buff [ln] = string.replace (line, "QPaintDevice::setResolution", "KPixmap::setResolution")
|
||
|
|
||
|
tmpfile = open (os.path.join (opPath, tmpname), 'w')
|
||
|
for line in buff:
|
||
|
tmpfile.write (line)
|
||
|
tmpfile.close ()
|
||
|
os.unlink (os.path.join (opPath, file))
|
||
|
os.rename (os.path.join (opPath, tmpname), os.path.join (opPath, file))
|
||
|
|
||
|
return TRUE
|
||
|
|
||
|
def notify ():
|
||
|
fn = os.path.join (opPath, pattern)
|
||
|
m = open (fn, "r")
|
||
|
tmpname = fn + '.tmp'
|
||
|
|
||
|
buff = m.readlines ()
|
||
|
m.close ()
|
||
|
tmpfile = open (tmpname, 'w')
|
||
|
|
||
|
tmpBuff = []
|
||
|
flag = 0
|
||
|
for line in buff:
|
||
|
if string.find (line, "class KNotify:") >= 0:
|
||
|
flag = 1
|
||
|
|
||
|
elif flag == 1 and string.find (line, "class KNotifyWidgetBase(QWidget):") >= 0:
|
||
|
flag = 2
|
||
|
|
||
|
elif flag == 2 and string.find (line, "class KNotifyWidget(KNotifyWidgetBase):") >= 0:
|
||
|
for ln in tmpBuff:
|
||
|
tmpfile.write (ln)
|
||
|
flag = 0
|
||
|
|
||
|
if flag != 1:
|
||
|
tmpfile.write (line)
|
||
|
else:
|
||
|
tmpBuff.append (line)
|
||
|
|
||
|
tmpfile.close ()
|
||
|
os.unlink (fn)
|
||
|
os.rename (tmpname, fn)
|
||
|
|
||
|
return TRUE
|
||
|
|
||
|
def varhier (filelist):
|
||
|
for fn in filelist:
|
||
|
m = open (opPath + fn, 'r')
|
||
|
tmpname = os.path.splitext (fn) [0] + '.tmp'
|
||
|
tmp = StringIO.StringIO ()
|
||
|
|
||
|
buff = m.readlines ()
|
||
|
m.close ()
|
||
|
|
||
|
i = 0
|
||
|
nLines = len (buff)
|
||
|
|
||
|
while (i < nLines) and (string.find (buff [i], 'PyMethodDef *sipClassVarHierTab_') < 0):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
while (i < nLines) and (string.find (buff [i], "};") < 0):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
if i < nLines:
|
||
|
flag = TRUE
|
||
|
tmp.write (buff [i] + "\n")
|
||
|
while i < nLines:
|
||
|
if not flag:
|
||
|
tmp.write (buff [i])
|
||
|
|
||
|
if flag and not ((string.find (buff [i], "};") >= 0) or (string.find (buff [i], "NULL") >= 0)):
|
||
|
flag = FALSE
|
||
|
|
||
|
i = i + 1
|
||
|
|
||
|
tmpfile = open (opPath + tmpname, 'w')
|
||
|
tmpfile.write (tmp.getvalue ())
|
||
|
tmpfile.close ()
|
||
|
tmp.close ()
|
||
|
os.unlink (opPath + fn)
|
||
|
os.rename (opPath + tmpname, opPath + fn)
|
||
|
|
||
|
return TRUE
|
||
|
|
||
|
|
||
|
def appQuit (filelist):
|
||
|
for fn in filelist:
|
||
|
m = open (opPath + fn, 'r')
|
||
|
tmpname = os.path.splitext (fn) [0] + '.tmp'
|
||
|
tmp = StringIO.StringIO ()
|
||
|
|
||
|
buff = m.readlines ()
|
||
|
m.close ()
|
||
|
|
||
|
i = 0
|
||
|
nLines = len (buff)
|
||
|
|
||
|
while (i < nLines) and (string.find (buff [i], 'import libsip') < 0):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
tmp.write (buff [i] + "\nfrom qt import QCloseEvent")
|
||
|
i = i + 1
|
||
|
|
||
|
while (i < nLines) and (string.find (buff [i], "class KApplication") < 0):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
count = 0
|
||
|
while count < 2:
|
||
|
while (i < nLines) and (string.find (buff [i], "return") < 0):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
count = count + 1
|
||
|
|
||
|
tmp.write (\
|
||
|
"""\tdef quit (self):
|
||
|
\t\tk = KApplication.kApplication ()
|
||
|
\t\te = QCloseEvent ()
|
||
|
|
||
|
\t\tfor w in k.topLevelWidgets ():
|
||
|
\t\t\tif w.inherits ("KMainWindow"):
|
||
|
\t\t\t\tk.sendEvent (w, e)
|
||
|
\t\t\t\tif not e.isAccepted ():
|
||
|
\t\t\t\t\treturn
|
||
|
|
||
|
\t\tQApplication.quit (self)
|
||
|
""")
|
||
|
|
||
|
while (i < nLines):
|
||
|
tmp.write (buff [i])
|
||
|
i = i + 1
|
||
|
|
||
|
tmpfile = open (opPath + tmpname, 'w')
|
||
|
tmpfile.write (tmp.getvalue ())
|
||
|
tmpfile.close ()
|
||
|
tmp.close ()
|
||
|
os.unlink (opPath + fn)
|
||
|
os.rename (opPath + tmpname, opPath + fn)
|
||
|
|
||
|
return True
|
||
|
|
||
|
def fixQVariant ():
|
||
|
infile = os.path.join (opPath, "sipkdecorecmodule.cpp")
|
||
|
if not os.path.exists (infile):
|
||
|
infile = os.path.join (opPath, "sipkdecorepart0.cpp")
|
||
|
if not os.path.exists (infile):
|
||
|
return TRUE
|
||
|
|
||
|
m = open (infile, "r")
|
||
|
n = open (infile + ".new", "w")
|
||
|
looking = True
|
||
|
for line in m:
|
||
|
if looking and line.find ("sipAPIkdecore.h") > 0:
|
||
|
n.write (line)
|
||
|
n.write ('\n#include "sipqtQVariant.h"\n\n')
|
||
|
looking = False
|
||
|
continue
|
||
|
|
||
|
n.write (line)
|
||
|
|
||
|
m.close ()
|
||
|
n.close ()
|
||
|
os.unlink (infile)
|
||
|
os.rename (infile + ".new", infile)
|
||
|
|
||
|
return TRUE
|
||
|
|
||
|
def fixSignal (filelist):
|
||
|
for file in filelist:
|
||
|
if file [-1] == "h":
|
||
|
times = 1
|
||
|
else:
|
||
|
times = 2
|
||
|
|
||
|
infile = os.path.join (opPath, file)
|
||
|
m = open (infile, "r")
|
||
|
n = open (infile + ".new", "w")
|
||
|
|
||
|
count = 0
|
||
|
for line in m:
|
||
|
if count < times:
|
||
|
if string.find (line, "proxySlot(unsigned long)") > 0\
|
||
|
or string.find (line, "proxySlot(unsigned long a0)") > 0:
|
||
|
line = string.replace (line, "unsigned long", "WId")
|
||
|
count = count + 1
|
||
|
|
||
|
n.write (line)
|
||
|
|
||
|
m.close ()
|
||
|
n.close ()
|
||
|
os.unlink (infile)
|
||
|
os.rename (infile + ".new", infile)
|
||
|
|
||
|
return TRUE
|
||
|
|
||
|
|
||
|
def kjsfix (filelist):
|
||
|
for fn in filelist:
|
||
|
if not os.path.exists (opPath + fn):
|
||
|
continue
|
||
|
m = open (opPath + fn, 'r')
|
||
|
tmpname = os.path.splitext (fn) [0] + '.tmp'
|
||
|
|
||
|
buff = m.readlines ()
|
||
|
m.close ()
|
||
|
|
||
|
i = 0
|
||
|
nLines = len (buff)
|
||
|
|
||
|
purevirt = ["toPrimitive", "toBoolean", "toNumber", "toString", "toObject"]
|
||
|
|
||
|
while (i < nLines):
|
||
|
if string.find (buff [i], "KJS::ExecState") >= 0:
|
||
|
for pv in purevirt:
|
||
|
if string.find (buff [i], pv) >= 0:
|
||
|
i = i + 2
|
||
|
buff [i] = "\t\treturn KJS::ObjectImp::%s(a0);" % pv
|
||
|
i = i + 1
|
||
|
while string.find (buff [i], "}") < 0:
|
||
|
buff [i] = ""
|
||
|
i = i + 1
|
||
|
break
|
||
|
i = i + 1
|
||
|
|
||
|
tmpfile = open (opPath + tmpname, 'w')
|
||
|
i = 0
|
||
|
while (i < nLines):
|
||
|
tmpfile.write (buff [i])
|
||
|
i = i + 1
|
||
|
tmpfile.close ()
|
||
|
os.unlink (opPath + fn)
|
||
|
os.rename (opPath + tmpname, opPath + fn)
|
||
|
|
||
|
return TRUE
|
||
|
|
||
|
# --------- main ----------
|
||
|
|
||
|
if not getOptions ():
|
||
|
sys.exit (-1)
|
||
|
|
||
|
if operation != "shpix":
|
||
|
filelist = getFilelist ()
|
||
|
if filelist == []:
|
||
|
sys.exit (0)
|
||
|
|
||
|
if operation == "tr":
|
||
|
if not trFix (filelist):
|
||
|
print 'operation error -- tr'
|
||
|
sys.exit (-1)
|
||
|
|
||
|
elif operation == 'qtNoTr':
|
||
|
if not qtNoTr (filelist):
|
||
|
print 'operation error -- qtNoTr'
|
||
|
sys.exit (-1)
|
||
|
|
||
|
elif operation == 'shpix':
|
||
|
if not shpix ():
|
||
|
print 'operation error -- shpix'
|
||
|
sys.exit (-1)
|
||
|
|
||
|
elif operation == "notify":
|
||
|
if not notify ():
|
||
|
print "operation error -- notify"
|
||
|
sys.exit (-1)
|
||
|
|
||
|
elif operation == "varhier":
|
||
|
if not varhier (filelist):
|
||
|
print "operation error -- varhier"
|
||
|
sys.exit (-1)
|
||
|
|
||
|
elif operation == "appQuit":
|
||
|
if not appQuit (filelist):
|
||
|
print "operation error -- appQuit"
|
||
|
sys.exit (-1)
|
||
|
|
||
|
elif operation == "kjsfix":
|
||
|
if not kjsfix (filelist):
|
||
|
print "operation error -- kjsfix"
|
||
|
sys.exit (-1)
|
||
|
|
||
|
elif operation == "fixQVariant":
|
||
|
"""if not fixQVariant ():
|
||
|
print "operation error -- fixQVariant"
|
||
|
sys.exit (-1)"""
|
||
|
|
||
|
elif operation == "fixSignal":
|
||
|
if not fixSignal (filelist):
|
||
|
print "operation error -- fixSignal"
|
||
|
sys.exit (-1)
|
||
|
|
||
|
sys.exit (0)
|