00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "opensync.h"
00022 #include "opensync_internals.h"
00023
00024 #include "common/opensync_marshal.h"
00025
00026 #include "opensync_serializer_internals.h"
00027
00028 #include "opensync_message_internals.h"
00029 #include "opensync_message_private.h"
00030
00031
00032 OSyncMessage *osync_message_new(OSyncMessageCommand cmd, unsigned int size, OSyncError **error)
00033 {
00034 OSyncMessage *message = osync_try_malloc0(sizeof(OSyncMessage), error);
00035 if (!message)
00036 return NULL;
00037
00038 message->cmd = cmd;
00039 message->refCount = 1;
00040
00041 message->marshal = osync_marshal_sized_new(size, error);
00042 if (!message->marshal)
00043 return NULL;
00044
00045 return message;
00046 }
00047
00048 OSyncMessage *osync_message_ref(OSyncMessage *message)
00049 {
00050 g_atomic_int_inc(&(message->refCount));
00051
00052 return message;
00053 }
00054
00055 void osync_message_unref(OSyncMessage *message)
00056 {
00057 if (g_atomic_int_dec_and_test(&(message->refCount))) {
00058
00059 osync_marshal_unref(message->marshal);
00060
00061 osync_free(message);
00062 }
00063 }
00064
00065 void osync_message_set_cmd(OSyncMessage *message, OSyncMessageCommand cmd)
00066 {
00067 osync_assert(message);
00068 message->cmd = cmd;
00069 }
00070
00071 OSyncMessageCommand osync_message_get_cmd(OSyncMessage *message)
00072 {
00073 osync_assert(message);
00074 return message->cmd;
00075 }
00076
00077 void osync_message_set_timeout(OSyncMessage *message, unsigned int timeout)
00078 {
00079 osync_assert(message);
00080 message->timeout = timeout;
00081 }
00082
00083 unsigned int osync_message_get_timeout(OSyncMessage *message)
00084 {
00085 osync_assert(message);
00086 return message->timeout;
00087 }
00088
00089 void osync_message_set_id(OSyncMessage *message, long long int id)
00090 {
00091 osync_assert(message);
00092 message->id = id;
00093 }
00094
00095 long long int osync_message_get_id(OSyncMessage *message)
00096 {
00097 osync_assert(message);
00098 return message->id;
00099 }
00100
00101 OSyncMarshal *osync_message_get_marshal(OSyncMessage *message)
00102 {
00103 osync_return_val_if_fail(message, NULL);
00104 return message->marshal;
00105 }
00106
00107 unsigned int osync_message_get_message_size(OSyncMessage *message)
00108 {
00109 return osync_marshal_get_marshal_size(message->marshal);
00110 }
00111
00112 void osync_message_set_message_size(OSyncMessage *message, unsigned int size)
00113 {
00114 osync_marshal_set_marshal_size(message->marshal, size);
00115 }
00116
00117 void osync_message_get_buffer(OSyncMessage *message, char **data, unsigned int *size)
00118 {
00119 osync_marshal_get_buffer(message->marshal, data, size);
00120 }
00121
00122 void osync_message_set_handler(OSyncMessage *message, OSyncMessageHandler handler, void *user_data)
00123 {
00124 message->user_data = user_data;
00125 message->callback = handler;
00126 }
00127
00128 OSyncMessageHandler osync_message_get_handler(OSyncMessage *message)
00129 {
00130 osync_assert(message);
00131 return message->callback;
00132 }
00133
00134 void *osync_message_get_handler_data(OSyncMessage *message)
00135 {
00136 osync_assert(message);
00137 return message->user_data;
00138 }
00139
00140 OSyncMessage *osync_message_new_reply(OSyncMessage *message, OSyncError **error)
00141 {
00142 OSyncMessage *reply = osync_message_new(OSYNC_MESSAGE_REPLY, 0, error);
00143 if (!reply)
00144 return NULL;
00145
00146 reply->id = message->id;
00147 return reply;
00148 }
00149
00150 OSyncMessage *osync_message_new_errorreply(OSyncMessage *message, OSyncError *error, OSyncError **loc_error)
00151 {
00152 OSyncMessage *reply = osync_message_new(OSYNC_MESSAGE_ERRORREPLY, 0, loc_error);
00153 if (!reply)
00154 return NULL;
00155
00156 osync_marshal_error(reply, error);
00157
00158 if (message)
00159 reply->id = message->id;
00160 return reply;
00161 }
00162
00163 OSyncMessage *osync_message_new_error(OSyncError *error, OSyncError **loc_error)
00164 {
00165 OSyncMessage *message = osync_message_new(OSYNC_MESSAGE_ERROR, 0, loc_error);
00166 if (!message)
00167 return NULL;
00168
00169 osync_marshal_error(message, error);
00170
00171 return message;
00172 }
00173
00174 OSyncMessage *osync_message_new_queue_error(OSyncError *error, OSyncError **loc_error)
00175 {
00176 OSyncMessage *message = osync_message_new(OSYNC_MESSAGE_QUEUE_ERROR, 0, loc_error);
00177 if (!message)
00178 return NULL;
00179
00180 osync_marshal_error(message, error);
00181
00182 return message;
00183 }
00184
00185 osync_bool osync_message_is_error(OSyncMessage *message)
00186 {
00187 if (message->cmd == OSYNC_MESSAGE_ERRORREPLY)
00188 return TRUE;
00189 return FALSE;
00190 }
00191
00192 osync_bool osync_message_is_answered(OSyncMessage *message)
00193 {
00194 return message->is_answered;
00195 }
00196
00197 void osync_message_set_answered(OSyncMessage *message)
00198 {
00199 message->is_answered = TRUE;
00200 }
00201
00202 OSyncMessageCommand osync_message_get_command(OSyncMessage *message)
00203 {
00204 g_assert(message);
00205 return message->cmd;
00206 }
00207
00208 void osync_message_write_int(OSyncMessage *message, int value)
00209 {
00210 osync_marshal_write_int(message->marshal, value);
00211 }
00212
00213 void osync_message_write_uint(OSyncMessage *message, unsigned int value)
00214 {
00215 osync_marshal_write_uint(message->marshal, value);
00216 }
00217
00218 void osync_message_write_long_long_int(OSyncMessage *message, long long int value)
00219 {
00220 osync_marshal_write_long_long_int(message->marshal, value);
00221 }
00222
00223 void osync_message_write_string(OSyncMessage *message, const char *value)
00224 {
00225 osync_marshal_write_string(message->marshal, value);
00226 }
00227
00228 void osync_message_write_data(OSyncMessage *message, const void *value, int size)
00229 {
00230 osync_marshal_write_data(message->marshal, value, size);
00231 }
00232
00233 void osync_message_write_buffer(OSyncMessage *message, const void *value, int size)
00234 {
00235 osync_marshal_write_buffer(message->marshal, value, size);
00236 }
00237
00238 void osync_message_read_int(OSyncMessage *message, int *value)
00239 {
00240 osync_marshal_read_int(message->marshal, value);
00241 }
00242
00243 void osync_message_read_uint(OSyncMessage *message, unsigned int *value)
00244 {
00245 osync_marshal_read_uint(message->marshal, value);
00246 }
00247
00248 void osync_message_read_long_long_int(OSyncMessage *message, long long int *value)
00249 {
00250 osync_marshal_read_long_long_int(message->marshal, value);
00251 }
00252
00253
00254 void osync_message_read_const_string(OSyncMessage *message, char **value)
00255 {
00256 osync_marshal_read_const_string(message->marshal, value);
00257 }
00258
00259 void osync_message_read_string(OSyncMessage *message, char **value)
00260 {
00261 osync_marshal_read_string(message->marshal, value);
00262 }
00263
00264 void osync_message_read_const_data(OSyncMessage *message, void **value, int size)
00265 {
00266 osync_marshal_read_const_data(message->marshal, value, size);
00267 }
00268
00269 void osync_message_read_data(OSyncMessage *message, void *value, int size)
00270 {
00271 osync_marshal_read_data(message->marshal, value, size);
00272 }
00273
00274 void osync_message_read_buffer(OSyncMessage *message, void **value, int *size)
00275 {
00276 osync_marshal_read_buffer(message->marshal, value, size);
00277 }
00278
00279 char* osync_message_get_commandstr(OSyncMessage *message)
00280 {
00281 char* cmdstr = "UNKNOWN";
00282
00283 switch(message->cmd)
00284 {
00285 case OSYNC_MESSAGE_NOOP:
00286 cmdstr = "OSYNC_MESSAGE_NOOP"; break;
00287 case OSYNC_MESSAGE_CONNECT:
00288 cmdstr = "OSYNC_MESSAGE_CONNECT"; break;
00289 case OSYNC_MESSAGE_CONNECT_DONE:
00290 cmdstr = "OSYNC_MESSAGE_CONNECT_DONE"; break;
00291 case OSYNC_MESSAGE_DISCONNECT:
00292 cmdstr = "OSYNC_MESSAGE_DISCONNECT"; break;
00293 case OSYNC_MESSAGE_GET_CHANGES:
00294 cmdstr = "OSYNC_MESSAGE_GET_CHANGES"; break;
00295 case OSYNC_MESSAGE_READ_CHANGE:
00296 cmdstr = "OSYNC_MESSAGE_READ_CHANGE"; break;
00297 case OSYNC_MESSAGE_COMMIT_CHANGE:
00298 cmdstr = "OSYNC_MESSAGE_COMMIT_CHANGE"; break;
00299 case OSYNC_MESSAGE_COMMITTED_ALL:
00300 cmdstr = "OSYNC_MESSAGE_COMMITTED_ALL"; break;
00301 case OSYNC_MESSAGE_SYNC_DONE:
00302 cmdstr = "OSYNC_MESSAGE_SYNC_DONE"; break;
00303 case OSYNC_MESSAGE_CALL_PLUGIN:
00304 cmdstr = "OSYNC_MESSAGE_CALL_PLUGIN"; break;
00305 case OSYNC_MESSAGE_NEW_CHANGE:
00306 cmdstr = "OSYNC_MESSAGE_NEW_CHANGE"; break;
00307 case OSYNC_MESSAGE_REPLY:
00308 cmdstr = "OSYNC_MESSAGE_REPLY"; break;
00309 case OSYNC_MESSAGE_ERRORREPLY:
00310 cmdstr = "OSYNC_MESSAGE_ERRORREPLY"; break;
00311 case OSYNC_MESSAGE_INITIALIZE:
00312 cmdstr = "OSYNC_MESSAGE_INITIALIZE"; break;
00313 case OSYNC_MESSAGE_FINALIZE:
00314 cmdstr = "OSYNC_MESSAGE_FINALIZE"; break;
00315 case OSYNC_MESSAGE_DISCOVER:
00316 cmdstr = "OSYNC_MESSAGE_DISCOVER"; break;
00317 case OSYNC_MESSAGE_SYNCHRONIZE:
00318 cmdstr = "OSYNC_MESSAGE_SYNCHRONIZE"; break;
00319 case OSYNC_MESSAGE_ENGINE_CHANGED:
00320 cmdstr = "OSYNC_MESSAGE_ENGINE_CHANGED"; break;
00321 case OSYNC_MESSAGE_MAPPING_CHANGED:
00322 cmdstr = "OSYNC_MESSAGE_MAPPING_CHANGED"; break;
00323 case OSYNC_MESSAGE_MAPPINGENTRY_CHANGED:
00324 cmdstr = "OSYNC_MESSAGE_MAPPINGENTRY_CHANGED"; break;
00325 case OSYNC_MESSAGE_ERROR:
00326 cmdstr = "OSYNC_MESSAGE_ERROR"; break;
00327 case OSYNC_MESSAGE_QUEUE_ERROR:
00328 cmdstr = "OSYNC_MESSAGE_QUEUE_ERROR"; break;
00329 case OSYNC_MESSAGE_QUEUE_HUP:
00330 cmdstr = "OSYNC_MESSAGE_QUEUE_HUP"; break;
00331 }
00332
00333 return cmdstr;
00334 }
00335