Commit | Line | Data |
---|---|---|
970ed795 | 1 | /////////////////////////////////////////////////////////////////////////////// |
3abe9331 | 2 | // Copyright (c) 2000-2015 Ericsson Telecom AB |
970ed795 EL |
3 | // All rights reserved. This program and the accompanying materials |
4 | // are made available under the terms of the Eclipse Public License v1.0 | |
5 | // which accompanies this distribution, and is available at | |
6 | // http://www.eclipse.org/legal/epl-v10.html | |
7 | /////////////////////////////////////////////////////////////////////////////// | |
8 | #ifndef MODULE_LIST_HH | |
9 | #define MODULE_LIST_HH | |
10 | ||
11 | #include <stdio.h> | |
12 | #include "Types.h" | |
13 | ||
14 | class Text_Buf; | |
15 | class TTCN_Module; | |
16 | class Module_Param; | |
3abe9331 | 17 | class Module_Param_Name; |
970ed795 EL |
18 | class ModuleVersion; |
19 | struct namespace_t; | |
20 | ||
21 | typedef void (*genericfunc_t)(void); | |
22 | ||
23 | class Module_List { | |
24 | static TTCN_Module *list_head, *list_tail; | |
25 | ||
26 | public: | |
27 | static void add_module(TTCN_Module *module_ptr); | |
28 | static void remove_module(TTCN_Module *module_ptr); | |
29 | static TTCN_Module *lookup_module(const char *module_name); | |
30 | static TTCN_Module *single_control_part(); | |
31 | ||
32 | static void pre_init_modules(); | |
33 | static void post_init_modules(); | |
34 | ||
35 | static void start_function(const char *module_name, | |
36 | const char *function_name, Text_Buf& function_arguments); | |
37 | ||
38 | static void initialize_component(const char *module_name, | |
39 | const char *component_type, boolean init_base_comps); | |
40 | ||
41 | static void set_param(Module_Param& param); | |
3abe9331 | 42 | static Module_Param* get_param(Module_Param_Name& param_name); |
970ed795 EL |
43 | static void log_param(); |
44 | ||
45 | static void execute_control(const char *module_name); | |
46 | static void execute_testcase(const char *module_name, | |
47 | const char *testcase_name); | |
48 | static void execute_all_testcases(const char *module_name); | |
49 | ||
50 | static void print_version(); | |
51 | static void send_versions(); | |
52 | static void list_testcases(); | |
53 | static void push_version(Text_Buf& text_buf); | |
54 | ||
55 | static void encode_function(Text_Buf& text_buf, | |
56 | genericfunc_t function_address); | |
57 | static void decode_function(Text_Buf& text_buf, | |
58 | genericfunc_t *function_addr_ptr); | |
59 | static void log_function(genericfunc_t function_address); | |
60 | static void encode_altstep(Text_Buf& text_buf, | |
61 | genericfunc_t altstep_address); | |
62 | static void decode_altstep(Text_Buf& text_buf, | |
63 | genericfunc_t *altstep_addr_ptr); | |
64 | static void log_altstep(genericfunc_t altstep_address); | |
65 | static void encode_testcase(Text_Buf& text_buf, | |
66 | genericfunc_t testcase_address); | |
67 | static void decode_testcase(Text_Buf& text_buf, | |
68 | genericfunc_t *testcase_addr_ptr); | |
69 | static void log_testcase(genericfunc_t testcase_address); | |
70 | ||
71 | static genericfunc_t get_fat_null(); | |
72 | ||
73 | static genericfunc_t lookup_start_by_function_address( | |
74 | genericfunc_t function_address); | |
75 | static genericfunc_t lookup_standalone_address_by_altstep_address( | |
76 | genericfunc_t altstep_address); | |
77 | static genericfunc_t lookup_activate_address_by_altstep_address( | |
78 | genericfunc_t altstep_address); | |
79 | ||
80 | private: | |
81 | static boolean lookup_function_by_address(genericfunc_t function_address, | |
82 | const char*& module_name, const char*& function_name); | |
83 | static boolean lookup_altstep_by_address(genericfunc_t altstep_address, | |
84 | const char*& module_name, const char*& altstep_name); | |
85 | static boolean lookup_testcase_by_address(genericfunc_t testcase_address, | |
86 | const char*& module_name, const char*& testcase_name); | |
87 | }; | |
88 | ||
89 | class TTCN_Module { | |
90 | friend class Module_List; | |
91 | public: | |
92 | enum module_type_enum { TTCN3_MODULE, ASN1_MODULE, CPLUSPLUS_MODULE }; | |
93 | typedef void (*init_func_t)(); | |
94 | typedef boolean (*set_param_func_t)(Module_Param& param); | |
3abe9331 | 95 | typedef Module_Param* (*get_param_func_t)(Module_Param_Name& param_name); |
970ed795 EL |
96 | typedef void (*log_param_func_t)(); |
97 | typedef boolean (*initialize_component_func_t)(const char *component_type, | |
98 | boolean init_base_comps); | |
99 | typedef boolean (*start_func_t)(const char *function_name, | |
100 | Text_Buf& function_arguments); | |
101 | typedef void (*control_func_t)(); | |
102 | typedef verdicttype (*testcase_t)(boolean has_timer, double timer_value); | |
103 | ||
104 | private: | |
105 | TTCN_Module *list_prev, *list_next; | |
106 | module_type_enum module_type; | |
107 | const char *module_name; | |
108 | const char *compilation_date; | |
109 | const char *compilation_time; | |
110 | const unsigned char *md5_checksum; | |
111 | const char* product_number; | |
112 | unsigned int suffix; | |
113 | unsigned int release; | |
114 | unsigned int patch; | |
115 | unsigned int build; | |
116 | const char* extra; | |
117 | size_t num_namespaces; | |
118 | const namespace_t *xer_namespaces; | |
119 | // FIXME instead of each module having its own list of namespaces with gaps, | |
120 | // it may be better to have one global list in e.g. Module_list. | |
121 | // Trouble is, Module_list is not really a class: there is no instance of it | |
122 | // and it only has static members. | |
123 | init_func_t pre_init_func, post_init_func; | |
124 | boolean pre_init_called, post_init_called; | |
125 | set_param_func_t set_param_func; | |
3abe9331 | 126 | get_param_func_t get_param_func; |
970ed795 EL |
127 | log_param_func_t log_param_func; |
128 | initialize_component_func_t initialize_component_func; | |
129 | start_func_t start_func; | |
130 | control_func_t control_func; | |
131 | struct function_list_item; | |
132 | function_list_item *function_head, *function_tail; | |
133 | struct altstep_list_item; | |
134 | altstep_list_item *altstep_head, *altstep_tail; | |
135 | struct testcase_list_item; | |
136 | testcase_list_item *testcase_head, *testcase_tail; | |
137 | ||
138 | /// Copy constructor disabled | |
139 | TTCN_Module(const TTCN_Module&); | |
140 | /// Assignment disabled | |
141 | TTCN_Module& operator=(const TTCN_Module&); | |
142 | public: | |
143 | TTCN_Module(const char *par_module_name, | |
144 | const char *par_compilation_date, | |
145 | const char *par_compilation_time, | |
146 | const unsigned char *par_md5_checksum, | |
147 | init_func_t par_pre_init_func, | |
148 | const char* par_product_number, | |
149 | unsigned int par_suffix, | |
150 | unsigned int par_release, | |
151 | unsigned int par_patch, | |
152 | unsigned int par_build, | |
153 | const char* par_extra, | |
154 | size_t par_num_namespace, | |
155 | const namespace_t *par_namespaces, | |
156 | init_func_t par_post_init_func, | |
157 | set_param_func_t par_set_param_func, | |
3abe9331 | 158 | get_param_func_t par_get_param_func, |
970ed795 EL |
159 | log_param_func_t par_log_param_func, |
160 | initialize_component_func_t par_initialize_component_func, | |
161 | start_func_t par_start_func, | |
162 | control_func_t par_control_func); | |
163 | TTCN_Module(const char *par_module_name, | |
164 | const char *par_compilation_date, | |
165 | const char *par_compilation_time, | |
166 | const unsigned char *par_md5_checksum, | |
167 | init_func_t par_init_func); | |
168 | TTCN_Module(const char *par_module_name, | |
169 | const char *par_compilation_date, | |
170 | const char *par_compilation_time, | |
171 | init_func_t par_init_func = NULL); | |
172 | ~TTCN_Module(); | |
173 | const char *get_name() const { return module_name; } | |
174 | ||
175 | void pre_init_module(); | |
176 | void post_init_module(); | |
177 | ||
178 | void add_function(const char *function_name, genericfunc_t function_address, | |
179 | genericfunc_t start_address); | |
180 | void add_altstep(const char *altstep_name, genericfunc_t altstep_address, | |
181 | genericfunc_t activate_address, genericfunc_t standalone_address); | |
182 | void add_testcase_nonpard(const char *testcase_name, | |
183 | testcase_t testcase_function); | |
184 | void add_testcase_pard(const char *testcase_name, | |
185 | genericfunc_t testcase_address); | |
186 | ||
187 | void execute_testcase(const char *testcase_name); | |
188 | void execute_all_testcases(); | |
189 | ||
190 | const char *get_function_name_by_address(genericfunc_t function_address); | |
191 | genericfunc_t get_function_address_by_name(const char *function_name); | |
192 | genericfunc_t get_function_start_by_address(genericfunc_t function_address); | |
193 | const char *get_altstep_name_by_address(genericfunc_t altstep_address); | |
194 | genericfunc_t get_altstep_address_by_name(const char *altstep_name); | |
195 | boolean get_altstep_data_by_address(genericfunc_t altstep_address, | |
196 | genericfunc_t& standalone_address, genericfunc_t& activate_address); | |
197 | const char *get_testcase_name_by_address(genericfunc_t testcase_address); | |
198 | genericfunc_t get_testcase_address_by_name(const char *testcase_name); | |
199 | ||
200 | void print_version(); | |
201 | ModuleVersion* get_version() const; | |
202 | void list_testcases(); | |
203 | size_t get_num_ns() const { return num_namespaces; } | |
204 | const namespace_t *get_ns(size_t p_index) const; | |
205 | const namespace_t *get_controlns() const; | |
206 | }; | |
207 | ||
208 | #endif |