1 /*
2 # Copyright (C) 2015 Fulvio Benini
3 
4 * This file is part of Scid (Shane's Chess Information Database).
5 *
6 * Scid is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation.
9 *
10 * Scid is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with Scid. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #ifndef SCID_UI__H
20 #define SCID_UI__H
21 
22 #include "misc.h"
23 #ifndef CHECKUIDEP
24 #include "ui_tcltk.h"
25 #else
26 //Dummy functions useful to catch unwanted dependencies
27 namespace UI_impl {
28 
29 typedef int   UI_res_t;
30 typedef void* UI_extra_t;
31 typedef void* UI_handle_t;
32 
Main(int argc,char * argv[],void (* exit)(void *))33 inline int Main (int argc, char* argv[], void (*exit) (void*)) {
34 	return 0;
35 }
CreateProgress(UI_handle_t)36 inline Progress CreateProgress(UI_handle_t) {
37 	return Progress();
38 }
CreateProgressPosMask(UI_handle_t)39 inline Progress CreateProgressPosMask(UI_handle_t) {
40 	return Progress();
41 }
42 class List {
43 public:
List(size_t)44 	explicit List(size_t) {}
clear()45 	void clear() {}
push_back(const T &)46 	template <typename T> void push_back(const T&) {}
47 };
Result(UI_handle_t,errorT)48 inline UI_res_t Result(UI_handle_t, errorT) {
49 	return 0;
50 }
51 template <typename T>
Result(UI_handle_t,errorT,const T &)52 inline UI_res_t Result(UI_handle_t, errorT, const T&) {
53 	return 0;
54 }
55 
56 }
57 #endif
58 
59 
60 /*
61  * Interface for communication between UI and c++ server.
62  *
63  * The interaction between the UI and c++ code is of type client/server.
64  * UI calls sc_ functions, the c++ server execute the operation and returns
65  * a success/error code plus, optionally, some results.
66  *
67  * The only server-side event generated by c++ code is for long operations:
68  * it will repeatedly report to UI the amount of work done until completion.
69  * UI should respond to this events with true (continue) or false (interrupt).
70  */
71 
72 
73 using UI_impl::UI_res_t;
74 using UI_impl::UI_extra_t;
75 using UI_impl::UI_handle_t;
76 
77 /**
78  * sc_*() - Execute server side operations
79  * Each function usually have subcommands.
80  * See functions implemenations for more usage info.
81  */
82 UI_res_t str_is_prefix  (UI_extra_t, UI_handle_t, int argc, const char ** argv);
83 UI_res_t str_prefix_len (UI_extra_t, UI_handle_t, int argc, const char ** argv);
84 UI_res_t sc_base        (UI_extra_t, UI_handle_t, int argc, const char ** argv);
85 UI_res_t sc_book        (UI_extra_t, UI_handle_t, int argc, const char ** argv);
86 UI_res_t sc_clipbase    (UI_extra_t, UI_handle_t, int argc, const char ** argv);
87 UI_res_t sc_eco         (UI_extra_t, UI_handle_t, int argc, const char ** argv);
88 UI_res_t sc_filter      (UI_extra_t, UI_handle_t, int argc, const char ** argv);
89 UI_res_t sc_game        (UI_extra_t, UI_handle_t, int argc, const char ** argv);
90 UI_res_t sc_info        (UI_extra_t, UI_handle_t, int argc, const char ** argv);
91 UI_res_t sc_move        (UI_extra_t, UI_handle_t, int argc, const char ** argv);
92 UI_res_t sc_name        (UI_extra_t, UI_handle_t, int argc, const char ** argv);
93 UI_res_t sc_report      (UI_extra_t, UI_handle_t, int argc, const char ** argv);
94 UI_res_t sc_pos         (UI_extra_t, UI_handle_t, int argc, const char ** argv);
95 UI_res_t sc_search      (UI_extra_t, UI_handle_t, int argc, const char ** argv);
96 UI_res_t sc_tree        (UI_extra_t, UI_handle_t, int argc, const char ** argv);
97 UI_res_t sc_var         (UI_extra_t, UI_handle_t, int argc, const char ** argv);
98 
99 
100 /**
101  * UI_Main() - Init the UI
102  * @param exit: clean up function to be called when closing UI
103  */
UI_Main(int argc,char * argv[],void (* exit)(void *))104 inline int UI_Main (int argc, char* argv[], void (*exit) (void*)) {
105 	return UI_impl::Main(argc, argv, exit);
106 }
107 
108 
109 /**
110  * UI_CreateProgress() - create a Progress object
111  *
112  * With this function c++ code contact the UI to report that the operation
113  * asked may take a long time.
114  * Then c++ code call Progress::report repeatedly to inform the UI about
115  * the percentage of work done and an estimated time to complete the operation.
116  * Progress::report will return false if the UI wants to interrupt the operation
117  *
118  * Return:
119  * a Progress object that represent the server->UI async communication, or
120  * an empty Progress() if the UI is not interested in the progress report.
121  */
UI_CreateProgress(UI_handle_t ti)122 inline Progress UI_CreateProgress(UI_handle_t ti) {
123 	return UI_impl::CreateProgress(ti);
124 }
UI_CreateProgressPosMask(UI_handle_t ti)125 inline Progress UI_CreateProgressPosMask(UI_handle_t ti) {
126 	return UI_impl::CreateProgressPosMask(ti);
127 }
128 
129 
130 /**
131  * UI_Result() - pass the result of an operation from c++ to UI
132  * @param res:   OK for success or an error code (error.h)
133  * @param value: a value (or a list of values, see UI_List) to pass to the UI
134  *
135  * Typical usage:
136  * UI_Result(ti, OK);
137  * UI_Result(ti, OK, "string value");
138  * UI_Result(ti, OK, 5);
139  */
UI_Result(UI_handle_t ti,errorT res)140 inline UI_res_t UI_Result(UI_handle_t ti, errorT res) {
141 	return UI_impl::Result(ti, res);
142 }
143 template <typename T>
UI_Result(UI_handle_t ti,errorT res,const T & value)144 inline UI_res_t UI_Result(UI_handle_t ti, errorT res, const T& value) {
145 	return UI_impl::Result(ti, res, value);
146 }
147 
148 
149 /**
150  * An heterogeneous container used to pass a list of values from c++ to UI.
151  * @param max_size: currently there is no automatic reallocation in push_back()
152  *                  so the constructor must know the max number of values that
153  *                  will be stored in the list.
154  *
155  *
156  * Typical usage:
157  * UI_List uiList(2);
158  * uiList.push_back("string value");
159  * uiList.push_back(5);
160  * UI_Result(ti, OK, uiList)
161  */
162 class UI_List : public UI_impl::List {
163 public:
UI_List(size_t max_size)164 	explicit UI_List(size_t max_size)
165 	: UI_impl::List(max_size) {
166 	}
167 
168 	/**
169 	 * Inherited from UI_impl::List
170 	 *
171 	void clear();
172 	template <typename T> void push_back(const T& value);
173 	 */
174 };
175 
176 
177 #endif
178