rockbox/utils/hwstub/include/hwstub_uri.hpp
Amaury Pouly 3d8a08ca25 hwstub: rewrite and expand library
Rewrite the hwstub library in C++, with a clean and modular design.
The library was designed from the ground up to be aware of multithreading
issues and to handle memory allocation nicely with shared pointers.

Compared to the original library, it brings the following major features:
- support for JZ boot devices, it is very easy to add support for others
- support for network transparent operations (through sockets): both tcp
  and unix domains are support

Change-Id: I75899cb9c7aa938c17ede2bb3f468e7a55d625b4
2016-04-08 19:37:30 +02:00

131 lines
4.8 KiB
C++

/***************************************************************************
* __________ __ ___.
* 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__ */