ZNC trunk
Loading...
Searching...
No Matches
main.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2004-2024 ZNC, see the NOTICE file for details.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ZNC_MAIN_H
18#define ZNC_MAIN_H
19
20#include <znc/zncconfig.h>
21#include <znc/version.h>
22
24#define NOTHING &ZNC_NO_NEED_TO_DO_ANYTHING_ON_MODULE_CALL_EXITER
25
26#define ALLMODULECALL(macFUNC, macEXITER) \
27 do { \
28 CModules& GMods = CZNC::Get().GetModules(); \
29 bool bAllExit = false; \
30 if (GMods.macFUNC) { \
31 bAllExit = true; \
32 } else { \
33 const map<CString, CUser*>& mUsers = CZNC::Get().GetUserMap(); \
34 map<CString, CUser*>::const_iterator it; \
35 for (it = mUsers.begin(); it != mUsers.end(); ++it) { \
36 CModules& UMods = it->second->GetModules(); \
37 if (UMods.macFUNC) { \
38 bAllExit = true; \
39 break; \
40 } \
41 const vector<CIRCNetwork*>& mNets = it->second->GetNetworks(); \
42 vector<CIRCNetwork*>::const_iterator it2; \
43 for (it2 = mNets.begin(); it2 != mNets.end(); ++it2) { \
44 CModules& NMods = (*it2)->GetModules(); \
45 if (NMods.macFUNC) { \
46 bAllExit = true; \
47 break; \
48 } \
49 } \
50 if (bAllExit) break; \
51 } \
52 } \
53 if (bAllExit) *macEXITER = true; \
54 } while (false)
55
56#define _GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \
57 do { \
58 CModules& GMods = CZNC::Get().GetModules(); \
59 CUser* pOldGUser = GMods.GetUser(); \
60 CIRCNetwork* pOldGNetwork = GMods.GetNetwork(); \
61 CClient* pOldGClient = GMods.GetClient(); \
62 GMods.SetUser(macUSER); \
63 GMods.SetNetwork(macNETWORK); \
64 GMods.SetClient(macCLIENT); \
65 if (GMods.macFUNC) { \
66 GMods.SetUser(pOldGUser); \
67 GMods.SetNetwork(pOldGNetwork); \
68 GMods.SetClient(pOldGClient); \
69 *macEXITER = true; \
70 } \
71 GMods.SetUser(pOldGUser); \
72 GMods.SetNetwork(pOldGNetwork); \
73 GMods.SetClient(pOldGClient); \
74 } while (false)
75
76#define _USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \
77 do { \
78 bool bGlobalExited = false; \
79 _GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, \
80 &bGlobalExited); \
81 if (bGlobalExited) { \
82 *macEXITER = true; \
83 break; \
84 } \
85 if (macUSER != nullptr) { \
86 CModules& UMods = macUSER->GetModules(); \
87 CIRCNetwork* pOldUNetwork = UMods.GetNetwork(); \
88 CClient* pOldUClient = UMods.GetClient(); \
89 UMods.SetNetwork(macNETWORK); \
90 UMods.SetClient(macCLIENT); \
91 if (UMods.macFUNC) { \
92 UMods.SetNetwork(pOldUNetwork); \
93 UMods.SetClient(pOldUClient); \
94 *macEXITER = true; \
95 } \
96 UMods.SetNetwork(pOldUNetwork); \
97 UMods.SetClient(pOldUClient); \
98 } \
99 } while (false)
100
101#define NETWORKMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \
102 do { \
103 bool bUserExited = false; \
104 _USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, \
105 &bUserExited); \
106 if (bUserExited) { \
107 *macEXITER = true; \
108 break; \
109 } \
110 if (macNETWORK != nullptr) { \
111 CModules& NMods = macNETWORK->GetModules(); \
112 CClient* pOldNClient = NMods.GetClient(); \
113 NMods.SetClient(macCLIENT); \
114 if (NMods.macFUNC) { \
115 NMods.SetClient(pOldNClient); \
116 *macEXITER = true; \
117 } \
118 NMods.SetClient(pOldNClient); \
119 } \
120 } while (false)
121
122#define GLOBALMODULECALL(macFUNC, macEXITER) \
123 _GLOBALMODULECALL(macFUNC, nullptr, nullptr, nullptr, macEXITER)
124
125#define USERMODULECALL(macFUNC, macUSER, macCLIENT, macEXITER) \
126 _USERMODULECALL(macFUNC, macUSER, nullptr, macCLIENT, macEXITER)
127
145#endif // !ZNC_MAIN_H
bool ZNC_NO_NEED_TO_DO_ANYTHING_ON_MODULE_CALL_EXITER