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.
koffice/chalk/core/createdcop.py

172 lines
4.9 KiB

#!/usr/bin/env python
import os, sys
dcopiface_header = """/* This file is part of the KDE project
* Copyright (C) 2005 Boudewijn Rempt <boud@valdyas.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef %(classname_upper)sIFACE_H
#define %(classname_upper)sIFACE_H
#include <dcopref.h>
#include <dcopobj.h>
#include <qstring.h>
class %(classname)s;
class %(classname)sIface : virtual public DCOPObject
{
K_DCOP
public:
%(classname)sIface( %(classname)s * parent );
k_dcop:
private:
%(classname)s *m_parent;
};
#endif
"""
dcopiface_template = """/*
* This file is part of the KDE project
*
* Copyright (C) 2005 Boudewijn Rempt <boud@valdyas.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <kapplication.h>
#include "%(ifaceheader)s"
#include "%(classheader)s"
#include <dcopclient.h>
%(classname)sIface::%(classname)sIface( %(classname)s * parent )
: DCOPObject()
{
m_parent = parent;
}
"""
def parseHeader(headerfile, classname):
# parse the source class header to get a list of functions we're going to wrap
functions = []
if (headerfile.find("private:") > -1):
lines = headerfile[headerfile.find(classname):headerfile.find("private")].splitlines()
else:
lines = headerfile[headerfile.find(classname):headerfile.find("#endif")].splitlines()
i = 0
while i < len(lines):
line = lines[i].strip()
if (line.startswith("/") or
line.startswith("public:") or
line.startswith("*") or
line.startswith(classname) or
line.startswith("class") or
line.startswith("Q_OBJECT") or
line.startswith("#") or
line.startswith("}") or
line.startswith("public Q_SLOTS:") or
line.find("~") != -1 or
len(line) == 0
):
i+=1
continue
if (line.startswith("protected")):
return functions
# by now we are reasonable sure that this is a function. We need to find the end of the function definition, and then
# if the return type is not primitive, replace it with dcopref.
function = line
complete = 0
# strip the inline implementation
if (line.find("{") > -1):
function = line[:line.find("{")]
if function.find("}") > -1:
function += line[line.find("}") + 1:]
complete = 1
else:
i += 1
# search for the missing } on the next lines
while i < len(lines):
if (lines[i].find("}") > -1):
function += lines[i][lines[i].find("}") + 1:]
complete = 1
i += 1
else:
complete = 1
if complete == 0:
i+=1
continue
if (function.endswith("= 0;")):
function = function[:-4] + ";"
print "\t", function
i+=1
def createDCOP(header):
# Determine filenames and classnames
implementation = header[:-1] + "cc"
classname = ""
classname_upper ="_"
for part in header[:-2].split("_"):
classname = classname + part.capitalize()
classname_upper = classname_upper + part.upper() + "_"
ifaceheader = header[:-2] + "_iface.h"
ifaceimplementation = header[:-2] + "_iface.cc"
ifaceclass = classname + "Iface"
#print "with: ", implementation, classname, classname_upper, ifaceheader, ifaceimplementation, ifaceclass
file(ifaceheader, "w+").write(dcopiface_header % { "classname_upper" : classname_upper,
"classname" : classname})
file(ifaceimplementation, "w+").write(dcopiface_template % {"ifaceheader" : ifaceheader,
"classheader" : header,
"classname" : classname })
functions = parseHeader(open(header).read(), classname)
def main(args):
for line in args[1:]:
print "Going to create a dcop interface for:", line[:-1]
createDCOP(line.strip())
if __name__=="__main__":
main(sys.argv)