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_lc_interface.c
13 * @ingroup Persistence client library
14 * @author Ingo Huerner
15 * @brief Implementation of the persistence client library lifecycle interface.
20 #include "persistence_client_library_lc_interface.h"
22 #include "../include_protected/persistence_client_library_data_organization.h"
23 #include "../include_protected/persistence_client_library_db_access.h"
25 #include "persistence_client_library_handle.h"
26 #include "persistence_client_library_pas_interface.h"
27 #include "persistence_client_library_dbus_service.h"
28 #include "persistence_client_library_custom_loader.h"
29 #include "persistence_client_library_prct_access.h"
30 #include "persistence_client_library_itzam_errors.h"
38 static int gTimeoutMs = 500;
40 int check_lc_request(int request, int requestID)
46 case NsmShutdownNormal:
49 // add command and data to queue
50 cmd = ( ((uint64_t)requestID << 32) | ((uint64_t)request << 16) | CMD_LC_PREPARE_SHUTDOWN);
52 if(-1 == write(gEfds, &cmd, (sizeof(uint64_t))))
54 printf("write failed w/ errno %d\n", errno);
55 rval = NsmErrorStatus_Fail;
59 rval = NsmErrorStatus_OK;
65 printf("Unknown lifecycle message!\n");
74 int msg_lifecycleRequest(DBusConnection *connection, DBusMessage *message)
82 dbus_error_init (&error);
84 if (!dbus_message_get_args (message, &error, DBUS_TYPE_UINT32, &request,
85 DBUS_TYPE_UINT32, &requestID,
88 reply = dbus_message_new_error(message, error.name, error.message);
92 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
93 printf("DBus No memory\n");
96 if (!dbus_connection_send(connection, reply, 0))
98 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
99 printf("DBus No memory\n");
102 dbus_message_unref (reply);
104 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
107 msgReturn = check_lc_request(request, requestID);
109 reply = dbus_message_new_method_return(message);
113 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
114 printf("DBus No memory\n");
117 if (!dbus_message_append_args(reply, DBUS_TYPE_INT32, &msgReturn, DBUS_TYPE_INVALID))
119 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
120 printf("DBus No memory\n");
123 if (!dbus_connection_send(connection, reply, 0))
125 //DLT_LOG(mgrContext, DLT_LOG_ERROR, DLT_STRING("DBus No memory"));
126 printf("DBus No memory\n");
129 dbus_connection_flush(connection);
130 dbus_message_unref(reply);
132 return DBUS_HANDLER_RESULT_HANDLED;
138 DBusHandlerResult checkLifecycleMsg(DBusConnection * connection, DBusMessage * message, void * user_data)
140 DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
142 //printf("handleObjectPathMessage '%s' -> '%s'\n", dbus_message_get_interface(message), dbus_message_get_member(message));
143 if((0==strncmp("org.genivi.NodeStateManager.LifeCycleConsumer", dbus_message_get_interface(message), 20)))
145 if((0==strncmp("LifecycleRequest", dbus_message_get_member(message), 18)))
147 result = msg_lifecycleRequest(connection, message);
151 printf("checkLifecycleMsg -> unknown message '%s'\n", dbus_message_get_interface(message));
159 int send_lifecycle_register(const char* method, int shutdownMode)
164 dbus_error_init (&error);
165 DBusConnection* conn = get_dbus_connection();
167 const char* objName = "/org/genivi/NodeStateManager/LifeCycleConsumer";
168 const char* busName = dbus_bus_get_unique_name(conn);
170 DBusMessage* message = dbus_message_new_method_call("org.genivi.NodeStateManager.Consumer", // destination
171 "/org/genivi/NodeStateManager/Consumer", // path
172 "org.genivi.NodeStateManager.Consumer", // interface
176 dbus_message_append_args(message, DBUS_TYPE_STRING, &busName,
177 DBUS_TYPE_STRING, &objName,
178 DBUS_TYPE_INT32, &shutdownMode,
179 DBUS_TYPE_INT32, &gTimeoutMs,
184 if(!dbus_connection_send(conn, message, 0))
186 fprintf(stderr, "send_lifecycle ==> Access denied: %s \n", error.message);
189 dbus_connection_flush(conn);
193 fprintf(stderr, "send_lifecycle ==> ERROR: Invalid connection!! \n");
195 dbus_message_unref(message);
199 fprintf(stderr, "send_lifecycle ==> ERROR: Invalid message!! \n");
207 int send_lifecycle_request(const char* method, int requestId, int status)
212 dbus_error_init (&error);
214 DBusConnection* conn = get_dbus_connection();
216 DBusMessage* message = dbus_message_new_method_call("org.genivi.NodeStateManager.Consumer", // destination
217 "/org/genivi/NodeStateManager/Consumer", // path
218 "org.genivi.NodeStateManager.Consumer", // interface
222 dbus_message_append_args(message, DBUS_TYPE_INT32, &requestId,
223 DBUS_TYPE_INT32, &status,
228 if(!dbus_connection_send(conn, message, 0))
230 fprintf(stderr, "send_lifecycle ==> Access denied: %s \n", error.message);
233 dbus_connection_flush(conn);
237 fprintf(stderr, "send_lifecycle ==> ERROR: Invalid connection!! \n");
239 dbus_message_unref(message);
243 fprintf(stderr, "send_lifecycle ==> ERROR: Invalid message!! \n");
251 int register_lifecycle()
253 int shutdownMode = 1; // TODO send correct mode
255 return send_lifecycle_register("RegisterShutdownClient", shutdownMode);
260 int unregister_lifecycle()
262 int shutdownMode = 1; // TODO send correct mode
264 return send_lifecycle_register("UnRegisterShutdownClient", shutdownMode);
268 int send_prepare_shutdown_complete(int requestId, int status)
270 return send_lifecycle_request("LifecycleRequestComplete", requestId, status);
276 void process_prepare_shutdown(unsigned char requestId, unsigned int status)
279 //GvdbTable* resourceTable = NULL;
280 itzam_btree* resourceTable = NULL;
281 itzam_state state = ITZAM_FAILED;
286 // flush open files to disk
287 for(i=0; i<MaxPersHandle; i++)
290 if(gOpenFdArray[tmp] == FileOpen)
297 // close open gvdb persistence resource configuration table
298 for(i=0; i< PrctDbTableSize; i++)
300 resourceTable = get_resource_cfg_table_by_idx(i);
301 // dereference opend database
302 if(resourceTable != NULL)
304 state = itzam_btree_close(resourceTable);
305 if (state != ITZAM_OKAY)
307 fprintf(stderr, "\nOpen Itzam problem: %s\n", STATE_MESSAGES[state]);
312 //close opend database
316 // unload custom client libraries
317 for(i=0; i<get_num_custom_client_libs(); i++)
319 // deinitialize plugin
320 gPersCustomFuncs[i].custom_plugin_deinit();
321 // close library handle
322 dlclose(gPersCustomFuncs[i].handle);
325 // notify lifecycle shutdown OK
326 send_prepare_shutdown_complete((int)requestId, (int)status);