event loop model. Streams, stream filters, and sockets are converted. Client proxies are almost converted. CServer is in progress. Removed all HTTP code. Haven't converted the necessary win32 arch stuff.
169 lines
4.9 KiB
C++
169 lines
4.9 KiB
C++
/*
|
|
* synergy -- mouse and keyboard sharing utility
|
|
* Copyright (C) 2002 Chris Schoeneman
|
|
*
|
|
* This package is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* found in the file COPYING that should have accompanied this file.
|
|
*
|
|
* This package 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.
|
|
*/
|
|
|
|
#ifndef XARCH_H
|
|
#define XARCH_H
|
|
|
|
#include "common.h"
|
|
#include "stdstring.h"
|
|
|
|
//! Generic thread exception
|
|
/*!
|
|
Exceptions derived from this class are used by the multithreading
|
|
library to perform stack unwinding when a thread terminates. These
|
|
exceptions must always be rethrown by clients when caught.
|
|
*/
|
|
class XThread { };
|
|
|
|
//! Thread exception to cancel
|
|
/*!
|
|
Thrown to cancel a thread. Clients must not throw this type, but
|
|
must rethrow it if caught (by XThreadCancel, XThread, or ...).
|
|
*/
|
|
class XThreadCancel : public XThread { };
|
|
|
|
/*!
|
|
\def RETHROW_XTHREAD
|
|
Convenience macro to rethrow an XThread exception but ignore other
|
|
exceptions. Put this in your catch (...) handler after necessary
|
|
cleanup but before leaving or returning from the handler.
|
|
*/
|
|
#define RETHROW_XTHREAD \
|
|
try { throw; } catch (XThread&) { throw; } catch (...) { }
|
|
|
|
//! Lazy error message string evaluation
|
|
/*!
|
|
This class encapsulates platform dependent error string lookup.
|
|
Platforms subclass this type, taking an appropriate error code
|
|
type in the c'tor and overriding eval() to return the error
|
|
string for that error code.
|
|
*/
|
|
class XArchEval {
|
|
public:
|
|
XArchEval() { }
|
|
virtual ~XArchEval() { }
|
|
|
|
virtual XArchEval* clone() const throw() = 0;
|
|
|
|
virtual std::string eval() const throw() = 0;
|
|
};
|
|
|
|
//! Generic exception architecture dependent library
|
|
class XArch {
|
|
public:
|
|
XArch(XArchEval* adoptedEvaluator) : m_eval(adoptedEvaluator) { }
|
|
XArch(const std::string& msg) : m_eval(NULL), m_what(msg) { }
|
|
XArch(const XArch& e) : m_eval(e.m_eval->clone()), m_what(e.m_what) { }
|
|
~XArch() { delete m_eval; }
|
|
|
|
std::string what() const throw();
|
|
|
|
private:
|
|
XArchEval* m_eval;
|
|
mutable std::string m_what;
|
|
};
|
|
|
|
// Macro to declare XArch derived types
|
|
#define XARCH_SUBCLASS(name_, super_) \
|
|
class name_ : public super_ { \
|
|
public: \
|
|
name_(XArchEval* adoptedEvaluator) : super_(adoptedEvaluator) { } \
|
|
name_(const std::string& msg) : super_(msg) { } \
|
|
}
|
|
|
|
//! Generic network exception
|
|
/*!
|
|
Exceptions derived from this class are used by the networking
|
|
library to indicate various errors.
|
|
*/
|
|
XARCH_SUBCLASS(XArchNetwork, XArch);
|
|
|
|
//! Operation would block
|
|
XARCH_SUBCLASS(XArchNetworkWouldBlock, XArchNetwork);
|
|
|
|
//! Network insufficient permission
|
|
XARCH_SUBCLASS(XArchNetworkAccess, XArchNetwork);
|
|
|
|
//! Network insufficient resources
|
|
XARCH_SUBCLASS(XArchNetworkResource, XArchNetwork);
|
|
|
|
//! No support for requested network resource/service
|
|
XARCH_SUBCLASS(XArchNetworkSupport, XArchNetwork);
|
|
|
|
//! Network I/O error
|
|
XARCH_SUBCLASS(XArchNetworkIO, XArchNetwork);
|
|
|
|
//! Network address is unavailable or not local
|
|
XARCH_SUBCLASS(XArchNetworkNoAddress, XArchNetwork);
|
|
|
|
//! Network address in use
|
|
XARCH_SUBCLASS(XArchNetworkAddressInUse, XArchNetwork);
|
|
|
|
//! No route to address
|
|
XARCH_SUBCLASS(XArchNetworkNoRoute, XArchNetwork);
|
|
|
|
//! Socket not connected
|
|
XARCH_SUBCLASS(XArchNetworkNotConnected, XArchNetwork);
|
|
|
|
//! Remote read end of socket has closed
|
|
XARCH_SUBCLASS(XArchNetworkShutdown, XArchNetwork);
|
|
|
|
//! Remote end of socket has disconnected
|
|
XARCH_SUBCLASS(XArchNetworkDisconnected, XArchNetwork);
|
|
|
|
//! Remote end of socket refused connection
|
|
XARCH_SUBCLASS(XArchNetworkConnectionRefused, XArchNetwork);
|
|
|
|
//! Connection is in progress
|
|
XARCH_SUBCLASS(XArchNetworkConnecting, XArchNetwork);
|
|
|
|
//! Remote end of socket is not responding
|
|
XARCH_SUBCLASS(XArchNetworkTimedOut, XArchNetwork);
|
|
|
|
//! Generic network name lookup erros
|
|
XARCH_SUBCLASS(XArchNetworkName, XArchNetwork);
|
|
|
|
//! The named host is unknown
|
|
XARCH_SUBCLASS(XArchNetworkNameUnknown, XArchNetworkName);
|
|
|
|
//! The named host is known but has to address
|
|
XARCH_SUBCLASS(XArchNetworkNameNoAddress, XArchNetworkName);
|
|
|
|
//! Non-recoverable name server error
|
|
XARCH_SUBCLASS(XArchNetworkNameFailure, XArchNetworkName);
|
|
|
|
//! Temporary name server error
|
|
XARCH_SUBCLASS(XArchNetworkNameUnavailable, XArchNetworkName);
|
|
|
|
//! Generic daemon exception
|
|
/*!
|
|
Exceptions derived from this class are used by the daemon
|
|
library to indicate various errors.
|
|
*/
|
|
XARCH_SUBCLASS(XArchDaemon, XArch);
|
|
|
|
//! Could not daemonize
|
|
XARCH_SUBCLASS(XArchDaemonFailed, XArchDaemon);
|
|
|
|
//! Could not install daemon
|
|
XARCH_SUBCLASS(XArchDaemonInstallFailed, XArchDaemon);
|
|
|
|
//! Could not uninstall daemon
|
|
XARCH_SUBCLASS(XArchDaemonUninstallFailed, XArchDaemon);
|
|
|
|
//! Attempted to uninstall a daemon that was not installed
|
|
XARCH_SUBCLASS(XArchDaemonUninstallNotInstalled, XArchDaemonUninstallFailed);
|
|
|
|
|
|
#endif
|