462b43c864601acbb72ee1f4a3e7045c805bcf8b
[profile/ivi/gsignond.git] / src / common / gsignond-error.c
1 /* vi: set et sw=4 ts=4 cino=t0,(0: */
2 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 /*
4  * This file is part of gsignond
5  *
6  * Copyright (C) 2012 Intel Corporation.
7  *
8  * Contact: Imran Zaman <imran.zaman@linux.intel.com>
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
23  * 02110-1301 USA
24  */
25
26 #include "gsignond/gsignond-error.h"
27 #include <string.h>
28 #include <gio/gio.h>
29
30 #define _ERROR_PREFIX "com.google.code.AccountsSSO.gSingleSignOn.Error"
31
32 GDBusErrorEntry _gsignond_errors[] = 
33 {
34     {GSIGNOND_ERROR_UNKNOWN, _ERROR_PREFIX".Unknown"},
35     {GSIGNOND_ERROR_INTERNAL_SERVER, _ERROR_PREFIX".InternalServerError"},
36     {GSIGNOND_ERROR_INTERNAL_COMMUNICATION, _ERROR_PREFIX".InternalCommunicationError"},
37     {GSIGNOND_ERROR_PERMISSION_DENIED, _ERROR_PREFIX".PermissionDenied"},
38     {GSIGNOND_ERROR_ENCRYPTION_FAILURE, _ERROR_PREFIX".EncryptionFailure"},
39
40     {GSIGNOND_ERROR_METHOD_NOT_KNOWN, _ERROR_PREFIX".MethodNotKnown"},
41     {GSIGNOND_ERROR_SERVICE_NOT_AVAILABLE, _ERROR_PREFIX".ServiceNotAvailable"},
42     {GSIGNOND_ERROR_INVALID_QUERY, _ERROR_PREFIX".InvalidQuery"},
43
44     {GSIGNOND_ERROR_METHOD_NOT_AVAILABLE, _ERROR_PREFIX".MethodNotAvailable"},
45     {GSIGNOND_ERROR_IDENTITY_NOT_FOUND, _ERROR_PREFIX".IdentityNotFound"},
46     {GSIGNOND_ERROR_STORE_FAILED, _ERROR_PREFIX".IdentityStoreFailed"},
47     {GSIGNOND_ERROR_REMOVE_FAILED, _ERROR_PREFIX".IdentityRemoveFailed"},
48     {GSIGNOND_ERROR_SIGN_OUT_FAILED, _ERROR_PREFIX".SignOutFailed"},
49     {GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, _ERROR_PREFIX".OperationCancled"},
50     {GSIGNOND_ERROR_CREDENTIALS_NOT_AVAILABLE, _ERROR_PREFIX".CredentialsNotAvailable"},
51     {GSIGNOND_ERROR_REFERENCE_NOT_FOUND, _ERROR_PREFIX".ReferenceNotFound"},
52
53     {GSIGNOND_ERROR_MECHANISM_NOT_AVAILABLE, _ERROR_PREFIX".MechanismNotAvailable"},
54     {GSIGNOND_ERROR_MISSING_DATA, _ERROR_PREFIX".MissingData"},
55     {GSIGNOND_ERROR_INVALID_CREDENTIALS, _ERROR_PREFIX".InvalidCredentials"},
56     {GSIGNOND_ERROR_NOT_AUTHORIZED, _ERROR_PREFIX".NotAutherized"},
57     {GSIGNOND_ERROR_WRONG_STATE, _ERROR_PREFIX".WrongState"},
58     {GSIGNOND_ERROR_OPERATION_NOT_SUPPORTED, _ERROR_PREFIX".OperationNotSupported"},
59     {GSIGNOND_ERROR_NO_CONNECTION, _ERROR_PREFIX".NoConnection"},
60     {GSIGNOND_ERROR_NETWORK, _ERROR_PREFIX".NoNetwork"},
61     {GSIGNOND_ERROR_SSL, _ERROR_PREFIX".SSLError"},
62     {GSIGNOND_ERROR_RUNTIME, _ERROR_PREFIX".RuntimeError"},
63     {GSIGNOND_ERROR_SESSION_CANCELED, _ERROR_PREFIX".Cancled"},
64     {GSIGNOND_ERROR_TIMED_OUT, _ERROR_PREFIX".TimedOut"},
65     {GSIGNOND_ERROR_USER_INTERACTION, _ERROR_PREFIX".UserInteractionFailed"},
66     {GSIGNOND_ERROR_OPERATION_FAILED, _ERROR_PREFIX".OperationFailed"},
67     {GSIGNOND_ERROR_ENCRYPTION_FAILED, _ERROR_PREFIX".EncryptionFailed"},
68     {GSIGNOND_ERROR_TOS_NOT_ACCEPTED, _ERROR_PREFIX".TOSNotAccepted"},
69
70     {GSIGNOND_ERROR_FORGOT_PASSWORD, _ERROR_PREFIX".ForgotPassword"},
71     {GSIGNOND_ERROR_METHOD_OR_MECHANISM_NOT_ALLOWED, _ERROR_PREFIX".MethodOrMechanismNotAllowed"},
72     {GSIGNOND_ERROR_INCORRECT_DATE, _ERROR_PREFIX".IncorrectDate"},
73 } ;
74
75 GQuark
76 gsignond_error_quark (void)
77 {
78     static volatile gsize quark_volatile = 0;
79
80     g_dbus_error_register_error_domain (GSIGNOND_ERROR_DOMAIN,
81                                         &quark_volatile,
82                                         _gsignond_errors,
83                                         G_N_ELEMENTS (_gsignond_errors));
84
85     return (GQuark) quark_volatile;
86 }
87
88 GString*
89 gsignond_concat_domain_and_error (
90         const gchar *str1,
91         const gchar *str2)
92 {
93     GString *str = NULL;
94     g_return_val_if_fail (str1 != NULL && str2 != NULL, NULL);
95     str = g_string_sized_new (strlen(str1)+strlen(str2)-1);
96     g_string_printf (str,"[%s].%s\n",str1,str2);
97     return str;
98 }
99
100 GString*
101 gsignond_prepend_domain_to_error_msg (const GError *err)
102 {
103     GString *msg = NULL;
104     const gchar *domain = NULL;
105     g_return_val_if_fail (err != NULL, NULL);
106     if (err->message != NULL) {
107         domain = g_quark_to_string(err->domain);
108         msg = gsignond_concat_domain_and_error(domain, err->message);
109     }
110     return msg;
111 }
112
113 /**
114  * gsignond_error_new_from_variant:
115  * @var: instance of #GVariant
116  *
117  * Converts the GVariant to GError.
118  *
119  * Returns: (transfer full) #GError object if successful, NULL otherwise.
120  */
121 GError *
122 gsignond_error_new_from_variant (
123         GVariant *var)
124 {
125     GError *error = NULL;
126     gchar *message;
127     GQuark domain;
128     gint code;
129
130     if (!var) {
131         return NULL;
132     }
133
134     g_variant_get (var, "(uis)", &domain, &code, &message);
135     error = g_error_new_literal (domain, code, message);
136     g_free (message);
137     return error;
138 }
139
140 /**
141  * gsignond_error_to_variant:
142  * @error: instance of #GError
143  *
144  * Converts the GError to GVariant.
145  *
146  * Returns: (transfer full) #GVariant object if successful, NULL otherwise.
147  */
148 GVariant *
149 gsignond_error_to_variant (
150         GError *error)
151 {
152     if (!error) {
153         return NULL;
154     }
155
156     return g_variant_new ("(uis)", error->domain, error->code, error->message);
157 }
158