Freeciv21
Develop your civilization from humble roots to a global empire
voteinfo.cpp
Go to the documentation of this file.
1 /*__ ___ ***************************************
2 / \ / \ Copyright (c) 1996-2020 Freeciv21 and Freeciv
3 \_ \ / __/ contributors. This file is part of Freeciv21.
4  _\ \ / /__ Freeciv21 is free software: you can redistribute it
5  \___ \____/ __/ and/or modify it under the terms of the GNU General
6  \_ _/ Public License as published by the Free Software
7  | @ @ \_ Foundation, either version 3 of the License,
8  | or (at your option) any later version.
9  _/ /\ You should have received a copy of the GNU
10  /o) (o/\ \_ General Public License along with Freeciv21.
11  \_____/ / If not, see https://www.gnu.org/licenses/.
12  \____/ ********************************************************/
13 
14 #include <ctime>
15 
16 // utility
17 #include "log.h"
18 
19 // common
20 #include "packets.h"
21 
22 /* client/include */
23 #include "voteinfo_bar_g.h"
24 
25 // client
26 #include "client_main.h"
27 #include "options.h"
28 
29 #include "voteinfo.h"
30 
31 // Define struct voteinfo_list type.
32 #define SPECLIST_TAG voteinfo
33 #define SPECLIST_TYPE struct voteinfo
34 #include "speclist.h"
35 #define voteinfo_list_iterate(alist, pitem) \
36  TYPED_LIST_ITERATE(struct voteinfo, alist, pitem)
37 #define voteinfo_list_iterate_end LIST_ITERATE_END
38 
39 static struct voteinfo_list *voteinfo_queue = nullptr;
41 
47 {
48  struct voteinfo *vi;
49 
51  "%s() called before votinfo_queue_init()!",
52  __FUNCTION__);
53 
55  if (vi == nullptr) {
56  return;
57  }
58  vi->remove_time = time(nullptr);
59 }
60 
66 {
67  time_t now;
68  struct voteinfo_list *removed;
69 
70  if (voteinfo_queue == nullptr) {
71  return;
72  }
73 
74  now = time(nullptr);
75  removed = voteinfo_list_new();
77  {
78  if (vi != nullptr && vi->remove_time > 0 && now - vi->remove_time > 2) {
79  voteinfo_list_append(removed, vi);
80  }
81  }
83 
84  voteinfo_list_iterate(removed, vi) { voteinfo_queue_remove(vi->vote_no); }
86 
87  if (voteinfo_list_size(removed) > 0) {
89  }
90 
91  voteinfo_list_destroy(removed);
92 }
93 
97 void voteinfo_queue_remove(int vote_no)
98 {
99  struct voteinfo *vi;
100 
102  "%s() called before votinfo_queue_init()!",
103  __FUNCTION__);
104 
106  if (vi == nullptr) {
107  return;
108  }
109 
110  voteinfo_list_remove(voteinfo_queue, vi);
111  delete vi;
112 }
113 
117 void voteinfo_queue_add(int vote_no, const char *user, const char *desc,
118  int percent_required, int flags)
119 {
120  struct voteinfo *vi;
121 
123  "%s() called before votinfo_queue_init()!",
124  __FUNCTION__);
125 
126  vi = new voteinfo[1]();
127  vi->vote_no = vote_no;
128  sz_strlcpy(vi->user, user);
129  sz_strlcpy(vi->desc, desc);
131  vi->flags = flags;
132 
134  voteinfo_list_prepend(voteinfo_queue, vi);
136  } else {
137  voteinfo_list_append(voteinfo_queue, vi);
138  }
139 }
140 
145 {
146  fc_assert_ret_val_msg(nullptr != voteinfo_queue, nullptr,
147  "%s() called before votinfo_queue_init()!",
148  __FUNCTION__);
149 
151  {
152  if (vi->vote_no == vote_no) {
153  return vi;
154  }
155  }
157  return nullptr;
158 }
159 
164 {
165  if (voteinfo_queue != nullptr) {
167  }
168  voteinfo_queue = voteinfo_list_new();
170 }
171 
176 {
177  if (voteinfo_queue == nullptr) {
178  return;
179  }
180 
182  {
183  delete vi;
184  vi = nullptr;
185  }
187 
188  voteinfo_list_destroy(voteinfo_queue);
189  voteinfo_queue = nullptr;
191 }
192 
199 {
200  struct voteinfo *vi;
201  int size;
202 
203  if (voteinfo_queue == nullptr) {
204  return nullptr;
205  }
206 
207  size = voteinfo_list_size(voteinfo_queue);
208 
209  if (size <= 0) {
210  return nullptr;
211  }
212 
216  }
217 
218  vi = voteinfo_list_get(voteinfo_queue, voteinfo_queue_current_index);
219 
220  if (vi != nullptr && pindex != nullptr) {
222  }
223 
224  return vi;
225 }
226 
232 {
233  struct voteinfo *vi;
234  struct packet_vote_submit packet;
235 
236  if (!can_client_control()) {
237  return;
238  }
239 
240  vi = voteinfo_queue_find(vote_no);
241  if (vi == nullptr) {
242  return;
243  }
244 
245  packet.vote_no = vi->vote_no;
246 
247  switch (vote) {
248  case CVT_YES:
249  packet.value = 1;
250  break;
251  case CVT_NO:
252  packet.value = -1;
253  break;
254  case CVT_ABSTAIN:
255  packet.value = 0;
256  break;
257  default:
258  return;
259  break;
260  }
261 
262  send_packet_vote_submit(&client.conn, &packet);
263  vi->client_vote = vote;
264 }
265 
270 {
271  int size;
272 
273  if (voteinfo_queue == nullptr) {
274  return;
275  }
276 
277  size = voteinfo_list_size(voteinfo_queue);
278 
282  }
283 }
284 
289 {
290  return (nullptr != voteinfo_queue ? voteinfo_list_size(voteinfo_queue)
291  : 0);
292 }
struct civclient client
bool can_client_control()
Returns TRUE iff the client can control player.
#define fc_assert_ret_msg(condition, message,...)
Definition: log.h:129
#define fc_assert_ret_val_msg(condition, val, message,...)
Definition: log.h:132
client_options * gui_options
Definition: options.cpp:74
size_t size
Definition: specvec.h:64
struct connection conn
Definition: client_main.h:89
bool voteinfo_bar_new_at_front
Definition: options.h:109
Definition: voting.h:43
char desc[512]
Definition: voteinfo.h:23
int flags
Definition: voteinfo.h:25
int vote_no
Definition: voteinfo.h:21
time_t remove_time
Definition: voteinfo.h:35
int percent_required
Definition: voteinfo.h:24
enum client_vote_type client_vote
Definition: voteinfo.h:34
char user[MAX_LEN_NAME]
Definition: voteinfo.h:22
#define sz_strlcpy(dest, src)
Definition: support.h:140
static int voteinfo_queue_current_index
Definition: voteinfo.cpp:40
void voteinfo_queue_delayed_remove(int vote_no)
Remove the vote with number 'vote_no' after a small amount of time so that the user can see that it w...
Definition: voteinfo.cpp:46
void voteinfo_do_vote(int vote_no, enum client_vote_type vote)
Convenience function for submitting a vote to the server.
Definition: voteinfo.cpp:231
struct voteinfo * voteinfo_queue_get_current(int *pindex)
Get the voteinfo record at the start of the vote queue.
Definition: voteinfo.cpp:198
void voteinfo_queue_init()
Initialize data structures used by this module.
Definition: voteinfo.cpp:163
void voteinfo_queue_remove(int vote_no)
Remove the given vote from the queue immediately.
Definition: voteinfo.cpp:97
#define voteinfo_list_iterate(alist, pitem)
Definition: voteinfo.cpp:35
void voteinfo_queue_next()
Cycle through the votes in the queue.
Definition: voteinfo.cpp:269
void voteinfo_queue_free()
Free memory allocated by this module.
Definition: voteinfo.cpp:175
int voteinfo_queue_size()
Returns the number of pending votes.
Definition: voteinfo.cpp:288
struct voteinfo * voteinfo_queue_find(int vote_no)
Find the voteinfo record corresponding to the given vote number.
Definition: voteinfo.cpp:144
static struct voteinfo_list * voteinfo_queue
Definition: voteinfo.cpp:39
#define voteinfo_list_iterate_end
Definition: voteinfo.cpp:37
void voteinfo_queue_check_removed()
Check for old votes that should be removed from the queue.
Definition: voteinfo.cpp:65
void voteinfo_queue_add(int vote_no, const char *user, const char *desc, int percent_required, int flags)
Create a new voteinfo record and place it in the queue.
Definition: voteinfo.cpp:117
client_vote_type
Definition: voteinfo.h:17
@ CVT_YES
Definition: voteinfo.h:17
@ CVT_NO
Definition: voteinfo.h:17
@ CVT_ABSTAIN
Definition: voteinfo.h:17
void voteinfo_gui_update(void)
Refresh all vote related GUI widgets.