1 /******************************************************************************
4 * Company XS Embedded GmbH
5 *****************************************************************************/
6 /******************************************************************************
7 * This Source Code Form is subject to the terms of the
8 * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
9 * with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 ******************************************************************************/
12 * @file persistence_client_library_pas_interface.c
13 * @ingroup Persistence client library
14 * @author Ingo Huerner
15 * @brief Implementation of the persistence client library persistence
16 * administration service interface.
20 #include "persistence_client_library_pas_interface.h"
21 #include "persistence_client_library_dbus_service.h"
23 #include "../include_protected/persistence_client_library_data_organization.h"
29 static int gTimeoutMs = 500;
31 /// flag if access is locked
32 static int gLockAccess = 0;
35 int pers_data_sync(void)
37 return 1; // TODO implement sync data back
40 void pers_lock_access(void)
42 __sync_fetch_and_add(&gLockAccess,1);
45 void pers_unlock_access(void)
47 __sync_fetch_and_sub(&gLockAccess,1);
50 int isAccessLocked(void)
56 int check_pas_request(unsigned int request, unsigned int requestID)
62 case (PasMsg_Block|PasMsg_WriteBack):
64 // add command and data to queue
65 unsigned long cmd = ( (requestID << 8) | CMD_PAS_BLOCK_AND_WRITE_BACK);
67 if(sizeof(int)!=write(gPipefds[1], &cmd, sizeof(unsigned long)))
69 printf("write failed w/ errno %d\n", errno);
70 rval = PasErrorStatus_FAIL;
74 rval = PasErrorStatus_RespPend;
81 rval = PasErrorStatus_OK;
86 rval = PasErrorStatus_FAIL;
97 DBusHandlerResult msg_persAdminRequest(DBusConnection *connection, DBusMessage *message)
99 int request = 0, requestID = 0;
104 dbus_error_init (&error);
107 if (!dbus_message_get_args (message, &error, DBUS_TYPE_INT32 , &request,
108 DBUS_TYPE_INT32 , &requestID,
111 reply = dbus_message_new_error(message, error.name, error.message);
115 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
116 printf("DBus No memory\n");
119 if (!dbus_connection_send(connection, reply, 0))
121 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
122 printf("DBus No memory\n");
125 dbus_message_unref (reply);
127 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
129 errorReturn = check_pas_request(request, requestID);
131 reply = dbus_message_new_method_return(message);
135 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
136 printf("DBus No memory\n");
139 if (!dbus_message_append_args(reply, DBUS_TYPE_INT32, &errorReturn, DBUS_TYPE_INVALID))
141 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
142 printf("DBus No memory\n");
145 if (!dbus_connection_send(connection, reply, 0))
147 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
148 printf("DBus No memory\n");
151 dbus_connection_flush(connection);
152 dbus_message_unref(reply);
154 return DBUS_HANDLER_RESULT_HANDLED;
157 int signal_persModeChange(DBusConnection *connection, DBusMessage *message)
159 int persistenceMode = 0;
164 dbus_error_init (&error);
166 if (!dbus_message_get_args (message, &error, DBUS_TYPE_INT32 , &persistenceMode,
169 reply = dbus_message_new_error(message, error.name, error.message);
173 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
174 printf("DBus No memory\n");
177 if (!dbus_connection_send(connection, reply, 0))
179 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
180 printf("DBus No memory\n");
183 dbus_message_unref (reply);
185 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
188 reply = dbus_message_new_method_return(message);
192 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
193 printf("DBus No memory\n");
196 if (!dbus_message_append_args(reply, DBUS_TYPE_INT32, &errorCode, DBUS_TYPE_INVALID))
198 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
199 printf("DBus No memory\n");
202 if (!dbus_connection_send(connection, reply, 0))
204 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
205 printf("DBus No memory\n");
208 dbus_connection_flush(connection);
209 dbus_message_unref(reply);
211 return DBUS_HANDLER_RESULT_HANDLED;
215 DBusHandlerResult checkPersAdminSignal(DBusConnection *connection, DBusMessage *message, void *user_data)
217 DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
219 printf("checkPersAdminSignalInterface '%s' -> '%s'\n", dbus_message_get_interface(message), dbus_message_get_member(message));
221 if((0==strcmp("org.genivi.persistence.admin", dbus_message_get_interface(message))))
223 if(dbus_message_get_type(message) == DBUS_MESSAGE_TYPE_SIGNAL)
225 printf("checkPersAdminSignal signal\n");
226 if((0==strcmp("PersistenceModeChanged", dbus_message_get_member(message))))
228 printf("checkPersAdminSignal signal\n");
229 // to do handle signal
230 result = signal_persModeChange(connection, message);
234 printf("checkPersAdminMsg -> unknown signal '%s'\n", dbus_message_get_interface(message));
244 DBusHandlerResult checkPersAdminMsg(DBusConnection * connection, DBusMessage * message, void * user_data)
246 DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
248 //printf("checkPersAdminMsg '%s' -> '%s'\n", dbus_message_get_interface(message), dbus_message_get_member(message));
249 if((0==strcmp("org.genivi.persistence.adminconsumer", dbus_message_get_interface(message))))
251 if((0==strcmp("PersistenceAdminRequest", dbus_message_get_member(message))))
253 result = msg_persAdminRequest(connection, message);
257 printf("checkPersAdminMsg -> unknown message '%s'\n", dbus_message_get_interface(message));
265 int send_pas_register(const char* method, int notificationFlag)
270 dbus_error_init (&error);
271 DBusMessage *replyMsg = NULL;
272 DBusConnection* conn = get_dbus_connection();
274 const char* objName = "/org/genivi/persistence/adminconsumer";
275 const char* busName = dbus_bus_get_unique_name(conn);
277 DBusMessage* message = dbus_message_new_method_call("org.genivi.persistence.admin", // destination
278 "/org/genivi/persistence/admin", // path
279 "org.genivi.persistence.admin", // interface
284 dbus_message_append_args(message, DBUS_TYPE_STRING, &busName, // bus name
285 DBUS_TYPE_STRING, &objName,
286 DBUS_TYPE_INT32, ¬ificationFlag,
287 DBUS_TYPE_UINT32, &gTimeoutMs,
292 replyMsg = dbus_connection_send_with_reply_and_block(conn, message, gTimeoutMs, &error);
293 if(dbus_set_error_from_message(&error, replyMsg))
295 fprintf(stderr, "sendDBusMessage ==> Access denied: %s \n", error.message);
299 dbus_message_get_args(replyMsg, &error, DBUS_TYPE_INT32, &rval, DBUS_TYPE_INVALID);
302 dbus_message_unref(message);
306 fprintf(stderr, "send_pers_admin_service ==> ERROR: Invalid connection!! \n");
309 dbus_message_unref(message);
313 fprintf(stderr, "send_pers_admin_service ==> ERROR: Invalid message!! \n");
322 int send_pas_request(const char* method, unsigned int requestID, int status)
324 int rval = 0, errorCode = 0;
327 dbus_error_init (&error);
328 DBusMessage *replyMsg = NULL;
329 DBusConnection* conn = get_dbus_connection();
331 DBusMessage* message = dbus_message_new_method_call("org.genivi.persistence.admin", // destination
332 "/org/genivi/persistence/admin", // path
333 "org.genivi.persistence.admin", // interface
337 dbus_message_append_args(message, DBUS_TYPE_UINT32, &requestID,
338 DBUS_TYPE_INT32, &status,
339 DBUS_TYPE_INT32, &errorCode,
344 replyMsg = dbus_connection_send_with_reply_and_block(conn, message, gTimeoutMs, &error);
345 if(dbus_set_error_from_message(&error, replyMsg))
347 fprintf(stderr, "sendDBusMessage ==> Access denied: %s \n", error.message);
351 dbus_message_get_args(replyMsg, &error, DBUS_TYPE_INT32, &rval, DBUS_TYPE_INVALID);
354 dbus_message_unref(message);
358 fprintf(stderr, "send_pers_admin_service ==> ERROR: Invalid connection!! \n");
361 dbus_message_unref(message);
365 fprintf(stderr, "send_pers_admin_service ==> ERROR: Invalid message!! \n");
374 int register_pers_admin_service(void)
376 // register for everything
377 int notificationFlag = PasMsg_Block | PasMsg_WriteBack | PasMsg_Unblock;
379 return send_pas_register("RegisterPersAdminNotification", notificationFlag);
384 int unregister_pers_admin_service(void)
386 // register for everything
387 int notificationFlag = PasMsg_Block | PasMsg_WriteBack | PasMsg_Unblock;
389 return send_pas_register("UnRegisterPersAdminNotification", notificationFlag);
394 int pers_admin_service_data_sync_complete(unsigned int requestID)
396 return send_pas_request("PersistenceAdminRequestCompleted", requestID, 1);
401 void process_block_and_write_data_back(unsigned int requestID)
403 // lock persistence data access
405 // sync data back to memory device
407 // send complete notification
408 pers_admin_service_data_sync_complete(requestID);