33 typedef vector<string> CallbackArray;
34 typedef CallbackArray::const_iterator CallbackIter;
39 static void forgetCalledCallbacks() {
44 static void auto_dontcall1(
const char *key,
long value,
void *cl_hash) {
45 if (strncmp(key,
"ARB_NT/", 7) == 0) {
50 static void auto_dontcall2(
const char *key,
long value,
void *) {
54 static void forget_dontCallHash() {
62 static void build_dontCallHash() {
65 forgetCalledCallbacks();
67 atexit(forget_dontCallHash);
87 GBS_write_hash(dontCallHash,
"GDE__User__Start_a_slave_ARB_on_a_foreign_host_/GO", 2);
88 GBS_write_hash(dontCallHash,
"NAME_SERVER_ADMIN/REMOVE_SUPERFLUOUS_ENTRIES_IN_NAMES_FILE", 2);
89 GBS_write_hash(dontCallHash,
"GDE__Print__Pretty_print_sequences_slow_/GO", 2);
100 GBS_write_hash(dontCallHash,
"NAME_SERVER_ADMIN/EDIT_NAMES_FILE", 2);
115 GBS_write_hash(dontCallHash,
"PT_SERVER_ADMIN/CREATE_TEMPLATE", 2);
117 GBS_write_hash(dontCallHash,
"NAME_SERVER_ADMIN/CREATE_TEMPLATE", 2);
119 GBS_write_hash(dontCallHash,
"EXPORT_TREE_AS_XFIG/START_XFIG", 2);
145 GBS_write_hash(dontCallHash,
"Signature_region_search_1/SAVE", 3);
146 GBS_write_hash(dontCallHash,
"Signature_global_search_1/SAVE", 3);
156 GBS_write_hash(dontCallHash,
"ARB_NT/view_probe_group_result", 4);
178 GBS_write_hash(dontCallHash,
"GDE__Import__Import_sequences_using_Readseq_slow_/GO", 5);
181 GBS_write_hash(dontCallHash,
"MULTI_PROBE/CREATE_NEW_SEQUENCE", 5);
182 GBS_write_hash(dontCallHash,
"PT_SERVER_ADMIN/KILL_ALL_SERVERS", 5);
187 GBS_write_hash(dontCallHash,
"SPECIES_QUERY/DELETE_LISTED_spec", 5);
188 GBS_write_hash(dontCallHash,
"SPECIES_QUERY/SAVELOAD_CONFIG_spec", 5);
194 GBS_write_hash(dontCallHash,
"NAME_SERVER_ADMIN/DELETE_OLD_NAMES_FILE", 5);
197 GBS_write_hash(dontCallHash,
"MERGE_TRANSFER_SPECIES/DELETE_LISTED_db1", 5);
198 GBS_write_hash(dontCallHash,
"MERGE_TRANSFER_SPECIES/DELETE_LISTED_db2", 5);
199 GBS_write_hash(dontCallHash,
"MERGE_CONFIGS/DELETE CONFIG_DB1", 5);
200 GBS_write_hash(dontCallHash,
"MERGE_CONFIGS/DELETE CONFIG_DB2", 5);
218 StringVectorArray(
const CallbackArray& a)
222 for (CallbackArray::iterator
id = array.begin();
id != array.end(); ++
id) {
228 inline bool exclude_key(
const char *key) {
229 if (strncmp(key,
"FILTER_SELECT_", 14) == 0) {
230 if (strstr(key,
"/2filter/2filter/2filter/")) {
235 if (strstr(key,
"SAVELOAD_CONFIG"))
return true;
240 inline bool is_wanted_callback(
const char *key) {
246 static int sortedByCallbackLocation(
const char *k0,
long v0,
const char *k1,
long v1) {
251 if (!cmp) cmp = strcmp(k0, k1);
259 static void add_wanted_callbacks(
const char *key,
long ,
void *cl_callbacks) {
260 if (is_wanted_callback(key)) {
261 CallbackArray *
callbacks =
reinterpret_cast<CallbackArray*
>(cl_callbacks);
262 callbacks->push_back(
string(key));
267 if (!dontCallHash) build_dontCallHash();
270 return new StringVectorArray(callbacks);
276 size_t AW_root::callallcallbacks(
int mode) {
287 size_t callCount = 0;
291 if (!dontCallHash) build_dontCallHash();
293 if (mode>0 && (mode&8)) {
295 for (
int iter = 1; ; ++iter) {
296 size_t thisCount = callallcallbacks(mode&~8);
303 callCount += thisCount;
306 else if (mode == -1) {
307 forgetCalledCallbacks();
321 aw_message(
"Marking all callbacks as \"called\"");
336 case 3: reverse(callbacks.begin(), callbacks.end());
break;
337 case 4: random_shuffle(callbacks.begin(), callbacks.end());
break;
341 count = callbacks.size();
344 CallbackIter end = callbacks.end();
346 for (
int pass = 1; pass <= 2; ++pass) {
348 CallbackIter
cb = callbacks.begin();
350 for (; cb != end; ++
cb) {
351 const char *remote_command = cb->c_str();
352 const char *remote_command_name = remote_command;
354 const char *slash = strrchr(remote_command,
'/');
355 if (slash) remote_command_name = slash+1;
358 char firstNameChar = remote_command_name[0];
359 bool this_pass = firstNameChar ==
'-' ? (pass == 2) : (pass == 1);
366 bool skipcb = firstNameChar ==
'!' ||
GBS_read_hash(dontCallHash, remote_command);
373 fprintf(stderr,
"Skipped callback %zu/%zu (%s)\n", curr, count, remote_command);
376 fprintf(stderr,
"Calling back %zu/%zu (%s)\n", curr, count, remote_command);
382 process_pending_events();
385 fprintf(stderr,
"Unhandled error in '%s': %s\n", remote_command,
GB_await_error());
392 fprintf(stderr,
"Delayed callback %zu/%zu (%s)\n", curr, count, remote_command);
399 if (pass == 1) fprintf(stderr,
"Executing delayed callbacks:\n");
void GBS_hash_do_const_sorted_loop(const GB_HASH *hs, gb_hash_const_loop_type func, gbs_hash_compare_function sorter, void *client_data)
long GBS_write_hash(GB_HASH *hs, const char *key, long val)
static list< ArbDisconnectCallback > callbacks
const char * GBS_global_string(const char *templat,...)
void GBS_free_hash(GB_HASH *hs)
GB_ERROR GB_await_error()
bool contains(AnyWinCB g)
void GBS_hash_do_const_loop(const GB_HASH *hs, gb_hash_const_loop_type func, void *client_data)
int compare(const AW_cb &other) const
size_t GBS_hash_elements(const GB_HASH *hs)
WindowCallbackSimple AnyWinCB
void AW_help_entry_pressed(AW_window *aww)
void aw_message(const char *msg)
int GBS_HCF_sortedByKey(const char *k0, long dummy_1x, const char *k1, long dummy_2x)
long GBS_read_hash(const GB_HASH *hs, const char *key)
GB_HASH * GBS_create_hash(long estimated_elements, GB_CASE case_sens)