aboutsummaryrefslogtreecommitdiff
path: root/tools/depends/native/JsonSchemaBuilder/src/JsonSchemaBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/depends/native/JsonSchemaBuilder/src/JsonSchemaBuilder.cpp')
-rw-r--r--tools/depends/native/JsonSchemaBuilder/src/JsonSchemaBuilder.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/tools/depends/native/JsonSchemaBuilder/src/JsonSchemaBuilder.cpp b/tools/depends/native/JsonSchemaBuilder/src/JsonSchemaBuilder.cpp
new file mode 100644
index 0000000000..d1e01a0a0d
--- /dev/null
+++ b/tools/depends/native/JsonSchemaBuilder/src/JsonSchemaBuilder.cpp
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2011 Tobias Arrskog
+ * https://github.com/topfs2/jsd_builder
+ *
+ * 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, 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 XBMC; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#include <fstream>
+#include <iostream>
+#include <string>
+
+using namespace std;
+
+void print_version(ifstream &in, ofstream &out)
+{
+ string line;
+ if (getline(in, line))
+ out << line;
+}
+
+void print_license(ifstream &in, ofstream &out)
+{
+ string line;
+
+ while (getline(in, line, '\n'))
+ out << line << endl;
+}
+
+void print_json(ifstream &in, ofstream &out)
+{
+ string line;
+ unsigned int count = 0;
+ bool closing = false;
+
+ while (getline(in, line, '\n'))
+ {
+ // No need to handle the last line
+ if (line == "}")
+ {
+ out << endl;
+ continue;
+ }
+
+ // If we just closed a whole object we need to print the separator
+ if (closing)
+ out << "," << endl;
+
+ out << " ";
+ bool started = false;
+ closing = false;
+ for (string::iterator itr = line.begin(); itr != line.end(); itr++)
+ {
+ // Count opening { but ignore the first one
+ if (*itr == '{')
+ {
+ count++;
+ if (count == 1)
+ break;
+ }
+ // Replace tabs with 2 spaces
+ if (*itr == '\t')
+ {
+ out << " ";
+ continue;
+ }
+ // Count closing } but ignore the last one
+ if (*itr == '}')
+ {
+ count--;
+ if (count == 0)
+ break;
+
+ if (count == 1)
+ {
+ out << "\"}\"";
+ closing = true;
+ break;
+ }
+ }
+ // Only print a " before the first real sign
+ if (!started && *itr != ' ')
+ {
+ started = true;
+ out << '"';
+ }
+ // Add a backslash before a double-quote and backslashes
+ if (*itr == '"' || *itr == '\\')
+ out << '\\';
+ out << (*itr);
+ }
+ // Only print a closing " if there was real content on the line
+ if (started)
+ out << '"';
+
+ // Only print a newline if we haven't just closed a whole object
+ if (!closing)
+ out << endl;
+ }
+}
+
+void print_usage(const char *application)
+{
+ cout << application << " version.txt license.txt methods.json types.json notifications.json" << endl;
+}
+
+int main(int argc, char* argv[])
+{
+ if (argc < 6)
+ {
+ print_usage(argv[0]);
+ return -1;
+ }
+
+ ofstream out ("ServiceDescription.h", ofstream::binary);
+
+ ifstream version(argv[1], ios_base::in);
+ ifstream license(argv[2], ios_base::in);
+ ifstream methods(argv[3], ios_base::in);
+ ifstream types(argv[4], ios_base::in);
+ ifstream notifications(argv[5], ios_base::in);
+
+ if (!(version && license && methods && types && notifications))
+ {
+ cout << "Failed to find one or more of version.txt, license.txt, methods.json, types.json or notifications.json" << endl;
+ return -1;
+ }
+
+ out << "#pragma once" << endl;
+
+ print_license(license, out);
+
+ out << endl;
+
+ out << "namespace JSONRPC" << endl;
+ out << "{" << endl;
+ out << " const char* const JSONRPC_SERVICE_ID = \"http://xbmc.org/jsonrpc/ServiceDescription.json\";" << endl;
+ out << " const char* const JSONRPC_SERVICE_VERSION = \""; print_version(version, out); out << "\";" << endl;
+ out << " const char* const JSONRPC_SERVICE_DESCRIPTION = \"JSON-RPC API of XBMC\";" << endl;
+ out << endl;
+
+ out << " const char* const JSONRPC_SERVICE_TYPES[] = {";
+ print_json(types, out);
+ out << " };" << endl;
+ out << endl;
+
+ out << " const char* const JSONRPC_SERVICE_METHODS[] = {";
+ print_json(methods, out);
+ out << " };" << endl;
+ out << endl;
+
+ out << " const char* const JSONRPC_SERVICE_NOTIFICATIONS[] = {";
+ print_json(notifications, out);
+ out << " };" << endl;
+
+ out << "}" << endl;
+
+ return 0;
+}