OpenSync  0.22
osengine_flags.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 
24 OSyncFlag *osync_flag_new(OSyncFlag *parent)
25 {
26  OSyncFlag *flag = g_malloc0(sizeof(OSyncFlag));
27  flag->is_set = FALSE;
28  if (parent) {
29  flag->comb_flag = parent;
30  parent->num_not_set++;
31  osync_flag_calculate_comb(parent);
32  }
33  return flag;
34 }
35 
36 void osync_flag_free(OSyncFlag *flag)
37 {
38  g_free(flag);
39 }
40 
41 OSyncFlag *osync_comb_flag_new(osync_bool any, osync_bool default_val)
42 {
43  OSyncFlag *flag = osync_flag_new(NULL);
44  flag->is_comb = TRUE;
45  flag->is_any = any;
46  flag->default_val = default_val;
47  flag->is_set = default_val;
48  return flag;
49 }
50 
51 void osync_flag_attach(OSyncFlag *flag, OSyncFlag *target)
52 {
53  if (flag->comb_flag)
54  return;
55  g_assert(target->is_comb);
56  flag->comb_flag = target;
57  if (flag->is_set) {
58  target->num_set++;
59  } else {
60  target->num_not_set++;
61  }
62  osync_flag_calculate_comb(target);
63 }
64 
65 osync_bool osync_flag_is_attached(OSyncFlag *flag)
66 {
67  if (flag->comb_flag)
68  return TRUE;
69  return FALSE;
70 }
71 
72 void osync_flag_detach(OSyncFlag *flag)
73 {
74  OSyncFlag *target = flag->comb_flag;
75  if (!target)
76  return;
77  if (flag->is_set) {
78  target->num_set--;
79  } else {
80  target->num_not_set--;
81  }
82  flag->comb_flag = NULL;
83  osync_flag_calculate_comb(target);
84 }
85 
86 void osync_flag_set_pos_trigger(OSyncFlag *flag, OSyncFlagTriggerFunc func, void *data1, void *data2)
87 {
88  flag->pos_trigger_func = func;
89  flag->pos_user_data1 = data1;
90  flag->pos_user_data2 = data2;
91 }
92 
93 void osync_flag_set_neg_trigger(OSyncFlag *flag, OSyncFlagTriggerFunc func, void *data1, void *data2)
94 {
95  flag->neg_trigger_func = func;
96  flag->neg_user_data1 = data1;
97  flag->neg_user_data2 = data2;
98 }
99 
100 void osync_flag_calculate_comb(OSyncFlag *flag)
101 {
102  if (!flag->is_comb)
103  return;
104 
105  if (!flag->num_not_set && !flag->num_set) {
106  if (flag->default_val)
107  osync_flag_set(flag);
108  else
109  osync_flag_unset(flag);
110  return;
111  }
112 
113  if (!flag->is_any) {
114  if (!flag->num_not_set && flag->num_set) {
115  osync_flag_set(flag);
116  } else {
117  osync_flag_unset(flag);
118  }
119  } else {
120  if (flag->num_set) {
121  osync_flag_set(flag);
122  } else {
123  osync_flag_unset(flag);
124  }
125  }
126 }
127 
128 osync_bool osync_flag_is_set(OSyncFlag *flag)
129 {
130  if (flag->is_set == TRUE && flag->is_changing == FALSE)
131  return TRUE;
132  return FALSE;
133 }
134 
135 osync_bool osync_flag_is_not_set(OSyncFlag *flag)
136 {
137  if (flag->is_set == FALSE && flag->is_changing == FALSE)
138  return TRUE;
139  return FALSE;
140 }
141 
142 void osync_comb_flag_update(OSyncFlag *combflag, OSyncFlag *flag, osync_bool prev_state)
143 {
144  if (prev_state == flag->is_set)
145  return;
146  if (flag->is_set) {
147  combflag->num_not_set--;
148  combflag->num_set++;
149  } else {
150  combflag->num_not_set++;
151  combflag->num_set--;
152  }
153 }
154 
155 void osync_flag_changing(OSyncFlag *flag)
156 {
157  flag->is_changing = TRUE;
158 }
159 
160 void osync_flag_cancel(OSyncFlag *flag)
161 {
162  flag->is_changing = FALSE;
163 }
164 
165 void osync_flag_unset(OSyncFlag *flag)
166 {
167  osync_bool oldstate = flag->is_set;
168  flag->is_set = FALSE;
169  flag->is_changing = FALSE;
170  osync_flag_calc_trigger(flag, oldstate);
171  if (flag->comb_flag) {
172  osync_comb_flag_update(flag->comb_flag, flag, oldstate);
173  osync_flag_calculate_comb(flag->comb_flag);
174  }
175 }
176 
177 void osync_flag_set(OSyncFlag *flag)
178 {
179  osync_bool oldstate = flag->is_set;
180  flag->is_set = TRUE;
181  flag->is_changing = FALSE;
182  osync_flag_calc_trigger(flag, oldstate);
183  if (flag->comb_flag) {
184  osync_comb_flag_update(flag->comb_flag, flag, oldstate);
185  osync_flag_calculate_comb(flag->comb_flag);
186  }
187 }
188 
189 void osync_flag_set_state(OSyncFlag *flag, osync_bool state)
190 {
191  osync_bool oldstate = flag->is_set;
192  flag->is_set = state;
193  flag->is_changing = FALSE;
194  if (flag->comb_flag) {
195  osync_comb_flag_update(flag->comb_flag, flag, oldstate);
196  }
197  if (flag->is_comb) {
198  //flag->num_not_set = 0;
199  //flag->num_set = 0;
200  }
201 }
202 
203 osync_bool osync_flag_get_state(OSyncFlag *flag)
204 {
205  return flag->is_set;
206 }
207 
208 void osync_flag_calc_trigger(OSyncFlag *flag, osync_bool oldstate)
209 {
210  if (flag->is_set != oldstate) {
211  if (flag->is_set == TRUE) {
212  if (flag->pos_trigger_func) {
213  flag->pos_trigger_func(flag->pos_user_data1, flag->pos_user_data2);
214  }
215  } else {
216  if (flag->neg_trigger_func) {
217  flag->neg_trigger_func(flag->neg_user_data1, flag->neg_user_data2);
218  }
219  }
220  }
221 }
OSyncFlagTriggerFunc pos_trigger_func
unsigned int num_set
unsigned int num_not_set
osync_bool default_val
OSyncFlag * comb_flag
The functions that can be called on a plugin.
OSyncFlagTriggerFunc neg_trigger_func
osync_bool is_changing