/*************************************************************************** GenerateMethod.cpp - generate class with rpc methods ------------------- begin : Sun June 03 2007 email : ulxmlrpcpp@ewald-arnold.de $Id: GenerateMethod.cpp 1020 2007-07-23 09:09:26Z ewald-arnold $ ***************************************************************************/ /************************************************************************** * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser 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 Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * ***************************************************************************/ #include "GenerateMethod.h" #include "UlxrIdlClass.h" #include #include #include #include #ifdef _MSC_VER # include #elif defined(__BORLANDC__) # include #elif defined(__CYGWIN__) # ifdef HAVE_CONFIG_H # include # else # include # endif #else # ifdef HAVE_CONFIG_H # include # else # include # endif #endif bool GenerateMethod::date_output = true; void GenerateMethod::setDateOutput(bool output) { date_output = output; } GenerateMethod::~GenerateMethod() { } std::string GenerateMethod::dateString() { if (date_output) return std::string("// Generated: ") + ulxr::getLatin1(ulxr::HttpProtocol::getDateStr()) + "\n"; else return ""; } void GenerateMethod::generateHeaderHead(std::ostream & h_file, const std::string &name) { h_file << "#ifndef " << name + "_H\n" << "#define " << name + "_H\n" << "\n" << "///////////////////////////////////////////////////////////////////\n" << "// Automatically generated by xml2ulxr v" << ULXR_VERSION << ".\n" << dateString() << "//\n" << "// xml2ulxr is part of Ultra Lightweight XML RPC for C++.\n" << "// See also http://ulxmlrpcpp.sourceforge.net\n" << "//\n" << "// Don't edit manually unless you know what you are doing\n" << "///////////////////////////////////////////////////////////////////\n" << "\n\n"; h_file << "//#define ULXR_UNICODE_ONLY_HELPERS\n" "#include // always first\n\n"; } void GenerateMethod::generateHeaderTail(std::ostream & h_file, const std::string &name) { h_file << "};\n\n"; h_file << "#endif // " << name + "_H\n\n"; } void GenerateMethod::generateSourceHead(std::ostream & cpp_file, const std::string &h_name) { cpp_file << "///////////////////////////////////////////////////////////////////\n" << "// Automatically generated by xml2ulxr v" << ULXR_VERSION << ".\n" << dateString() << "//\n" << "// xml2ulxr is part of Ultra Lightweight XML RPC for C++.\n" << "// See also http://ulxmlrpcpp.sourceforge.net\n" << "//\n" << "// Don't edit manually unless you know what you are doing\n" << "///////////////////////////////////////////////////////////////////\n" << "\n"; cpp_file << "//#define ULXR_UNICODE_ONLY_HELPERS\n" "#include // always first\n\n"; cpp_file << "#include \"" << h_name << "\"\n\n"; } void GenerateMethod::generateUserSourceHead(std::ostream & cpp_file, const std::string &h_name) { cpp_file << "///////////////////////////////////////////////////////////////////\n" << "// Automatically generated by xml2ulxr v" << ULXR_VERSION << ".\n" << dateString() << "//\n" << "// xml2ulxr is part of Ultra Lightweight XML RPC for C++.\n" << "// See also http://ulxmlrpcpp.sourceforge.net\n" << "//\n" << "// Intended for manual and persistent changes \n" << "/////////////////////////////////////////////////\n" << "\n"; cpp_file << "//#define ULXR_UNICODE_ONLY_HELPERS\n" "#include // always first\n\n"; cpp_file << "#include \n"; cpp_file << "#include \"" << h_name << "\"\n\n"; } void GenerateMethod::generate_NameDefines(const std::string &destdir, const std::string &name, const std::vector &theMethods, const std::string &suffix) { std::string h_name = destdir + name + "_ulxr_names.h"; struct stat statbuf; if (stat(h_name.c_str(), &statbuf) >= 0) { std::cout << "User file already exists: " << h_name << std::endl; h_name += ".new"; std::cout << "New template will be created: " << h_name << std::endl; } std::ofstream h_file(h_name.c_str()); std::cout << "Header file will be created: " << h_name << std::endl; h_file << "///////////////////////////////////////////////////////////////////\n" << "// Automatically generated by xml2ulxr v" << ULXR_VERSION << ".\n" << dateString() << "//\n" << "// xml2ulxr is part of Ultra Lightweight XML RPC for C++.\n" << "// See also http://ulxmlrpcpp.sourceforge.net\n" << "//\n" << "// Intended for manual and persistent changes \n" << "/////////////////////////////////////////////////\n" << "\n"; h_file << "#ifndef " << name + "_names_H\n" << "#define " << name + "_names_H\n\n\n" << "// method names\n\n"; for (unsigned i = 0; i < theMethods.size(); ++i) { Method method = theMethods[i]; method.extractNamespace(); h_file << "// mapped to: " << method.getCppString(0, true, ""); if (method.getName() != method.getOverloadName()) h_file << " (there are overloaded methods)"; h_file << "\n"; h_file << "#define ULXR_CALLTO_" << suffix << method.getOverloadName(true, "_", "") << " \\\n ULXR_PCHAR(\"" << name << "_" << method.getOverloadName(false) << "\")\n\n"; } h_file << "\n#endif // " << name + "_H\n"; }