summaryrefslogtreecommitdiffstats
path: root/utils/hwstub/include/hwstub_uri.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/hwstub/include/hwstub_uri.hpp')
-rw-r--r--utils/hwstub/include/hwstub_uri.hpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/utils/hwstub/include/hwstub_uri.hpp b/utils/hwstub/include/hwstub_uri.hpp
new file mode 100644
index 0000000000..d461764cd9
--- /dev/null
+++ b/utils/hwstub/include/hwstub_uri.hpp
@@ -0,0 +1,131 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2016 by Amaury Pouly
+ *
+ * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#ifndef __HWSTUB_URI_HPP__
+#define __HWSTUB_URI_HPP__
+
+#include "hwstub.hpp"
+#include "hwstub_net.hpp"
+
+namespace hwstub {
+namespace uri {
+
+/** HWSTUB URIs
+ *
+ * They are of the form:
+ *
+ * scheme:[//domain[:port]][/][path[?query]]
+ *
+ * The scheme is mandatory and controls the type of context that is created.
+ * The following scheme are recognized:
+ * usb USB context
+ * tcp TCP context
+ * unix Unix domain context
+ * virt Virtual context (Testing and debugging)
+ * default Default context (This is the default)
+ *
+ * When creating a USB context, the domain and port must be empty:
+ * usb:
+ *
+ * When creating a TCP context, the domain and port are given as argument to
+ * the context:
+ * tcp://localhost:6666
+ *
+ * When creating a Unix context, the domain is given as argument to
+ * the context, it is invalid to specify a port. There are two types of
+ * unix contexts: the one specified by a filesystem path, or (Linux-only) by
+ * an abstract domain. Abstract names are specified as a domain starting with a '#',
+ * whereas standard path can be any path:
+ * unix:///path/to/socket
+ * unix://#hwstub
+ *
+ * When creating a virtual context, the domain will contain a specification of
+ * the device to create. The device list is of the type(param);type(param);...
+ * where the only supported type at the moment is 'dummy' with a single parameter
+ * which is the device name:
+ * virt://dummy(Device A);dummy(Device B);dummy(Super device C)
+ *
+ *
+ * HWSTUB SERVER URIs
+ *
+ * The same scheme can be used to spawn servers. Server URIs are a subset of
+ * context URIs and only support tcp and unix schemes.
+ */
+
+/** URI
+ *
+ * Represents an URI and allows queries on it */
+class uri
+{
+public:
+ uri(const std::string& uri);
+ /** Return whether the URI is syntactically correct */
+ bool valid() const;
+ /** Return error description if URI is invalid */
+ std::string error() const;
+ /** Return the original URI */
+ std::string full_uri() const;
+ /** Return the scheme */
+ std::string scheme() const;
+ /** Return the domain, or empty is none */
+ std::string domain() const;
+ /** Return the port, or empty is none */
+ std::string port() const;
+ /** Return the path, or empty is none */
+ std::string path() const;
+
+protected:
+ void parse();
+ bool validate_scheme();
+ bool validate_domain();
+ bool validate_port();
+
+ std::string m_uri; /* original uri */
+ bool m_valid; /* did it parse correctly ? */
+ std::string m_scheme; /* scheme (extracted from URI) */
+ std::string m_domain; /* domain (extracted from URI) */
+ std::string m_port; /* port (extracted from URI) */
+ std::string m_path; /* path (extracted from URI) */
+ std::string m_error; /* error string (for invalid URIs) */
+};
+
+/** Create a context based on a URI. This function only uses the scheme/domain/port
+ * parts of the URI. This function may fail and return a empty pointer. An optional
+ * string can receive a description of the error */
+std::shared_ptr<context> create_context(const uri& uri, std::string *error = nullptr);
+/** Return a safe default for a URI */
+uri default_uri();
+/** Special case function for the default function */
+std::shared_ptr<context> create_default_context(std::string *error = nullptr);
+/** Create a server based on a URI. This function only uses the scheme/domain/port
+ * parts of the URI. This function may fail and return a empty pointer. An optional
+ * string can receive a description of the error */
+std::shared_ptr<net::server> create_server(std::shared_ptr<context> ctx,
+ const uri& uri, std::string *error);
+/** Return a safe default for a server URI */
+uri default_server_uri();
+/** Print help for the format of a URI, typically for a command-line help.
+ * The help can be client-only, server-only, or both. */
+void print_usage(FILE *f, bool client, bool server);
+
+} // namespace uri
+} // namespace hwstub
+
+#endif /* __HWSTUB_URI_HPP__ */