diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2012-09-29 19:38:38 +0200 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2012-10-02 23:09:03 +0200 |
commit | 94b793bfbba4b51137aa534548c97d8e52d17386 (patch) | |
tree | 8634de433609b85846f8426c8d5e72191eb722f5 | |
parent | 38a15c2452e32b71a8ce1112b54327f3ecfbb1c4 (diff) |
Import controller class from spice-xpi
-rw-r--r-- | CMakeLists.txt | 4 | ||||
-rw-r--r-- | controller.cpp | 192 | ||||
-rw-r--r-- | controller.h | 87 | ||||
-rw-r--r-- | rederrorcodes.h | 70 |
4 files changed, 353 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 1345b91..32c1785 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,3 +41,7 @@ include_platform() find_package(PkgConfig) pkg_check_modules(SPICE_PROTOCOL spice-protocol) include_directories(${SPICE_PROTOCOL_INCLUDE_DIRS}) + +pkg_check_modules(GLIB2 glib-2.0) +include_directories(${GLIB2}) +target_link_libraries (${PLUGIN_NAME} ${GLIB2_LIBRARIES}) diff --git a/controller.cpp b/controller.cpp new file mode 100644 index 0000000..b912c27 --- /dev/null +++ b/controller.cpp @@ -0,0 +1,192 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Copyright 2009-2011, Red Hat Inc. + * Based on mozilla.org's scriptable plugin example + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Uri Lublin + * Martin Stransky + * Peter Hatina + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include <cstdio> +#include <cstdlib> +#include <cstring> +#include <cerrno> +#include <glib.h> + +extern "C" { +# include <stdint.h> +# include <unistd.h> +# include <fcntl.h> +# include <sys/socket.h> +# include <sys/un.h> +} + +#include "rederrorcodes.h" +#include "controller.h" + +SpiceController::SpiceController(): + m_client_socket(-1) +{ +} + +SpiceController::SpiceController(const std::string &name): + m_client_socket(-1), + m_name(name) +{ +} + +SpiceController::~SpiceController() +{ + g_debug(G_STRFUNC); + Disconnect(); +} + +void SpiceController::SetFilename(const std::string &name) +{ + m_name = name; +} + +int SpiceController::Connect() +{ + // check, if we have a filename for socket to create + if (m_name.empty()) + return -1; + + if (m_client_socket == -1) + { + if ((m_client_socket = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + { + g_critical("controller socket: %s", g_strerror(errno)); + return -1; + } + } + + struct sockaddr_un remote; + remote.sun_family = AF_UNIX; + if (m_name.length() + 1 > sizeof(remote.sun_path)) + return -1; + strcpy(remote.sun_path, m_name.c_str()); + + int rc = connect(m_client_socket, (struct sockaddr *) &remote, strlen(remote.sun_path) + sizeof(remote.sun_family)); + if (rc == -1) + { + g_critical("controller connect: %s", g_strerror(errno)); + } + else + { + g_debug("controller connected"); + } + + return rc; +} + +int SpiceController::Connect(const int nRetries) +{ + int rc = -1; + int sleep_time = 0; + + // try to connect for specified count + for (int i = 0; rc != 0 && i < nRetries; ++i) + { + rc = Connect(); + sleep(sleep_time); + ++sleep_time; + } + + return rc; +} + +void SpiceController::Disconnect() +{ + // close the socket + close(m_client_socket); + m_client_socket = -1; + + // delete the temporary file, which is used for the socket + unlink(m_name.c_str()); + m_name.clear(); +} + +uint32_t SpiceController::Write(const void *lpBuffer, uint32_t nBytesToWrite) +{ + ssize_t len = send(m_client_socket, lpBuffer, nBytesToWrite, 0); + + if (len != (ssize_t)nBytesToWrite) + { + g_warning("incomplete send, bytes to write = %u, bytes written = %zd: %s", + nBytesToWrite, len, g_strerror(errno)); + } + + return len; +} + +int SpiceController::TranslateRC(int nRC) +{ + switch (nRC) + { + case SPICEC_ERROR_CODE_SUCCESS: + return 0; + + case SPICEC_ERROR_CODE_GETHOSTBYNAME_FAILED: + return RDP_ERROR_CODE_HOST_NOT_FOUND; + + case SPICEC_ERROR_CODE_CONNECT_FAILED: + return RDP_ERROR_CODE_WINSOCK_CONNECT_FAILED; + + case SPICEC_ERROR_CODE_ERROR: + case SPICEC_ERROR_CODE_SOCKET_FAILED: + return RDP_ERROR_CODE_INTERNAL_ERROR; + + case SPICEC_ERROR_CODE_RECV_FAILED: + return RDP_ERROR_RECV_WINSOCK_FAILED; + + case SPICEC_ERROR_CODE_SEND_FAILED: + return RDP_ERROR_SEND_WINSOCK_FAILED; + + case SPICEC_ERROR_CODE_NOT_ENOUGH_MEMORY: + return RDP_ERROR_CODE_OUT_OF_MEMORY; + + case SPICEC_ERROR_CODE_AGENT_TIMEOUT: + return RDP_ERROR_CODE_TIMEOUT; + + case SPICEC_ERROR_CODE_AGENT_ERROR: + return RDP_ERROR_CODE_INTERNAL_ERROR; + + default: + return RDP_ERROR_CODE_INTERNAL_ERROR; + } +} + diff --git a/controller.h b/controller.h new file mode 100644 index 0000000..07c04c7 --- /dev/null +++ b/controller.h @@ -0,0 +1,87 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Copyright 2009-2011, Red Hat Inc. + * Based on mozilla.org's scriptable plugin example + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Uri Lublin + * Martin Stransky + * Peter Hatina + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef SPICE_CONTROLLER_H +#define SPICE_CONTROLLER_H + +/* + Basic assumption: + ------------------ + Cross platform compatible. + Easy to transform into remote process communication + Secured + + chosen: + Unix - Unix Domain Sockets (easy to change into regular sockets for remote communication) + Windows - Named pipe (which allows remote access and is duplex + (rather than anonymous pipe which is local only and one way) +*/ + +#include <string> +extern "C" { +# include <stdint.h> +# include <limits.h> +} + +#include <spice/controller_prot.h> + +class SpiceController +{ +public: + SpiceController(); + SpiceController(const std::string &name); + ~SpiceController(); + + void SetFilename(const std::string &name); + int Connect(); + int Connect(int nRetries); + void Disconnect(); + uint32_t Write(const void *lpBuffer, uint32_t nBytesToWrite); + + static int TranslateRC(int nRC); + +private: + int m_client_socket; + std::string m_name; +}; + +#endif // SPICE_CONTROLLER_H diff --git a/rederrorcodes.h b/rederrorcodes.h new file mode 100644 index 0000000..1e3cca2 --- /dev/null +++ b/rederrorcodes.h @@ -0,0 +1,70 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Copyright 2009-2011, Red Hat Inc. + * Based on mozilla.org's scriptable plugin example + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Uri Lublin + * Peter Hatina + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef RED_ERROR_CODES_H +#define RED_ERROR_CODES_H + +#define SPICEC_ERROR_CODE_SUCCESS (0) +#define SPICEC_ERROR_CODE_ERROR (-1) +#define SPICEC_ERROR_CODE_GETHOSTBYNAME_FAILED (-2) +#define SPICEC_ERROR_CODE_CONNECT_FAILED (-3) +#define SPICEC_ERROR_CODE_SOCKET_FAILED (-4) +#define SPICEC_ERROR_CODE_SEND_FAILED (-5) +#define SPICEC_ERROR_CODE_RECV_FAILED (-6) +#define SPICEC_ERROR_CODE_SSL_ERROR (-7) +#define SPICEC_ERROR_CODE_NOT_ENOUGH_MEMORY (-8) +#define SPICEC_ERROR_CODE_AGENT_TIMEOUT (-9) +#define SPICEC_ERROR_CODE_AGENT_ERROR (-10) +#define SPICEC_ERROR_CODE_VERSION_MISMATCH (-11) +#define SPICEC_ERROR_CODE_PERMISSION_DENIED (-12) + +// http://msdn.microsoft.com/en-us/library/aa911976.aspx +#define RDP_ERROR_CODE_LOCAL_DISCONNECTION (1) +#define RDP_ERROR_CODE_DNS_LOOKUP_FAILED (260) +#define RDP_ERROR_CODE_OUT_OF_MEMORY (262) +#define RDP_ERROR_CODE_WINSOCK_CONNECT_FAILED (516) +#define RDP_ERROR_CODE_HOST_NOT_FOUND (520) +#define RDP_ERROR_CODE_INTERNAL_ERROR (1032) +#define RDP_ERROR_RECV_WINSOCK_FAILED (1028) +#define RDP_ERROR_SEND_WINSOCK_FAILED (772) +#define RDP_ERROR_CODE_TIMEOUT (1796) + +#endif // RED_ERROR_CODES_H |