2002-08-02 23:57:46 +04:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2002-05-31 18:43:23 +04:00
|
|
|
#ifndef CCONFIG_H
|
|
|
|
#define CCONFIG_H
|
2001-10-06 18:13:28 +04:00
|
|
|
|
2002-12-23 16:55:21 +03:00
|
|
|
#include "OptionTypes.h"
|
2002-07-15 19:01:36 +04:00
|
|
|
#include "ProtocolTypes.h"
|
2002-06-09 20:53:25 +04:00
|
|
|
#include "CNetworkAddress.h"
|
2003-01-05 01:01:32 +03:00
|
|
|
#include "CStringUtil.h"
|
2002-05-31 21:32:26 +04:00
|
|
|
#include "XBase.h"
|
2002-06-01 23:26:11 +04:00
|
|
|
#include "stdmap.h"
|
2002-06-09 03:24:40 +04:00
|
|
|
#include "stdset.h"
|
2002-06-11 02:06:45 +04:00
|
|
|
#include <iosfwd>
|
2001-10-06 18:13:28 +04:00
|
|
|
|
2002-05-31 22:35:53 +04:00
|
|
|
class CConfig;
|
|
|
|
|
|
|
|
namespace std {
|
2003-07-05 21:04:06 +04:00
|
|
|
template <>
|
2002-05-31 22:35:53 +04:00
|
|
|
struct iterator_traits<CConfig> {
|
|
|
|
typedef CString value_type;
|
|
|
|
typedef ptrdiff_t difference_type;
|
|
|
|
typedef bidirectional_iterator_tag iterator_category;
|
|
|
|
typedef CString* pointer;
|
|
|
|
typedef CString& reference;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Server configuration
|
|
|
|
/*!
|
|
|
|
This class holds server configuration information. That includes
|
|
|
|
the names of screens and their aliases, the links between them,
|
|
|
|
and network addresses.
|
|
|
|
|
|
|
|
Note that case is preserved in screen names but is ignored when
|
|
|
|
comparing names. Screen names and their aliases share a
|
|
|
|
namespace and must be unique.
|
|
|
|
*/
|
2002-05-31 18:43:23 +04:00
|
|
|
class CConfig {
|
2002-12-23 16:55:21 +03:00
|
|
|
public:
|
|
|
|
typedef std::map<OptionID, OptionValue> CScreenOptions;
|
|
|
|
|
2002-05-30 20:13:16 +04:00
|
|
|
private:
|
|
|
|
class CCell {
|
|
|
|
public:
|
|
|
|
CString m_neighbor[kLastDirection - kFirstDirection + 1];
|
2002-12-23 16:55:21 +03:00
|
|
|
CScreenOptions m_options;
|
2002-05-30 20:13:16 +04:00
|
|
|
};
|
2002-06-03 22:53:18 +04:00
|
|
|
typedef std::map<CString, CCell, CStringUtil::CaselessCmp> CCellMap;
|
2002-08-11 15:49:36 +04:00
|
|
|
typedef std::map<CString, CString, CStringUtil::CaselessCmp> CNameMap;
|
2002-05-30 20:13:16 +04:00
|
|
|
|
|
|
|
public:
|
|
|
|
typedef CCellMap::const_iterator internal_const_iterator;
|
2002-08-11 15:49:36 +04:00
|
|
|
typedef CNameMap::const_iterator all_const_iterator;
|
2002-05-31 22:35:53 +04:00
|
|
|
class const_iterator : std::iterator_traits<CConfig> {
|
2002-05-30 20:13:16 +04:00
|
|
|
public:
|
|
|
|
explicit const_iterator() : m_i() { }
|
|
|
|
explicit const_iterator(const internal_const_iterator& i) : m_i(i) { }
|
|
|
|
|
|
|
|
const_iterator& operator=(const const_iterator& i) {
|
|
|
|
m_i = i.m_i;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
CString operator*() { return m_i->first; }
|
|
|
|
const CString* operator->() { return &(m_i->first); }
|
|
|
|
const_iterator& operator++() { ++m_i; return *this; }
|
|
|
|
const_iterator operator++(int) { return const_iterator(m_i++); }
|
|
|
|
const_iterator& operator--() { --m_i; return *this; }
|
|
|
|
const_iterator operator--(int) { return const_iterator(m_i--); }
|
|
|
|
bool operator==(const const_iterator& i) const {
|
|
|
|
return (m_i == i.m_i);
|
|
|
|
}
|
|
|
|
bool operator!=(const const_iterator& i) const {
|
|
|
|
return (m_i != i.m_i);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2002-06-01 23:26:11 +04:00
|
|
|
internal_const_iterator m_i;
|
2002-05-30 20:13:16 +04:00
|
|
|
};
|
2001-10-06 18:13:28 +04:00
|
|
|
|
2002-05-31 18:43:23 +04:00
|
|
|
CConfig();
|
|
|
|
virtual ~CConfig();
|
2001-10-06 18:13:28 +04:00
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! @name manipulators
|
|
|
|
//@{
|
2001-10-06 18:13:28 +04:00
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Add screen
|
|
|
|
/*!
|
|
|
|
Adds a screen, returning true iff successful. If a screen or
|
|
|
|
alias with the given name exists then it fails.
|
|
|
|
*/
|
2002-06-09 03:24:40 +04:00
|
|
|
bool addScreen(const CString& name);
|
2002-07-30 18:59:36 +04:00
|
|
|
|
2002-08-11 15:49:36 +04:00
|
|
|
//! Rename screen
|
|
|
|
/*!
|
|
|
|
Renames a screen. All references to the name are updated.
|
|
|
|
Returns true iff successful.
|
|
|
|
*/
|
|
|
|
bool renameScreen(const CString& oldName,
|
|
|
|
const CString& newName);
|
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Remove screen
|
|
|
|
/*!
|
|
|
|
Removes a screen. This also removes aliases for the screen and
|
|
|
|
disconnects any connections to the screen. \c name may be an
|
|
|
|
alias.
|
|
|
|
*/
|
2001-10-06 18:13:28 +04:00
|
|
|
void removeScreen(const CString& name);
|
2002-07-30 18:59:36 +04:00
|
|
|
|
|
|
|
//! Remove all screens
|
|
|
|
/*!
|
|
|
|
Removes all screens, aliases, and connections.
|
|
|
|
*/
|
2001-10-06 18:13:28 +04:00
|
|
|
void removeAllScreens();
|
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Add alias
|
|
|
|
/*!
|
|
|
|
Adds an alias for a screen name. An alias can be used
|
|
|
|
any place the canonical screen name can (except addScreen()).
|
|
|
|
Returns false if the alias name already exists or the canonical
|
|
|
|
name is unknown, otherwise returns true.
|
|
|
|
*/
|
2002-06-09 03:24:40 +04:00
|
|
|
bool addAlias(const CString& canonical,
|
2002-06-11 02:06:45 +04:00
|
|
|
const CString& alias);
|
2002-07-30 18:59:36 +04:00
|
|
|
|
|
|
|
//! Remove alias
|
|
|
|
/*!
|
|
|
|
Removes an alias for a screen name. It returns false if the
|
|
|
|
alias is unknown or a canonical name, otherwise returns true.
|
|
|
|
*/
|
2002-06-09 03:24:40 +04:00
|
|
|
bool removeAlias(const CString& alias);
|
2002-07-30 18:59:36 +04:00
|
|
|
|
|
|
|
//! Remove all aliases
|
|
|
|
/*!
|
|
|
|
This removes all aliases but not the screens.
|
|
|
|
*/
|
2002-06-09 03:24:40 +04:00
|
|
|
void removeAllAliases();
|
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Connect screens
|
|
|
|
/*!
|
|
|
|
Establishes a one-way connection between opposite edges of two
|
|
|
|
screens. The user will be able to jump from the \c srcSide of
|
|
|
|
screen \c srcName to the opposite side of screen \c dstName
|
|
|
|
when both screens are connected to the server and the user
|
|
|
|
isn't locked to a screen. Returns false if \c srcName is
|
|
|
|
unknown.
|
|
|
|
*/
|
2002-06-09 03:24:40 +04:00
|
|
|
bool connect(const CString& srcName,
|
2002-06-11 02:06:45 +04:00
|
|
|
EDirection srcSide,
|
|
|
|
const CString& dstName);
|
2002-07-30 18:59:36 +04:00
|
|
|
|
|
|
|
//! Disconnect screens
|
|
|
|
/*!
|
|
|
|
Removes a connection created by connect(). Returns false if
|
|
|
|
\c srcName is unknown.
|
|
|
|
*/
|
2002-06-09 03:24:40 +04:00
|
|
|
bool disconnect(const CString& srcName,
|
2002-06-11 02:06:45 +04:00
|
|
|
EDirection srcSide);
|
2001-10-06 18:13:28 +04:00
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Set server address
|
|
|
|
/*!
|
|
|
|
Set the synergy listen addresses. There is no default address so
|
|
|
|
this must be called to run a server using this configuration.
|
|
|
|
*/
|
2002-06-09 20:53:25 +04:00
|
|
|
void setSynergyAddress(const CNetworkAddress&);
|
2002-07-30 18:59:36 +04:00
|
|
|
|
2002-12-23 16:55:21 +03:00
|
|
|
//! Add a screen option
|
|
|
|
/*!
|
|
|
|
Adds an option and its value to the named screen. Replaces the
|
|
|
|
existing option's value if there is one. Returns true iff \c name
|
|
|
|
is a known screen.
|
|
|
|
*/
|
|
|
|
bool addOption(const CString& name,
|
2003-01-25 16:34:51 +03:00
|
|
|
OptionID option, OptionValue value);
|
2002-12-23 16:55:21 +03:00
|
|
|
|
|
|
|
//! Remove a screen option
|
|
|
|
/*!
|
|
|
|
Removes an option and its value from the named screen. Does
|
|
|
|
nothing if the option doesn't exist on the screen. Returns true
|
|
|
|
iff \c name is a known screen.
|
|
|
|
*/
|
2003-01-25 16:34:51 +03:00
|
|
|
bool removeOption(const CString& name, OptionID option);
|
|
|
|
|
|
|
|
//! Remove a screen options
|
|
|
|
/*!
|
|
|
|
Removes all options and values from the named screen. Returns true
|
|
|
|
iff \c name is a known screen.
|
|
|
|
*/
|
|
|
|
bool removeOptions(const CString& name);
|
2002-12-23 16:55:21 +03:00
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//@}
|
|
|
|
//! @name accessors
|
|
|
|
//@{
|
2001-10-06 18:13:28 +04:00
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Test screen name validity
|
|
|
|
/*!
|
|
|
|
Returns true iff \c name is a valid screen name.
|
|
|
|
*/
|
|
|
|
bool isValidScreenName(const CString& name) const;
|
2002-05-31 21:32:26 +04:00
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Get beginning (canonical) screen name iterator
|
2002-05-30 20:13:16 +04:00
|
|
|
const_iterator begin() const;
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Get ending (canonical) screen name iterator
|
2002-05-30 20:13:16 +04:00
|
|
|
const_iterator end() const;
|
|
|
|
|
2002-08-11 15:49:36 +04:00
|
|
|
//! Get beginning screen name iterator
|
|
|
|
all_const_iterator beginAll() const;
|
|
|
|
//! Get ending screen name iterator
|
|
|
|
all_const_iterator endAll() const;
|
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Test for screen name
|
|
|
|
/*!
|
|
|
|
Returns true iff \c name names a screen.
|
|
|
|
*/
|
2002-05-31 22:08:08 +04:00
|
|
|
bool isScreen(const CString& name) const;
|
2002-05-31 21:32:26 +04:00
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Test for canonical screen name
|
|
|
|
/*!
|
|
|
|
Returns true iff \c name is the canonical name of a screen.
|
|
|
|
*/
|
2002-06-09 03:24:40 +04:00
|
|
|
bool isCanonicalName(const CString& name) const;
|
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Get canonical name
|
|
|
|
/*!
|
|
|
|
Returns the canonical name of a screen or the empty string if
|
|
|
|
the name is unknown. Returns the canonical name if one is given.
|
|
|
|
*/
|
2002-06-09 03:24:40 +04:00
|
|
|
CString getCanonicalName(const CString& name) const;
|
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Get neighbor
|
|
|
|
/*!
|
|
|
|
Returns the canonical screen name of the neighbor in the given
|
|
|
|
direction (set through connect()). Returns the empty string
|
|
|
|
if there is no neighbor in that direction.
|
|
|
|
*/
|
2001-10-14 20:58:01 +04:00
|
|
|
CString getNeighbor(const CString&, EDirection) const;
|
2001-10-06 18:13:28 +04:00
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Get the server address
|
2002-06-09 20:53:25 +04:00
|
|
|
const CNetworkAddress& getSynergyAddress() const;
|
|
|
|
|
2002-12-23 16:55:21 +03:00
|
|
|
//! Get the screen options
|
|
|
|
/*!
|
|
|
|
Returns all the added options for the named screen. Returns NULL
|
|
|
|
if the screen is unknown and an empty collection if there are no
|
|
|
|
options.
|
|
|
|
*/
|
|
|
|
const CScreenOptions* getOptions(const CString& name) const;
|
|
|
|
|
2002-08-11 15:49:36 +04:00
|
|
|
//! Compare configurations
|
|
|
|
bool operator==(const CConfig&) const;
|
|
|
|
//! Compare configurations
|
|
|
|
bool operator!=(const CConfig&) const;
|
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Read configuration
|
|
|
|
/*!
|
|
|
|
Reads a configuration from a stream. Throws XConfigRead on error.
|
|
|
|
*/
|
2002-06-01 23:26:11 +04:00
|
|
|
friend std::istream& operator>>(std::istream&, CConfig&);
|
2002-07-30 18:59:36 +04:00
|
|
|
|
|
|
|
//! Write configuration
|
|
|
|
/*!
|
|
|
|
Writes a configuration to a stream.
|
|
|
|
*/
|
2002-06-01 23:26:11 +04:00
|
|
|
friend std::ostream& operator<<(std::ostream&, const CConfig&);
|
2002-05-31 21:32:26 +04:00
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Get direction name
|
|
|
|
/*!
|
|
|
|
Returns the name of a direction (for debugging).
|
|
|
|
*/
|
2001-10-14 18:37:41 +04:00
|
|
|
static const char* dirName(EDirection);
|
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//@}
|
|
|
|
|
2002-05-31 21:32:26 +04:00
|
|
|
private:
|
2002-06-01 23:26:11 +04:00
|
|
|
static bool readLine(std::istream&, CString&);
|
2003-02-22 19:20:23 +03:00
|
|
|
static OptionValue parseBoolean(const CString&);
|
|
|
|
static OptionValue parseInt(const CString&);
|
2003-02-22 18:03:31 +03:00
|
|
|
static OptionValue parseModifierKey(const CString&);
|
2002-12-23 16:55:21 +03:00
|
|
|
static const char* getOptionName(OptionID);
|
2003-02-22 19:20:23 +03:00
|
|
|
static CString getOptionValue(OptionID, OptionValue);
|
2002-06-01 23:26:11 +04:00
|
|
|
void readSection(std::istream&);
|
2003-02-22 19:20:23 +03:00
|
|
|
void readSectionOptions(std::istream&);
|
2002-06-01 23:26:11 +04:00
|
|
|
void readSectionScreens(std::istream&);
|
|
|
|
void readSectionLinks(std::istream&);
|
2002-06-09 03:24:40 +04:00
|
|
|
void readSectionAliases(std::istream&);
|
2002-05-31 21:32:26 +04:00
|
|
|
|
2002-04-29 18:40:01 +04:00
|
|
|
private:
|
2001-10-06 18:13:28 +04:00
|
|
|
CCellMap m_map;
|
2002-06-09 03:24:40 +04:00
|
|
|
CNameMap m_nameToCanonicalName;
|
2002-06-09 20:53:25 +04:00
|
|
|
CNetworkAddress m_synergyAddress;
|
2003-02-22 19:41:03 +03:00
|
|
|
CScreenOptions m_globalOptions;
|
2001-10-06 18:13:28 +04:00
|
|
|
};
|
|
|
|
|
2002-07-30 18:59:36 +04:00
|
|
|
//! Configuration stream read exception
|
|
|
|
/*!
|
|
|
|
Thrown when a configuration stream cannot be parsed.
|
|
|
|
*/
|
2002-05-31 21:32:26 +04:00
|
|
|
class XConfigRead : public XBase {
|
|
|
|
public:
|
|
|
|
XConfigRead(const CString&);
|
|
|
|
~XConfigRead();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
// XBase overrides
|
|
|
|
virtual CString getWhat() const throw();
|
|
|
|
|
|
|
|
private:
|
|
|
|
CString m_error;
|
|
|
|
};
|
|
|
|
|
2001-10-06 18:13:28 +04:00
|
|
|
#endif
|