Deskflow 1.24.0.365
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
Config.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
4 * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
5 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
6 */
7
8#pragma once
9
10#include "base/BaseException.h"
11#include "base/String.h"
14#include "net/NetworkAddress.h"
15#include "server/InputFilter.h"
16
17#include <iosfwd>
18#include <map>
19#include <set>
20
21namespace deskflow::server {
22class Config;
24} // namespace deskflow::server
25
26class IEventQueue;
27
28namespace std {
29template <> struct iterator_traits<deskflow::server::Config>
30{
31 using value_type = std::string;
32 using difference_type = ptrdiff_t;
33 using iterator_category = bidirectional_iterator_tag;
34 using pointer = std::string *;
35 using reference = std::string &;
36};
37} // namespace std
38
39namespace deskflow::server {
40
42
51class Config
52{
53public:
54 using ScreenOptions = std::map<OptionID, OptionValue>;
55 using Interval = std::pair<float, float>;
56
58 {
59 public:
60 CellEdge(Direction side, float position);
61 CellEdge(Direction side, const Interval &);
62 CellEdge(const std::string &name, Direction side, const Interval &);
63 ~CellEdge() = default;
64
65 Interval getInterval() const;
66 void setName(const std::string_view &newName);
67 std::string getName() const;
68 Direction getSide() const;
69 bool overlaps(const CellEdge &) const;
70 bool isInside(float x) const;
71
72 // transform position to [0,1]
73 float transform(float x) const;
74
75 // transform [0,1] to position
76 float inverseTransform(float x) const;
77
78 // compares side and start of interval
79 bool operator<(const CellEdge &) const;
80
81 // compares side and interval
82 bool operator==(const CellEdge &) const;
83
84 private:
85 void init(const std::string_view &name, Direction side, const Interval &);
86
87 private:
88 std::string m_name;
89 Direction m_side;
90 Interval m_interval;
91 };
92
93private:
94 class Name
95 {
96 public:
97 Name(Config *, const std::string &name);
98
99 bool operator==(const std::string &name) const;
100
101 private:
102 Config *m_config;
103 std::string m_name;
104 };
105
106 class Cell
107 {
108 private:
109 using EdgeLinks = std::map<CellEdge, CellEdge>;
110
111 public:
112 using const_iterator = EdgeLinks::const_iterator;
113
114 bool add(const CellEdge &src, const CellEdge &dst);
115 void remove(Direction side);
116 void remove(Direction side, float position);
117 void remove(const Name &destinationName);
118 void rename(const Name &oldName, const std::string &newName);
119
120 bool hasEdge(const CellEdge &) const;
121 bool overlaps(const CellEdge &) const;
122
123 bool getLink(Direction side, float position, const CellEdge *&src, const CellEdge *&dst) const;
124
125 bool operator==(const Cell &) const;
126
127 const_iterator begin() const;
128 const_iterator end() const;
129
130 private:
131 EdgeLinks m_neighbors;
132
133 public:
134 ScreenOptions m_options;
135 };
136 using CellMap = std::map<std::string, Cell, deskflow::string::CaselessCmp>;
137 using NameMap = std::map<std::string, std::string, deskflow::string::CaselessCmp>;
138
139public:
140 using link_const_iterator = Cell::const_iterator;
141 using internal_const_iterator = CellMap::const_iterator;
142 using all_const_iterator = NameMap::const_iterator;
143 class const_iterator : public std::iterator_traits<Config>
144 {
145 public:
146 explicit const_iterator() = default;
147 explicit const_iterator(const internal_const_iterator &i) : m_i(i)
148 {
149 // do nothing
150 }
151 const_iterator(const const_iterator &src) = default;
152 ~const_iterator() = default;
153
155 {
156 m_i = i.m_i;
157 return *this;
158 }
159 std::string operator*() const
160 {
161 return m_i->first;
162 }
163 const std::string *operator->() const
164 {
165 return &(m_i->first);
166 }
168 {
169 ++m_i;
170 return *this;
171 }
173 {
174 return const_iterator(m_i++);
175 }
177 {
178 --m_i;
179 return *this;
180 }
182 {
183 return const_iterator(m_i--);
184 }
185 bool operator==(const const_iterator &i) const
186 {
187 return (m_i == i.m_i);
188 }
189
190 private:
192 };
193
194 explicit Config(IEventQueue *events);
195 virtual ~Config() = default;
196
198
199
201
205 bool addScreen(const std::string &name);
206
208
212 bool renameScreen(const std::string &oldName, const std::string &newName);
213
215
220 void removeScreen(const std::string &name);
221
223
226 void removeAllScreens();
227
229
235 bool addAlias(const std::string &canonical, const std::string &alias);
236
238
242 bool removeAlias(const std::string &alias);
243
245
249 bool removeAliases(const std::string &canonical);
250
252
255 void removeAllAliases();
256
258
273 bool connect(
274 const std::string &srcName, Direction srcSide, float srcStart, float srcEnd, const std::string &dstName,
275 float dstStart, float dstEnd
276 );
277
279
283 bool disconnect(const std::string &srcName, Direction srcSide);
284
286
291 bool disconnect(const std::string &srcName, Direction srcSide, float position);
292
294
299
301
306 bool addOption(const std::string &name, OptionID option, OptionValue value);
307
309
314 bool removeOption(const std::string &name, OptionID option);
315
317
321 bool removeOptions(const std::string &name);
322
324
328 virtual InputFilter *getInputFilter();
329
331
333
335
338 bool isValidScreenName(const std::string &name) const;
339
341 const_iterator begin() const;
343 const_iterator end() const;
344
349
351
354 virtual bool isScreen(const std::string &name) const;
355
357
360 bool isCanonicalName(const std::string &name) const;
361
363
367 std::string getCanonicalName(const std::string &name) const;
368
370
377 std::string getNeighbor(const std::string &, Direction, float position, float *positionOut) const;
378
380
384 bool hasNeighbor(const std::string &, Direction) const;
385
387
391 bool hasNeighbor(const std::string &, Direction, float start, float end) const;
392
394 link_const_iterator beginNeighbor(const std::string &) const;
396 link_const_iterator endNeighbor(const std::string &) const;
397
399 const NetworkAddress &getDeskflowAddress() const;
400
402
407 const ScreenOptions *getOptions(const std::string &name) const;
408
410
414 bool hasLockToScreenAction() const;
415
417 bool operator==(const Config &) const;
418
420
424 void read(ConfigReadContext &context);
425
427
430 friend std::istream &operator>>(std::istream &, Config &);
431
433
436 friend std::ostream &operator<<(std::ostream &, const Config &);
437
439
442 static const char *dirName(Direction);
443
445
448 static std::string formatInterval(const Interval &);
450
451private:
452 void readSection(ConfigReadContext &);
453 void readSectionOptions(ConfigReadContext &);
454 void readSectionScreens(ConfigReadContext &);
455 void readSectionLinks(ConfigReadContext &);
456 void readSectionAliases(ConfigReadContext &);
457
459 parseCondition(const ConfigReadContext &, const std::string &condition, const std::vector<std::string> &args);
460 void parseAction(
461 ConfigReadContext &, const std::string &action, const std::vector<std::string> &args, InputFilter::Rule &,
462 bool activate
463 );
464
465 void parseScreens(const ConfigReadContext &, const std::string_view &, std::set<std::string> &screens) const;
466 static const char *getOptionName(OptionID);
467 static std::string getOptionValue(OptionID, OptionValue);
468
469private:
470 CellMap m_map;
471 NameMap m_nameToCanonicalName;
472 NetworkAddress m_deskflowAddress;
473 ScreenOptions m_globalOptions;
474 InputFilter m_inputFilter;
475 bool m_hasLockToScreenAction = false;
476 IEventQueue *m_events;
477};
478
480
484{
485public:
486 using ArgList = std::vector<std::string>;
487
488 explicit ConfigReadContext(std::istream &, int32_t firstLine = 1);
490
491 bool readLine(std::string &);
492 uint32_t getLineNumber() const;
493
494 bool operator!() const;
495
496 OptionValue parseBoolean(const std::string &) const;
497 OptionValue parseInt(const std::string &) const;
498 OptionValue parseModifierKey(const std::string &) const;
499 OptionValue parseCorner(const std::string &) const;
500 OptionValue parseCorners(const std::string &) const;
501 OptionValue parseProtocol(const std::string &) const;
502 Config::Interval parseInterval(const ArgList &args) const;
504 const std::string &type, const std::string &line, const std::string &delim, std::string::size_type &index,
505 std::string &name, ArgList &args
506 ) const;
507 IPlatformScreen::KeyInfo *parseKeystroke(const std::string &keystroke) const;
508 IPlatformScreen::KeyInfo *parseKeystroke(const std::string &keystroke, const std::set<std::string> &screens) const;
509 IPlatformScreen::ButtonInfo parseMouse(const std::string &mouse) const;
510 KeyModifierMask parseModifier(const std::string &modifiers) const;
511 std::istream &getStream() const
512 {
513 return m_stream;
514 };
515
516private:
517 // not implemented
518 ConfigReadContext &operator=(const ConfigReadContext &);
519
520 static std::string concatArgs(const ArgList &args);
521
522private:
523 std::istream &m_stream;
524 int32_t m_line;
525};
526
528
532{
533public:
534 ServerConfigReadException(const ConfigReadContext &context, const std::string &);
535 ServerConfigReadException(const ConfigReadContext &context, const char *errorFmt, const std::string &arg);
536 ~ServerConfigReadException() throw() override = default;
537
538protected:
539 // BaseException overrides
540 std::string getWhat() const throw() override;
541
542private:
543 std::string m_error;
544};
545
546} // namespace deskflow::server
static const struct sockaddr FAR * name
Definition ArchNetworkWinsock.cpp:28
static int type
Definition ArchNetworkWinsock.cpp:45
Direction
Screen edge directions for mouse movement.
Definition DirectionTypes.h:22
uint32_t KeyModifierMask
Modifier key mask.
Definition KeyTypes.h:44
int32_t OptionValue
Option Value.
Definition OptionTypes.h:23
uint32_t OptionID
Option ID.
Definition OptionTypes.h:17
int x
Definition ServerConfig.cpp:24
BaseException()
Use getWhat() as the result of what().
Definition BaseException.cpp:18
Event queue interface.
Definition IEventQueue.h:29
Key event data.
Definition IKeyState.h:31
Button event data.
Definition IPrimaryScreen.h:25
Definition InputFilter.h:36
Definition InputFilter.h:315
Definition InputFilter.h:23
Network address type.
Definition NetworkAddress.h:17
Configuration read context.
Definition Config.h:484
uint32_t getLineNumber() const
Definition Config.cpp:1714
IPlatformScreen::ButtonInfo parseMouse(const std::string &mouse) const
Definition Config.cpp:2018
bool operator!() const
Definition Config.cpp:1719
OptionValue parseProtocol(const std::string &) const
Definition Config.cpp:1804
bool readLine(std::string &)
Definition Config.cpp:1676
void parseNameWithArgs(const std::string &type, const std::string &line, const std::string &delim, std::string::size_type &index, std::string &name, ArgList &args) const
Definition Config.cpp:1886
OptionValue parseModifierKey(const std::string &) const
Definition Config.cpp:1752
OptionValue parseCorner(const std::string &) const
Definition Config.cpp:1778
std::istream & getStream() const
Definition Config.h:511
OptionValue parseInt(const std::string &) const
Definition Config.cpp:1735
Config::Interval parseInterval(const ArgList &args) const
Definition Config.cpp:1858
std::vector< std::string > ArgList
Definition Config.h:486
ConfigReadContext(std::istream &, int32_t firstLine=1)
Definition Config.cpp:1671
IPlatformScreen::KeyInfo * parseKeystroke(const std::string &keystroke) const
Definition Config.cpp:1991
KeyModifierMask parseModifier(const std::string &modifiers) const
Definition Config.cpp:2039
OptionValue parseCorners(const std::string &) const
Definition Config.cpp:1814
OptionValue parseBoolean(const std::string &) const
Definition Config.cpp:1724
float inverseTransform(float x) const
Definition Config.cpp:1425
bool isInside(float x) const
Definition Config.cpp:1415
std::string getName() const
Definition Config.cpp:1394
float transform(float x) const
Definition Config.cpp:1420
bool operator<(const CellEdge &) const
Definition Config.cpp:1430
bool overlaps(const CellEdge &) const
Definition Config.cpp:1404
Direction getSide() const
Definition Config.cpp:1399
Interval getInterval() const
Definition Config.cpp:1384
void setName(const std::string_view &newName)
Definition Config.cpp:1389
CellEdge(Direction side, float position)
Definition Config.cpp:1352
bool operator==(const CellEdge &) const
Definition Config.cpp:1441
const_iterator operator++(int)
Definition Config.h:172
std::string operator*() const
Definition Config.h:159
const_iterator operator--(int)
Definition Config.h:181
const std::string * operator->() const
Definition Config.h:163
const_iterator & operator=(const const_iterator &i)
Definition Config.h:154
bool operator==(const const_iterator &i) const
Definition Config.h:185
const_iterator & operator--()
Definition Config.h:176
const_iterator & operator++()
Definition Config.h:167
const_iterator(const const_iterator &src)=default
const_iterator(const internal_const_iterator &i)
Definition Config.h:147
Server configuration.
Definition Config.h:52
friend std::ostream & operator<<(std::ostream &, const Config &)
Write configuration.
Definition Config.cpp:1590
static std::string formatInterval(const Interval &)
Get interval as string.
Definition Config.cpp:570
void removeAllAliases()
Remove all aliases.
Definition Config.cpp:191
bool hasNeighbor(const std::string &, Direction) const
Check for neighbor.
Definition Config.cpp:438
bool removeOptions(const std::string &name)
Remove a screen options.
Definition Config.cpp:300
bool addScreen(const std::string &name)
Add screen.
Definition Config.cpp:43
void read(ConfigReadContext &context)
Read configuration.
Definition Config.cpp:547
void setDeskflowAddress(const NetworkAddress &)
Set server address.
Definition Config.cpp:253
std::pair< float, float > Interval
Definition Config.h:55
virtual bool isScreen(const std::string &name) const
Test for screen name.
Definition Config.cpp:391
bool removeOption(const std::string &name, OptionID option)
Remove a screen option.
Definition Config.cpp:279
const NetworkAddress & getDeskflowAddress() const
Get the server address.
Definition Config.cpp:470
CellMap::const_iterator internal_const_iterator
Definition Config.h:141
bool addOption(const std::string &name, OptionID option, OptionValue value)
Add a screen option.
Definition Config.cpp:258
bool addAlias(const std::string &canonical, const std::string &alias)
Add alias.
Definition Config.cpp:135
const_iterator begin() const
Get beginning (canonical) screen name iterator.
Definition Config.cpp:371
bool removeAliases(const std::string &canonical)
Remove aliases.
Definition Config.cpp:172
bool removeAlias(const std::string &alias)
Remove alias.
Definition Config.cpp:153
bool disconnect(const std::string &srcName, Direction srcSide)
Disconnect screens.
Definition Config.cpp:221
const_iterator end() const
Get ending (canonical) screen name iterator.
Definition Config.cpp:376
bool connect(const std::string &srcName, Direction srcSide, float srcStart, float srcEnd, const std::string &dstName, float dstStart, float dstEnd)
Connect screens.
Definition Config.cpp:202
const ScreenOptions * getOptions(const std::string &name) const
Get the screen options.
Definition Config.cpp:475
all_const_iterator endAll() const
Get ending screen name iterator.
Definition Config.cpp:386
virtual InputFilter * getInputFilter()
Get the hot key input filter.
Definition Config.cpp:565
bool renameScreen(const std::string &oldName, const std::string &newName)
Rename screen.
Definition Config.cpp:59
std::string getNeighbor(const std::string &, Direction, float position, float *positionOut) const
Get neighbor.
Definition Config.cpp:411
void removeScreen(const std::string &name)
Remove screen.
Definition Config.cpp:101
all_const_iterator beginAll() const
Get beginning screen name iterator.
Definition Config.cpp:381
virtual ~Config()=default
Cell::const_iterator link_const_iterator
Definition Config.h:140
Config(IEventQueue *events)
Definition Config.cpp:38
static const char * dirName(Direction)
Get direction name.
Definition Config.cpp:556
bool operator==(const Config &) const
Compare configurations.
Definition Config.cpp:497
link_const_iterator beginNeighbor(const std::string &) const
Get beginning neighbor iterator.
Definition Config.cpp:456
link_const_iterator endNeighbor(const std::string &) const
Get ending neighbor iterator.
Definition Config.cpp:463
NameMap::const_iterator all_const_iterator
Definition Config.h:142
void removeAllScreens()
Remove all screens.
Definition Config.cpp:129
std::map< OptionID, OptionValue > ScreenOptions
Definition Config.h:54
bool hasLockToScreenAction() const
Check for lock to screen action.
Definition Config.cpp:492
std::string getCanonicalName(const std::string &name) const
Get canonical name.
Definition Config.cpp:401
bool isValidScreenName(const std::string &name) const
Test screen name validity.
Definition Config.cpp:321
friend std::istream & operator>>(std::istream &, Config &)
Read configuration.
Definition Config.cpp:1583
bool isCanonicalName(const std::string &name) const
Test for canonical screen name.
Definition Config.cpp:396
ServerConfigReadException(const ConfigReadContext &context, const std::string &)
Definition Config.cpp:2072
std::string getWhat() const override
Get a human readable string describing the exception.
Definition Config.cpp:2089
Definition Config.cpp:27
Definition EventTypes.h:11
Definition Config.h:28
ptrdiff_t difference_type
Definition Config.h:32
std::string * pointer
Definition Config.h:34
std::string & reference
Definition Config.h:35
std::string value_type
Definition Config.h:31
bidirectional_iterator_tag iterator_category
Definition Config.h:33