OpenSync  0.22
osengine_deciders.c
1 /*
2  * libosengine - A synchronization engine for the opensync framework
3  * Copyright (C) 2004-2005 Armin Bauer <armin.bauer@opensync.org>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library 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 GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  */
20 
21 #include "engine.h"
22 #include "engine_internals.h"
23 
34 
35 #ifndef DOXYGEN_SHOULD_SKIP_THIS
36 void osengine_mappingentry_decider(OSyncEngine *engine, OSyncMappingEntry *entry)
37 {
38  osync_trace(TRACE_ENTRY, "osengine_mappingentry_decider(%p, %p)", engine, entry);
39  osengine_print_flags(engine);
40  osengine_mappingentry_print_flags(entry);
41 
42  engine->alldeciders++;
43 
44  if (osync_flag_is_set(engine->fl_running) \
45  && osync_flag_is_set(engine->fl_sync) \
46  && osync_flag_is_set(entry->fl_has_info) \
47  && osync_flag_is_not_set(entry->fl_has_data)) {
48  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Get data (Entry %p) ++++", entry);
49  osync_client_get_change_data(entry->client, engine, entry, NULL);
50  osync_trace(TRACE_EXIT, "osengine_mappingentry_decider");
51  return;
52  }
53 
54  if (osync_flag_is_set(engine->fl_running) \
55  && osync_flag_is_set(engine->cmb_read_all) \
56  && osync_flag_is_set(engine->cmb_sent_changes) \
57  && osync_flag_is_set(engine->fl_sync) \
58  && osync_flag_is_set(entry->fl_has_info) \
59  && osync_flag_is_set(entry->fl_has_data)) {
60  if (osync_flag_is_not_set(entry->fl_mapped)) {
61  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Mapping entry (Entry %p) ++++", entry);
62  osengine_change_map(engine, entry);
63  osync_trace(TRACE_EXIT, "osengine_mappingentry_decider");
64  return;
65  }
66  if (osync_flag_is_set(entry->fl_dirty)) {
67  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Commiting (Entry %p) ++++", entry);
68  osync_client_commit_change(entry->client, engine, entry, NULL);
69  osync_trace(TRACE_EXIT, "osengine_mappingentry_decider");
70  return;
71  }
72  }
73 
74  engine->wasted++;
75  osync_trace(TRACE_EXIT, "osengine_mappingentry_decider: Waste");
76 }
77 
78 void osengine_mappingentry_all_deciders(OSyncEngine *engine, OSyncMapping *mapping)
79 {
80  osync_debug("ENG", 3, "Calling all mappingentry deciders (%i) for mapping %p", g_list_length(mapping->entries), mapping);
81  GList *e;
82  for (e = mapping->entries; e ; e = e->next) {
83  OSyncMappingEntry *entry = e->data;
84  send_mappingentry_changed(engine, entry);
85  }
86 }
87 
88 void osengine_mapping_decider(OSyncEngine *engine, OSyncMapping *mapping)
89 {
90  osync_trace(TRACE_ENTRY, "osengine_mapping_decider(%p, %p)", engine, mapping);
91  osengine_print_flags(engine);
92  osengine_mapping_print_flags(mapping);
93 
94  engine->alldeciders++;
95 
96  if (osync_flag_is_set(engine->fl_running) \
97  && osync_flag_is_set(engine->cmb_sent_changes) \
98  && osync_flag_is_set(engine->cmb_read_all) \
99  && osync_flag_is_set(engine->cmb_entries_mapped) \
100  && osync_flag_is_set(mapping->cmb_has_data) \
101  && osync_flag_is_not_set(mapping->cmb_synced) \
102  && osync_flag_is_not_set(mapping->fl_solved) \
103  && osync_flag_is_not_set(mapping->fl_chkconflict)) {
104  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Check Conflict (Mapping %p) ++++", mapping);
105  osengine_mapping_check_conflict(engine, mapping);
106  osync_trace(TRACE_EXIT, "osengine_mapping_decider");
107  return;
108  }
109 
110  if (osync_flag_is_set(engine->fl_running) \
111  && osync_flag_is_set(engine->cmb_sent_changes) \
112  && osync_flag_is_set(engine->cmb_read_all) \
113  && osync_flag_is_set(engine->cmb_entries_mapped) \
114  && osync_flag_is_set(mapping->cmb_has_data) \
115  && osync_flag_is_not_set(mapping->cmb_synced) \
116  && osync_flag_is_set(mapping->fl_solved) \
117  && osync_flag_is_set(mapping->fl_chkconflict) \
118  && osync_flag_is_not_set(mapping->fl_multiplied)) {
119  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Multiply (Mapping %p) ++++", mapping);
120  osengine_mapping_multiply_master(engine, mapping);
121  osync_trace(TRACE_EXIT, "osengine_mapping_decider");
122  return;
123  }
124 
125  if (osync_flag_is_set(engine->fl_running) \
126  && osync_flag_is_set(engine->cmb_synced) \
127  && osync_flag_is_set(mapping->cmb_has_info) \
128  && osync_flag_is_not_set(mapping->cmb_deleted) \
129  && osync_flag_is_set(engine->cmb_multiplied)) {
130  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Reset Mapping (Mapping %p) ++++", mapping);
131  osengine_mapping_reset(mapping);
132  osync_trace(TRACE_EXIT, "osengine_mapping_decider");
133  return;
134  }
135 
136  if (osync_flag_is_set(engine->fl_running) \
137  && osync_flag_is_set(mapping->cmb_synced) \
138  && osync_flag_is_set(mapping->cmb_deleted)) {
139  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Deleting Mapping (Mapping %p) ++++", mapping);
140  osengine_mapping_delete(mapping);
141  osync_trace(TRACE_EXIT, "osengine_mapping_decider");
142  return;
143  }
144 
145  engine->wasted++;
146  osync_trace(TRACE_EXIT, "osengine_mapping_decider: Waste");
147 }
148 
149 void osengine_mapping_all_deciders(OSyncEngine *engine)
150 {
151  GList *m;
152  osync_trace(TRACE_INTERNAL, "Calling all mapping deciders (%i)", g_list_length(engine->maptable->mappings));
153  for (m = engine->maptable->mappings; m; m = m->next) {
154  OSyncMapping *mapping = m->data;
155  send_mapping_changed(engine, mapping);
156  }
157 }
158 
159 void osengine_client_decider(OSyncEngine *engine, OSyncClient *client)
160 {
161  osync_trace(TRACE_ENTRY, "osengine_client_decider(%p, %p)", engine, client);
162  osengine_print_flags(engine);
163  osync_client_print_flags(client);
164 
165  engine->alldeciders++;
166 
167  if (osync_flag_is_set(engine->fl_running) \
168  && osync_flag_is_not_set(engine->fl_stop) \
169  && osync_flag_is_not_set(client->fl_done) \
170  && osync_flag_is_not_set(client->fl_connected) \
171  && osync_flag_is_not_set(client->fl_finished)) {
172  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Connecting (Client %p) ++++", client);
173  osync_client_connect(client, engine, NULL);
174  osync_trace(TRACE_EXIT, "osengine_client_decider");
175  return;
176  }
177 
178  if (osync_flag_is_set(engine->fl_running) \
179  && osync_flag_is_not_set(engine->fl_stop) \
180  && osync_flag_is_not_set(client->fl_done) \
181  && osync_flag_is_set(client->fl_connected) \
182  && osync_flag_is_not_set(client->fl_sent_changes) \
183  && osync_flag_is_set(engine->cmb_connected)) {
184  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Get changes (Client %p) ++++", client);
185  osync_client_get_changes(client, engine, NULL);
186  osync_trace(TRACE_EXIT, "osengine_client_decider");
187  return;
188  }
189 
190  if (osync_flag_is_set(engine->fl_running) \
191  && osync_flag_is_not_set(engine->fl_stop) \
192  && osync_flag_is_not_set(client->fl_done) \
193  && osync_flag_is_set(client->fl_connected) \
194  && osync_flag_is_set(client->fl_sent_changes) \
195  && osync_flag_is_not_set(client->fl_committed_all) \
196  && osync_flag_is_set(engine->cmb_sent_changes) \
197  && osync_flag_is_set(engine->cmb_multiplied) \
198  && osync_flag_is_set(engine->cmb_read_all) \
199  && osync_flag_is_set(engine->cmb_entries_mapped) \
200  && osync_flag_is_set(engine->cmb_committed_all)) {
201  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Committed all (Client %p) ++++", client);
202  osync_client_committed_all(client, engine, NULL);
203  osync_trace(TRACE_EXIT, "osengine_client_decider");
204  return;
205  }
206 
207  if (osync_flag_is_set(engine->fl_running) \
208  && osync_flag_is_not_set(engine->fl_stop) \
209  && osync_flag_is_not_set(client->fl_done) \
210  && osync_flag_is_set(client->fl_connected) \
211  && osync_flag_is_set(client->fl_sent_changes) \
212  && osync_flag_is_set(client->fl_committed_all) \
213  && osync_flag_is_set(engine->cmb_read_all) \
214  && osync_flag_is_set(engine->cmb_sent_changes) \
215  && osync_flag_is_set(engine->cmb_synced) \
216  && osync_flag_is_set(engine->cmb_entries_mapped)) {
217  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Sync done (Client %p) ++++", client);
218  osync_client_sync_done(client, engine, NULL);
219  osync_trace(TRACE_EXIT, "osengine_client_decider");
220  return;
221  }
222 
223  if (osync_flag_is_set(engine->fl_running) \
224  && (osync_flag_is_set(client->fl_done) \
225  || osync_flag_is_set(engine->fl_stop)) \
226  && osync_flag_is_set(client->fl_connected)) {
227  osync_trace(TRACE_INTERNAL, "++++ ENGINE COMMAND: Disconnecting (Client %p) ++++", client);
228  osync_client_disconnect(client, engine, NULL);
229  osync_trace(TRACE_EXIT, "osengine_client_decider");
230  return;
231  }
232 
233  engine->wasted++;
234  osync_trace(TRACE_EXIT, "osengine_client_decider: Waste");
235 }
236 
237 void osengine_client_all_deciders(OSyncEngine *engine)
238 {
239  GList *c;
240  osync_debug("ENG", 3, "Calling all client deciders (%i)", g_list_length(engine->clients));
241  for (c = engine->clients; c; c = c->next) {
242  OSyncClient *client = c->data;
243  osengine_client_decider(engine, client);
244  }
245 }
246 #endif
247