/* * * D-Bus++ - C++ bindings for D-Bus * * Copyright (C) 2005-2007 Paolo Durante * * * This library 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.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "generator_utils.h" using namespace std; const char *tab = " "; const char *header = "\n\ /*\n\ * This file was automatically generated by dbusxx-xml2cpp; DO NOT EDIT!\n\ */\n\ \n\ "; const char *dbus_includes = "\n\ #include \n\ #include \n\ "; void underscorize(string &str) { for (unsigned int i = 0; i < str.length(); ++i) { if (!isalpha(str[i]) && !isdigit(str[i])) str[i] = '_'; } } string stub_name(string name) { underscorize(name); return "_" + name + "_stub"; } const char *atomic_type_to_string(char t) { static struct { char type; const char *name; } atos[] = { { 'y', "uint8_t" }, { 'b', "bool" }, { 'n', "int16_t" }, { 'q', "uint16_t" }, { 'i', "int32_t" }, { 'u', "uint32_t" }, { 'x', "int64_t" }, { 't', "uint64_t" }, { 'd', "double" }, { 's', "std::string" }, { 'o', "::DBus::Path" }, { 'g', "::DBus::Signature" }, { 'v', "::DBus::Variant" }, { '\0', "" } }; int i; for (i = 0; atos[i].type; ++i) { if (atos[i].type == t) break; } return atos[i].name; } void _parse_signature(const string &signature, string &type, unsigned int &i) { for (; i < signature.length(); ++i) { switch (signature[i]) { case 'a': { switch (signature[++i]) { case '{': { type += "std::map< "; const char *atom = atomic_type_to_string(signature[++i]); if (!atom) { cerr << "invalid signature" << endl; exit(-1); } type += atom; type += ", "; ++i; break; } default: { type += "std::vector< "; break; } } _parse_signature(signature, type, i); type += " >"; continue; } case '(': { type += "::DBus::Struct< "; ++i; _parse_signature(signature, type, i); type += " >"; if (signature[i+1]) { type += ", "; } continue; } case ')': case '}': { return; } default: { const char *atom = atomic_type_to_string(signature[i]); if (!atom) { cerr << "invalid signature" << endl; exit(-1); } type += atom; if (signature[i+1] != ')' && signature[i+1] != '}' && i+1 < signature.length()) { type += ", "; } break; } } } } string signature_to_type(const string &signature) { string type; unsigned int i = 0; _parse_signature(signature, type, i); return type; }