1 | // ============================================================= // |
---|
2 | // // |
---|
3 | // File : ad_remote.h // |
---|
4 | // Purpose : // |
---|
5 | // // |
---|
6 | // Coded by Ralf Westram (coder@reallysoft.de) in April 2013 // |
---|
7 | // Institute of Microbiology (Technical University Munich) // |
---|
8 | // http://www.arb-home.de/ // |
---|
9 | // // |
---|
10 | // ============================================================= // |
---|
11 | |
---|
12 | #ifndef AD_REMOTE_H |
---|
13 | #define AD_REMOTE_H |
---|
14 | |
---|
15 | #ifndef ARB_ASSERT_H |
---|
16 | #include "arb_assert.h" |
---|
17 | #endif |
---|
18 | #ifndef ARBDBT_H |
---|
19 | #include "arbdbt.h" |
---|
20 | #endif |
---|
21 | #ifndef ARB_SLEEP_H |
---|
22 | #include <arb_sleep.h> |
---|
23 | #endif |
---|
24 | |
---|
25 | struct MacroTalkSleep : public ARB_inc_sleep { |
---|
26 | MacroTalkSleep() : ARB_inc_sleep(30, 250, MS, 20) {} |
---|
27 | }; |
---|
28 | |
---|
29 | #define REMOTE_BASE_LEN 11 // len of REMOTE_BASE |
---|
30 | #define MAX_REMOTE_APP_LEN 30 // max len of application (e.g. "ARB_EDIT4") |
---|
31 | #define MAX_REMOTE_ITEM_LEN 7 // max len of item in APP container ("action", "result", ...) |
---|
32 | |
---|
33 | #define MAX_REMOTE_PATH_LEN (REMOTE_BASE_LEN + MAX_REMOTE_APP_LEN + 1 + MAX_REMOTE_ITEM_LEN) |
---|
34 | |
---|
35 | // -------------------------------------------------------------------------------- |
---|
36 | |
---|
37 | class remote_awars { |
---|
38 | mutable char name[MAX_REMOTE_PATH_LEN+1]; |
---|
39 | int length; // of awar-path inclusive last '/' |
---|
40 | char *app_id; |
---|
41 | |
---|
42 | const char *item(const char *itemname) const { |
---|
43 | arb_assert(strlen(itemname) <= MAX_REMOTE_ITEM_LEN); |
---|
44 | strcpy(name+length, itemname); |
---|
45 | return name; |
---|
46 | } |
---|
47 | |
---|
48 | void init() { |
---|
49 | #if defined(ASSERTION_USED) |
---|
50 | size_t alen = strlen(app_id); |
---|
51 | arb_assert(alen>0 && alen <= MAX_REMOTE_APP_LEN); |
---|
52 | #endif |
---|
53 | length = sprintf(name, REMOTE_BASE "%s/", app_id); |
---|
54 | arb_assert((length+MAX_REMOTE_ITEM_LEN) <= MAX_REMOTE_PATH_LEN); |
---|
55 | } |
---|
56 | |
---|
57 | public: |
---|
58 | remote_awars(const char *application) : app_id(ARB_strdup(application)) { init(); } |
---|
59 | remote_awars(const remote_awars& other) : app_id(ARB_strdup(other.app_id)) { init(); } |
---|
60 | DECLARE_ASSIGNMENT_OPERATOR(remote_awars); |
---|
61 | ~remote_awars() { |
---|
62 | free(app_id); |
---|
63 | } |
---|
64 | |
---|
65 | // definition of term as used here: |
---|
66 | // server = process running DB server ( = macro recorder/executor) |
---|
67 | // client = process performing remote actions (e.g. "ARB_EDIT4"; is identical with server when executing a remote cmd for "ARB_NTREE") |
---|
68 | // macro = the executed perl macro |
---|
69 | |
---|
70 | // The following DB entries trigger GUI interaction in ../SL/MACROS/dbserver.cxx@check_for_remote_command |
---|
71 | // check_for_remote_command creates 'action', 'awar' and 'value' as soon as a client is ready to remote-execute. |
---|
72 | const char *action() const { return item("action"); } // contains name of GUI-action to be performed |
---|
73 | const char *result() const { return item("result"); } // |
---|
74 | const char *awar() const { return item("awar"); } |
---|
75 | const char *value() const { return item("value"); } |
---|
76 | |
---|
77 | // synchronization (needed to avoid that multiple clients with same application_id randomly accept remote-commands) |
---|
78 | const char *authReq() const { return item("authReq"); } // == 1 -> a macro wants to remote-execute in some client [set to 1 by macro, reset to 0 by server when last macro terminates] |
---|
79 | const char *authAck() const { return item("authAck"); } // == pid -> client received and accepted 'authReq' [set to its pid by client, reset to 0 by macro when granting authorization or by server when last macro terminates] |
---|
80 | const char *granted() const { return item("granted"); } // == pid -> client with pid is authorized to remote-execute commands [set to the clients pid by macro, reset by server when last macro terminates] |
---|
81 | |
---|
82 | const char *recAuth() const { return item("recAuth"); } // == pid -> client/server with pid is authorized to record commands [set/cleared by client/server; results in error if multiple pids try to authorize] |
---|
83 | |
---|
84 | const char *appID() const { return app_id; } |
---|
85 | }; |
---|
86 | |
---|
87 | #else |
---|
88 | #error ad_remote.h included twice |
---|
89 | #endif // AD_REMOTE_H |
---|