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 "opensync_error_private.h"
00025
00026 static const char *osync_error_name_from_type(OSyncErrorType type)
00027 {
00028 switch (type) {
00029 case OSYNC_NO_ERROR:
00030 return "NoError";
00031 case OSYNC_ERROR_GENERIC:
00032 return "UnknownError";
00033 case OSYNC_ERROR_IO_ERROR:
00034 return "IOError";
00035 case OSYNC_ERROR_NOT_SUPPORTED:
00036 return "NotSupported";
00037 case OSYNC_ERROR_TIMEOUT:
00038 return "Timeout";
00039 case OSYNC_ERROR_DISCONNECTED:
00040 return "Disconnected";
00041 case OSYNC_ERROR_FILE_NOT_FOUND:
00042 return "FileNotFound";
00043 default:
00044 return "UnspecifiedError";
00045 }
00046 }
00047
00048 void osync_error_set_vargs(OSyncError **error, OSyncErrorType type, const char *format, va_list args)
00049 {
00050 osync_return_if_fail(error);
00051 osync_return_if_fail(osync_error_is_set(error) == FALSE);
00052 osync_return_if_fail(format);
00053
00054 *error = g_malloc0(sizeof(OSyncError));
00055 (*error)->message = g_strdup_vprintf(format, args);
00056 (*error)->type = type;
00057 (*error)->ref_count = 1;
00058
00059 osync_trace(TRACE_ERROR, "%s", (*error)->message);
00060
00061 return;
00062 }
00063
00064 const char *osync_error_get_name(OSyncError **error)
00065 {
00066 osync_return_val_if_fail(error != NULL, NULL);
00067 if (!*error)
00068 return osync_error_name_from_type(OSYNC_NO_ERROR);
00069 return osync_error_name_from_type((*error)->type);
00070 }
00071
00072 OSyncError **osync_error_ref(OSyncError **error)
00073 {
00074 if (!osync_error_is_set(error))
00075 return error;
00076
00077 g_atomic_int_inc(&(*error)->ref_count);
00078
00079 return error;
00080 }
00081
00082 void osync_error_unref(OSyncError **error)
00083 {
00084 if (!osync_error_is_set(error))
00085 return;
00086
00087 if (g_atomic_int_dec_and_test(&(*error)->ref_count)) {
00088 if ((*error)->message)
00089 g_free ((*error)->message);
00090
00091 if ((*error)->child)
00092 osync_error_unref(&((*error)->child));
00093
00094 g_free(*error);
00095 }
00096
00097 *error = NULL;
00098 }
00099
00100 osync_bool osync_error_is_set (OSyncError **error)
00101 {
00102 if (!error)
00103 return FALSE;
00104
00105 if (*error == NULL)
00106 return FALSE;
00107
00108 if ((*error)->type)
00109 return TRUE;
00110
00111 return FALSE;
00112 }
00113
00114 OSyncErrorType osync_error_get_type(OSyncError **error)
00115 {
00116 if (!osync_error_is_set(error))
00117 return OSYNC_NO_ERROR;
00118 return (*error)->type;
00119 }
00120
00121 const char *osync_error_print(OSyncError **error)
00122 {
00123 if (!osync_error_is_set(error))
00124 return NULL;
00125 return (*error)->message;
00126 }
00127
00128 char *osync_error_print_stack(OSyncError **error)
00129 {
00130 char *submessage = NULL;
00131 char *message = NULL;
00132 if (!osync_error_is_set(error))
00133 return NULL;
00134
00135 if ((*error)->child)
00136 submessage = osync_error_print_stack(&((*error)->child));
00137
00138 if (submessage) {
00139 message = g_strdup_printf("NEXT ERROR: \"%s\"; %s", (*error)->message, submessage);
00140 g_free(submessage);
00141 } else
00142 message = g_strdup_printf("ROOT CAUSE: \"%s\"", (*error)->message);
00143
00144 return message;
00145 }
00146
00147 void osync_error_set_from_error(OSyncError **target, OSyncError **source)
00148 {
00149 if (!target || osync_error_is_set(target))
00150 return;
00151
00152 if (!osync_error_is_set(source)) {
00153 *target = NULL;
00154 return;
00155 }
00156
00157 *target = *source;
00158 osync_error_ref(target);
00159 }
00160
00161 void osync_error_set(OSyncError **error, OSyncErrorType type, const char *format, ...)
00162 {
00163 va_list args;
00164 va_start(args, format);
00165 osync_error_set_vargs(error, type, format, args);
00166 va_end (args);
00167 }
00168
00169 void osync_error_stack(OSyncError **parent, OSyncError **child)
00170 {
00171 if (!parent || !*parent)
00172 return;
00173
00174 if (!child || !*child)
00175 return;
00176
00177
00178 if (*parent == *child)
00179 return;
00180
00181 if ((*parent)->child)
00182 osync_error_unref(&((*parent)->child));
00183
00184 (*parent)->child = *child;
00185 osync_error_ref(child);
00186 }
00187
00188 OSyncError *osync_error_get_child(OSyncError **parent)
00189 {
00190 if (!parent || !*parent)
00191 return NULL;
00192
00193 return (*parent)->child;
00194 }
00195
00196 void osync_error_set_type(OSyncError **error, OSyncErrorType type)
00197 {
00198 if (!error)
00199 return;
00200
00201 (*error)->type = type;
00202 return;
00203 }
00204