Deskflow 1.22.0.197
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/String.h"
11#include "base/XBase.h"
15#include "net/NetworkAddress.h"
16#include "server/InputFilter.h"
17
18#include <iosfwd>
19#include <map>
20#include <set>
21
22namespace deskflow::server {
23class Config;
25} // namespace deskflow::server
26
27class IEventQueue;
28
29namespace std {
30template <> struct iterator_traits<deskflow::server::Config>
31{
32 using value_type = std::string;
33 using difference_type = ptrdiff_t;
34 using iterator_category = bidirectional_iterator_tag;
35 using pointer = std::string *;
36 using reference = std::string &;
37};
38}; // namespace std
39
40namespace deskflow::server {
41
43
52class Config
53{
54public:
55 using ScreenOptions = std::map<OptionID, OptionValue>;
56 using Interval = std::pair<float, float>;
57
59 {
60 public:
61 CellEdge(Direction side, float position);
62 CellEdge(Direction side, const Interval &);
63 CellEdge(const std::string &name, Direction side, const Interval &);
64 ~CellEdge() = default;
65
66 Interval getInterval() const;
67 void setName(const std::string_view &newName);
68 std::string getName() const;
69 Direction getSide() const;
70 bool overlaps(const CellEdge &) const;
71 bool isInside(float x) const;
72
73 // transform position to [0,1]
74 float transform(float x) const;
75
76 // transform [0,1] to position
77 float inverseTransform(float x) const;
78
79 // compares side and start of interval
80 bool operator<(const CellEdge &) const;
81
82 // compares side and interval
83 bool operator==(const CellEdge &) const;
84 bool operator!=(const CellEdge &) const;
85
86 private:
87 void init(const std::string_view &name, Direction side, const Interval &);
88
89 private:
90 std::string m_name;
91 Direction m_side;
92 Interval m_interval;
93 };
94
95private:
96 class Name
97 {
98 public:
99 Name(Config *, const std::string &name);
100
101 bool operator==(const std::string &name) const;
102
103 private:
104 Config *m_config;
105 std::string m_name;
106 };
107
108 class Cell
109 {
110 private:
111 using EdgeLinks = std::map<CellEdge, CellEdge>;
112
113 public:
114 using const_iterator = EdgeLinks::const_iterator;
115
116 bool add(const CellEdge &src, const CellEdge &dst);
117 void remove(Direction side);
118 void remove(Direction side, float position);
119 void remove(const Name &destinationName);
120 void rename(const Name &oldName, const std::string &newName);
121
122 bool hasEdge(const CellEdge &) const;
123 bool overlaps(const CellEdge &) const;
124
125 bool getLink(Direction side, float position, const CellEdge *&src, const CellEdge *&dst) const;
126
127 bool operator==(const Cell &) const;
128 bool operator!=(const Cell &) const;
129
130 const_iterator begin() const;
131 const_iterator end() const;
132
133 private:
134 EdgeLinks m_neighbors;
135
136 public:
137 ScreenOptions m_options;
138 };
139 using CellMap = std::map<std::string, Cell, deskflow::string::CaselessCmp>;
140 using NameMap = std::map<std::string, std::string, deskflow::string::CaselessCmp>;
141
142public:
143 using link_const_iterator = Cell::const_iterator;
144 using internal_const_iterator = CellMap::const_iterator;
145 using all_const_iterator = NameMap::const_iterator;
146 class const_iterator : std::iterator_traits<Config>
147 {
148 public:
149 explicit const_iterator() = default;
150 explicit const_iterator(const internal_const_iterator &i) : m_i(i)
151 {
152 // do nothing
153 }
154 const_iterator(const const_iterator &src) = default;
155 ~const_iterator() = default;
156
158 {
159 m_i = i.m_i;
160 return *this;
161 }
162 std::string operator*() const
163 {
164 return m_i->first;
165 }
166 const std::string *operator->() const
167 {
168 return &(m_i->first);
169 }
171 {
172 ++m_i;
173 return *this;
174 }
176 {
177 return const_iterator(m_i++);
178 }
180 {
181 --m_i;
182 return *this;
183 }
185 {
186 return const_iterator(m_i--);
187 }
188 bool operator==(const const_iterator &i) const
189 {
190 return (m_i == i.m_i);
191 }
192 bool operator!=(const const_iterator &i) const
193 {
194 return (m_i != i.m_i);
195 }
196
197 private:
199 };
200
201 explicit Config(IEventQueue *events);
202 virtual ~Config() = default;
203
205
206
208
212 bool addScreen(const std::string &name);
213
215
219 bool renameScreen(const std::string &oldName, const std::string &newName);
220
222
227 void removeScreen(const std::string &name);
228
230
233 void removeAllScreens();
234
236
242 bool addAlias(const std::string &canonical, const std::string &alias);
243
245
249 bool removeAlias(const std::string &alias);
250
252
256 bool removeAliases(const std::string &canonical);
257
259
262 void removeAllAliases();
263
265
280 bool connect(
281 const std::string &srcName, Direction srcSide, float srcStart, float srcEnd, const std::string &dstName,
282 float dstStart, float dstEnd
283 );
284
286
290 bool disconnect(const std::string &srcName, Direction srcSide);
291
293
298 bool disconnect(const std::string &srcName, Direction srcSide, float position);
299
301
306
308
313 bool addOption(const std::string &name, OptionID option, OptionValue value);
314
316
321 bool removeOption(const std::string &name, OptionID option);
322
324
328 bool removeOptions(const std::string &name);
329
331
335 virtual InputFilter *getInputFilter();
336
338
340
342
345 bool isValidScreenName(const std::string &name) const;
346
348 const_iterator begin() const;
350 const_iterator end() const;
351
356
358
361 virtual bool isScreen(const std::string &name) const;
362
364
367 bool isCanonicalName(const std::string &name) const;
368
370
374 std::string getCanonicalName(const std::string &name) const;
375
377
384 std::string getNeighbor(const std::string &, Direction, float position, float *positionOut) const;
385
387
391 bool hasNeighbor(const std::string &, Direction) const;
392
394
398 bool hasNeighbor(const std::string &, Direction, float start, float end) const;
399
401 link_const_iterator beginNeighbor(const std::string &) const;
403 link_const_iterator endNeighbor(const std::string &) const;
404
406 const NetworkAddress &getDeskflowAddress() const;
407
409
414 const ScreenOptions *getOptions(const std::string &name) const;
415
417
421 bool hasLockToScreenAction() const;
422
424 bool operator==(const Config &) const;
426 bool operator!=(const Config &) const;
427
429
433 void read(ConfigReadContext &context);
434
436
439 friend std::istream &operator>>(std::istream &, Config &);
440
442
445 friend std::ostream &operator<<(std::ostream &, const Config &);
446
448
451 static const char *dirName(Direction);
452
454
457 static std::string formatInterval(const Interval &);
459
460private:
461 void readSection(ConfigReadContext &);
462 void readSectionOptions(ConfigReadContext &);
463 void readSectionScreens(ConfigReadContext &);
464 void readSectionLinks(ConfigReadContext &);
465 void readSectionAliases(ConfigReadContext &);
466
468 parseCondition(const ConfigReadContext &, const std::string &condition, const std::vector<std::string> &args);
469 void parseAction(
470 ConfigReadContext &, const std::string &action, const std::vector<std::string> &args, InputFilter::Rule &,
471 bool activate
472 );
473
474 void parseScreens(const ConfigReadContext &, const std::string_view &, std::set<std::string> &screens) const;
475 static const char *getOptionName(OptionID);
476 static std::string getOptionValue(OptionID, OptionValue);
477
478private:
479 CellMap m_map;
480 NameMap m_nameToCanonicalName;
481 NetworkAddress m_deskflowAddress;
482 ScreenOptions m_globalOptions;
483 InputFilter m_inputFilter;
484 bool m_hasLockToScreenAction = false;
485 IEventQueue *m_events;
486};
487
489
493{
494public:
495 using ArgList = std::vector<std::string>;
496
497 ConfigReadContext(std::istream &, int32_t firstLine = 1);
499
500 bool readLine(std::string &);
501 uint32_t getLineNumber() const;
502
503 bool operator!() const;
504
505 OptionValue parseBoolean(const std::string &) const;
506 OptionValue parseInt(const std::string &) const;
507 OptionValue parseModifierKey(const std::string &) const;
508 OptionValue parseCorner(const std::string &) const;
509 OptionValue parseCorners(const std::string &) const;
510 OptionValue parseProtocol(const std::string &) const;
511 Config::Interval parseInterval(const ArgList &args) const;
513 const std::string &type, const std::string &line, const std::string &delim, std::string::size_type &index,
514 std::string &name, ArgList &args
515 ) const;
516 IPlatformScreen::KeyInfo *parseKeystroke(const std::string &keystroke) const;
517 IPlatformScreen::KeyInfo *parseKeystroke(const std::string &keystroke, const std::set<std::string> &screens) const;
518 IPlatformScreen::ButtonInfo *parseMouse(const std::string &mouse) const;
519 KeyModifierMask parseModifier(const std::string &modifiers) const;
520 std::istream &getStream() const
521 {
522 return m_stream;
523 };
524
525private:
526 // not implemented
527 ConfigReadContext &operator=(const ConfigReadContext &);
528
529 static std::string concatArgs(const ArgList &args);
530
531private:
532 std::istream &m_stream;
533 int32_t m_line;
534};
535
537
540class XConfigRead : public XBase
541{
542public:
543 XConfigRead(const ConfigReadContext &context, const std::string &);
544 XConfigRead(const ConfigReadContext &context, const char *errorFmt, const std::string &arg);
545 ~XConfigRead() throw() override = default;
546
547protected:
548 // XBase overrides
549 std::string getWhat() const throw() override;
550
551private:
552 std::string m_error;
553};
554
555} // namespace deskflow::server
static const struct sockaddr FAR * name
Definition ArchNetworkWinsock.cpp:27
static int type
Definition ArchNetworkWinsock.cpp:44
Direction
Screen edge directions for mouse movement.
Definition DirectionTypes.h:21
uint32_t KeyModifierMask
Modifier key mask.
Definition KeyTypes.h:45
int32_t OptionValue
Option Value.
Definition OptionTypes.h:24
uint32_t OptionID
Option ID.
Definition OptionTypes.h:18
Deskflow Network Protocol Specification and Implementation.
int x
Definition ServerConfig.cpp:26
Event queue interface.
Definition IEventQueue.h:32
Key event data.
Definition IKeyState.h:31
Button event data.
Definition IPrimaryScreen.h:26
Definition InputFilter.h:37
Definition InputFilter.h:302
Definition InputFilter.h:24
Network address type.
Definition NetworkAddress.h:18
XBase()
Use getWhat() as the result of what()
Definition XBase.cpp:17
Configuration read context.
Definition Config.h:493
uint32_t getLineNumber() const
Definition Config.cpp:1719
bool operator!() const
Definition Config.cpp:1724
OptionValue parseProtocol(const std::string &) const
Definition Config.cpp:1809
bool readLine(std::string &)
Definition Config.cpp:1681
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:1891
OptionValue parseModifierKey(const std::string &) const
Definition Config.cpp:1757
OptionValue parseCorner(const std::string &) const
Definition Config.cpp:1783
std::istream & getStream() const
Definition Config.h:520
OptionValue parseInt(const std::string &) const
Definition Config.cpp:1740
Config::Interval parseInterval(const ArgList &args) const
Definition Config.cpp:1863
IPlatformScreen::ButtonInfo * parseMouse(const std::string &mouse) const
Definition Config.cpp:2023
std::vector< std::string > ArgList
Definition Config.h:495
ConfigReadContext(std::istream &, int32_t firstLine=1)
Definition Config.cpp:1676
IPlatformScreen::KeyInfo * parseKeystroke(const std::string &keystroke) const
Definition Config.cpp:1996
KeyModifierMask parseModifier(const std::string &modifiers) const
Definition Config.cpp:2044
OptionValue parseCorners(const std::string &) const
Definition Config.cpp:1819
OptionValue parseBoolean(const std::string &) const
Definition Config.cpp:1729
float inverseTransform(float x) const
Definition Config.cpp:1420
bool isInside(float x) const
Definition Config.cpp:1410
std::string getName() const
Definition Config.cpp:1389
float transform(float x) const
Definition Config.cpp:1415
bool operator<(const CellEdge &) const
Definition Config.cpp:1425
bool operator!=(const CellEdge &) const
Definition Config.cpp:1441
bool overlaps(const CellEdge &) const
Definition Config.cpp:1399
Direction getSide() const
Definition Config.cpp:1394
Interval getInterval() const
Definition Config.cpp:1379
void setName(const std::string_view &newName)
Definition Config.cpp:1384
CellEdge(Direction side, float position)
Definition Config.cpp:1347
bool operator==(const CellEdge &) const
Definition Config.cpp:1436
const_iterator operator++(int)
Definition Config.h:175
std::string operator*() const
Definition Config.h:162
const_iterator operator--(int)
Definition Config.h:184
const std::string * operator->() const
Definition Config.h:166
const_iterator & operator=(const const_iterator &i)
Definition Config.h:157
bool operator==(const const_iterator &i) const
Definition Config.h:188
const_iterator & operator--()
Definition Config.h:179
const_iterator & operator++()
Definition Config.h:170
bool operator!=(const const_iterator &i) const
Definition Config.h:192
const_iterator(const const_iterator &src)=default
const_iterator(const internal_const_iterator &i)
Definition Config.h:150
Server configuration.
Definition Config.h:53
friend std::ostream & operator<<(std::ostream &, const Config &)
Write configuration.
Definition Config.cpp:1595
static std::string formatInterval(const Interval &)
Get interval as string.
Definition Config.cpp:572
void removeAllAliases()
Remove all aliases.
Definition Config.cpp:188
bool hasNeighbor(const std::string &, Direction) const
Check for neighbor.
Definition Config.cpp:435
bool removeOptions(const std::string &name)
Remove a screen options.
Definition Config.cpp:297
bool addScreen(const std::string &name)
Add screen.
Definition Config.cpp:40
void read(ConfigReadContext &context)
Read configuration.
Definition Config.cpp:549
void setDeskflowAddress(const NetworkAddress &)
Set server address.
Definition Config.cpp:250
std::pair< float, float > Interval
Definition Config.h:56
virtual bool isScreen(const std::string &name) const
Test for screen name.
Definition Config.cpp:388
bool removeOption(const std::string &name, OptionID option)
Remove a screen option.
Definition Config.cpp:276
const NetworkAddress & getDeskflowAddress() const
Get the server address.
Definition Config.cpp:467
CellMap::const_iterator internal_const_iterator
Definition Config.h:144
bool addOption(const std::string &name, OptionID option, OptionValue value)
Add a screen option.
Definition Config.cpp:255
bool operator!=(const Config &) const
Compare configurations.
Definition Config.cpp:544
bool addAlias(const std::string &canonical, const std::string &alias)
Add alias.
Definition Config.cpp:132
const_iterator begin() const
Get beginning (canonical) screen name iterator.
Definition Config.cpp:368
bool removeAliases(const std::string &canonical)
Remove aliases.
Definition Config.cpp:169
bool removeAlias(const std::string &alias)
Remove alias.
Definition Config.cpp:150
bool disconnect(const std::string &srcName, Direction srcSide)
Disconnect screens.
Definition Config.cpp:218
const_iterator end() const
Get ending (canonical) screen name iterator.
Definition Config.cpp:373
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:199
const ScreenOptions * getOptions(const std::string &name) const
Get the screen options.
Definition Config.cpp:472
all_const_iterator endAll() const
Get ending screen name iterator.
Definition Config.cpp:383
virtual InputFilter * getInputFilter()
Get the hot key input filter.
Definition Config.cpp:567
bool renameScreen(const std::string &oldName, const std::string &newName)
Rename screen.
Definition Config.cpp:56
std::string getNeighbor(const std::string &, Direction, float position, float *positionOut) const
Get neighbor.
Definition Config.cpp:408
void removeScreen(const std::string &name)
Remove screen.
Definition Config.cpp:98
all_const_iterator beginAll() const
Get beginning screen name iterator.
Definition Config.cpp:378
virtual ~Config()=default
Cell::const_iterator link_const_iterator
Definition Config.h:143
Config(IEventQueue *events)
Definition Config.cpp:35
static const char * dirName(Direction)
Get direction name.
Definition Config.cpp:558
bool operator==(const Config &) const
Compare configurations.
Definition Config.cpp:494
link_const_iterator beginNeighbor(const std::string &) const
Get beginning neighbor iterator.
Definition Config.cpp:453
link_const_iterator endNeighbor(const std::string &) const
Get ending neighbor iterator.
Definition Config.cpp:460
NameMap::const_iterator all_const_iterator
Definition Config.h:145
void removeAllScreens()
Remove all screens.
Definition Config.cpp:126
std::map< OptionID, OptionValue > ScreenOptions
Definition Config.h:55
bool hasLockToScreenAction() const
Check for lock to screen action.
Definition Config.cpp:489
std::string getCanonicalName(const std::string &name) const
Get canonical name.
Definition Config.cpp:398
bool isValidScreenName(const std::string &name) const
Test screen name validity.
Definition Config.cpp:318
friend std::istream & operator>>(std::istream &, Config &)
Read configuration.
Definition Config.cpp:1588
bool isCanonicalName(const std::string &name) const
Test for canonical screen name.
Definition Config.cpp:393
std::string getWhat() const override
Get a human readable string describing the exception.
Definition Config.cpp:2092
~XConfigRead() override=default
XConfigRead(const ConfigReadContext &context, const std::string &)
Definition Config.cpp:2077
Definition Config.cpp:24
Definition EventTypes.h:11
Definition Config.h:29
ptrdiff_t difference_type
Definition Config.h:33
std::string * pointer
Definition Config.h:35
std::string & reference
Definition Config.h:36
std::string value_type
Definition Config.h:32
bidirectional_iterator_tag iterator_category
Definition Config.h:34