summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuy Sagnes <guy.sagnes@continental-corporation.com>2014-02-25 10:48:09 +0100
committerGuy Sagnes <guy.sagnes@continental-corporation.com>2014-02-25 12:00:15 +0100
commit07c6ef3793385b6237092910e5a585253e44c979 (patch)
treee8a49a4e054de83794ebea7b0ae7e271d5b772d7
downloadpersistence-administrator-07c6ef3793385b6237092910e5a585253e44c979.tar.gz
Added version 1.0.2
12.12.2013 * add missing licenses information update after review feedback 20131212 - J.Kowalski 03.12.2013 * Persistence Adminisitrator / OIP BL 0.9.130 08.08.2013 * Persistence: PersAdminTool: Install "custom" keys with correct storage Clean up & makefile adaptations for generated code Remark: Integration 0.9.95 16.07.2013 * Modifications: pers-service-version 1.0.2 - Add makefile to allow creation of auto-generated code - Add support for starting over systemd - Custom plugin's name has to be extracted from value for "storage" tag - Added persadmin_check_for_same_file_content to check for identical file content - minimal fixes 18.06.2013 * persistence-administration-service version 1.0.1 update Administrator, incl. test application pers_svc_test/ 07.06.2013 * reorg position of dbus xml definition 02.05.2013 * Update missing part: integration of the generation of the dbus files based on Makefile.am 30.04.2013 * Reworked version based on common part 25.04.2013 * initial repository creation. Signed-off-by: Guy Sagnes <guy.sagnes@continental-corporation.com>
-rw-r--r--.gitignore2
-rw-r--r--AUTHORS7
-rw-r--r--Administrator/Makefile.am102
-rw-r--r--Administrator/config/pas-daemon.service.in19
-rw-r--r--Administrator/dbus_config/org.genivi.persistence.admin_svc.conf14
-rw-r--r--Administrator/doc/AutoTools HowTo.docxbin0 -> 1152085 bytes
-rw-r--r--Administrator/generated/Makefile.am35
-rw-r--r--Administrator/inc/private/ssw_pers_admin_access_lib.h85
-rw-r--r--Administrator/inc/private/ssw_pers_admin_common.h96
-rw-r--r--Administrator/inc/private/ssw_pers_admin_config.h377
-rw-r--r--Administrator/inc/private/ssw_pers_admin_database_helper.h84
-rw-r--r--Administrator/inc/private/ssw_pers_admin_dbus.h68
-rw-r--r--Administrator/inc/private/ssw_pers_admin_files_helper.h192
-rw-r--r--Administrator/inc/private/ssw_pers_admin_pcl.h74
-rw-r--r--Administrator/inc/private/ssw_pers_admin_service.h150
-rw-r--r--Administrator/inc/public/persistence_admin_service.h209
-rw-r--r--Administrator/pkgconfig/libpersadminaccess.pc.in11
-rw-r--r--Administrator/src/ssw_pers_admin_access_lib.c1216
-rw-r--r--Administrator/src/ssw_pers_admin_backup.c1092
-rw-r--r--Administrator/src/ssw_pers_admin_common.c51
-rw-r--r--Administrator/src/ssw_pers_admin_config.c2055
-rw-r--r--Administrator/src/ssw_pers_admin_data_export.c68
-rw-r--r--Administrator/src/ssw_pers_admin_data_import.c133
-rw-r--r--Administrator/src/ssw_pers_admin_database_helper.c616
-rw-r--r--Administrator/src/ssw_pers_admin_dbus.c450
-rw-r--r--Administrator/src/ssw_pers_admin_files_helper.c1596
-rw-r--r--Administrator/src/ssw_pers_admin_pcl.c827
-rw-r--r--Administrator/src/ssw_pers_admin_recovery.c2012
-rw-r--r--Administrator/src/ssw_pers_admin_resource_config_add.c3905
-rw-r--r--Administrator/src/ssw_pers_admin_restore_default.c1610
-rw-r--r--Administrator/src/ssw_pers_admin_service.c1092
-rw-r--r--Administrator/src/ssw_pers_admin_user_delete_data.c451
-rw-r--r--COPYING373
-rw-r--r--ChangeLog0
-rw-r--r--INSTALL370
-rw-r--r--Makefile.am19
-rw-r--r--NEWS3
-rw-r--r--README25
-rw-r--r--autogen.sh19
-rw-r--r--configure.ac153
-rw-r--r--test/pers_svc_test/Makefile.am79
-rw-r--r--test/pers_svc_test/dbus_specifications/OIPModuleTestPASCodeGeneration.txt1
-rw-r--r--test/pers_svc_test/dbus_specifications/OIPModuleTestPASCodeGeneration.xml25
-rw-r--r--test/pers_svc_test/dbus_specifications/OIPModuleTestPASDBusCall.txt3
-rw-r--r--test/pers_svc_test/inc/test_PAS.h172
-rw-r--r--test/pers_svc_test/inc/test_pas_check_data_after_backup_application.h38
-rw-r--r--test/pers_svc_test/inc/test_pas_check_data_after_backup_create_all.h39
-rw-r--r--test/pers_svc_test/inc/test_pas_check_data_after_backup_user2_seat_all.h38
-rw-r--r--test/pers_svc_test/inc/test_pas_check_data_after_backup_user_all.h38
-rw-r--r--test/pers_svc_test/inc/test_pas_check_data_after_delete_user2_data.h39
-rw-r--r--test/pers_svc_test/inc/test_pas_check_data_after_reset.h41
-rw-r--r--test/pers_svc_test/inc/test_pas_data_backup_recovery.h131
-rw-r--r--test/pers_svc_test/inc/test_pas_data_import.h33
-rw-r--r--test/pers_svc_test/inc/test_pas_data_restore_default.h89
-rw-r--r--test/pers_svc_test/inc/test_pas_resource_config_add.h49
-rw-r--r--test/pers_svc_test/src/test_PAS.c1959
-rw-r--r--test/pers_svc_test/src/test_PAS_dbus.c233
-rw-r--r--test/pers_svc_test/src/test_pas_check_data_after_backup_application.c100
-rw-r--r--test/pers_svc_test/src/test_pas_check_data_after_backup_create_all.c195
-rw-r--r--test/pers_svc_test/src/test_pas_check_data_after_backup_user2_seat_all.c212
-rw-r--r--test/pers_svc_test/src/test_pas_check_data_after_backup_user_all.c212
-rw-r--r--test/pers_svc_test/src/test_pas_check_data_after_delete_user2_data.c226
-rw-r--r--test/pers_svc_test/src/test_pas_check_data_after_reset.c118
-rw-r--r--test/pers_svc_test/src/test_pas_import_all.c237
-rw-r--r--test/pers_svc_test/src/test_pas_import_app.c141
-rw-r--r--test/pers_svc_test/src/test_pas_import_source_content.c1011
-rw-r--r--test/pers_svc_test/src/test_pas_import_user.c170
-rw-r--r--test/pers_svc_test/src/test_pas_recovery_All.c319
-rw-r--r--test/pers_svc_test/src/test_pas_recovery_AllInitialContent.c568
-rw-r--r--test/pers_svc_test/src/test_pas_recovery_App1.c137
-rw-r--r--test/pers_svc_test/src/test_pas_recovery_App1InitialContent.c625
-rw-r--r--test/pers_svc_test/src/test_pas_recovery_User1.c139
-rw-r--r--test/pers_svc_test/src/test_pas_recovery_User1InitialContent.c617
-rw-r--r--test/pers_svc_test/src/test_pas_recovery_User2Seat1InitialContent.c620
-rw-r--r--test/pers_svc_test/src/test_pas_recovery_Users.c298
-rw-r--r--test/pers_svc_test/src/test_pas_recovery_backup_content.c886
-rw-r--r--test/pers_svc_test/src/test_pas_resource_config_add.c729
-rw-r--r--test/pers_svc_test/src/test_pas_restore_default_All.c350
-rw-r--r--test/pers_svc_test/src/test_pas_restore_default_App1.c351
-rw-r--r--test/pers_svc_test/src/test_pas_restore_default_User1.c253
-rw-r--r--test/pers_svc_test/src/test_pas_restore_default_User2App1.c253
-rw-r--r--test/pers_svc_test/src/test_pas_restore_default_User2Seat1.c253
-rw-r--r--test/pers_svc_test/webtool_export/resource2.tar.gzbin0 -> 4396 bytes
-rw-r--r--test/persadmin_tool/Makefile.am38
-rw-r--r--test/persadmin_tool/src/persadmin_tool.c407
85 files changed, 32133 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c3790b0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.cproject
+*.project
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..ca617a0
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,7 @@
+Ionut Ieremie <Ionut.Ieremie@continental-corporation.com>
+Guy Sagnes <Guy.Sagnes@continental-corporation.com>
+Petrica Manoila <Petrica.Manoila@continental-corporation.com>
+Ana-Maria Chisca <Ana.Chisca@continental-corporation.com>
+Liviu Ciocanta <Liviu.Ciocanta@continental-corporation.com>
+Alin Liteanu <Alin.Liteanu@continental-corporation.com>
+Marian Nestor <Marian.Nestor@continental-corporation.com>
diff --git a/Administrator/Makefile.am b/Administrator/Makefile.am
new file mode 100644
index 0000000..65831ab
--- /dev/null
+++ b/Administrator/Makefile.am
@@ -0,0 +1,102 @@
+#######################################################################################################################
+#
+# Copyright (C) 2012 Continental Automotive Systems, Inc.
+#
+# Author: Ana.Chisca@continental-corporation.com
+#
+# Makefile template for the Persistence Administration Service
+#
+# Process this file with automake to produce a Makefile.in.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#######################################################################################################################
+
+lib_LTLIBRARIES = libpers_admin_access_lib.la
+bin_PROGRAMS = pers_admin_svc
+
+#
+#
+# persistence administration access library.
+#
+#
+
+include_HEADERS= \
+ inc/public/persistence_admin_service.h
+
+libpers_admin_access_lib_la_CFLAGS = \
+ -I inc/private -I inc/public \
+ $(PERSCOMMON_CFLAGS)
+
+libpers_admin_access_lib_la_SOURCES = \
+ src/ssw_pers_admin_access_lib.c
+
+libpers_admin_access_lib_la_LDFLAGS = -version-info $(GENERIC_LIBRARY_VERSION)
+
+# pkgconfig
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = pkgconfig/libpersadminaccess.pc
+
+#
+#
+# persistence administration service.
+#
+#
+
+pers_admin_svc_CFLAGS = \
+ -I inc/private -I inc/public -I generated \
+ $(DLT_CFLAGS) \
+ $(GIO_CFLAGS) \
+ $(GIO_UNIX_CFLAGS) \
+ $(GLIB_CFLAGS) \
+ $(GOBJECT_CFLAGS) \
+ $(DBUS_CFLAGS) \
+ $(ARCHIVELIB_CFLAGS) \
+ $(ZLIB_CFLAGS) \
+ $(PERSCOMMON_CFLAGS) \
+ $(JSON_CFLAGS) \
+ $(NSM_CFLAGS) \
+ $(SYSTEMD_CFLAGS)
+
+pers_admin_svc_LDFLAGS = \
+ $(PLATFORM_LDFLAGS)
+
+pers_admin_svc_LDADD = \
+ $(DLT_LIBS) \
+ $(GIO_LIBS) \
+ $(GIO_UNIX_LIBS) \
+ $(GLIB_LIBS) \
+ $(DBUS_LIBS) \
+ $(GOBJECT_LIBS) \
+ $(ARCHIVELIB_LIBS) \
+ $(ZLIB_LIBS) \
+ $(PERSCOMMON_LIBS) \
+ $(JSON_LIBS) \
+ $(SYSTEMD_LIBS)
+
+pers_admin_svc_SOURCES = \
+ generated/NodeStateConsumer.c \
+ generated/NodeStateLifecycleConsumer.c \
+ src/ssw_pers_admin_backup.c \
+ src/ssw_pers_admin_common.c \
+ src/ssw_pers_admin_config.c \
+ src/ssw_pers_admin_database_helper.c \
+ src/ssw_pers_admin_data_export.c \
+ src/ssw_pers_admin_data_import.c \
+ src/ssw_pers_admin_dbus.c \
+ src/ssw_pers_admin_files_helper.c \
+ src/ssw_pers_admin_pcl.c \
+ src/ssw_pers_admin_recovery.c \
+ src/ssw_pers_admin_restore_default.c \
+ src/ssw_pers_admin_resource_config_add.c \
+ src/ssw_pers_admin_service.c \
+ src/ssw_pers_admin_user_delete_data.c
+
+systemdsystemunit_DATA = config/pas-daemon.service
+
+dbuspolicy_DATA = dbus_config/org.genivi.persistence.admin_svc.conf
+
+EXTRA_DIST = $(systemdsystemunit_DATA) \
+ $(dbuspolicy_DATA)
diff --git a/Administrator/config/pas-daemon.service.in b/Administrator/config/pas-daemon.service.in
new file mode 100644
index 0000000..6246ae0
--- /dev/null
+++ b/Administrator/config/pas-daemon.service.in
@@ -0,0 +1,19 @@
+# Starts the GENIVI PAS (Persistence Administration Service) as a daemon using systemd
+
+[Unit]
+Description=Persistence Administration Service
+Requires=dbus-public-bus.service
+After=dbus-public-bus.service
+
+[Service]
+Type=forking
+PIDFile=/tmp/pers_admin_svc.pid
+ExecStart=/usr/bin/pers_admin_svc
+WatchdogSec=60
+Restart=always
+StartLimitInterval=10
+StartLimitBurst=3
+StartLimitAction=reboot
+
+[Install]
+WantedBy=oip-cpi-mandatory.target
diff --git a/Administrator/dbus_config/org.genivi.persistence.admin_svc.conf b/Administrator/dbus_config/org.genivi.persistence.admin_svc.conf
new file mode 100644
index 0000000..cbcbda5
--- /dev/null
+++ b/Administrator/dbus_config/org.genivi.persistence.admin_svc.conf
@@ -0,0 +1,14 @@
+<!DOCTYPE busconfig PUBLIC
+ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+ <!-- Only root can own the service -->
+ <policy user="root">
+ <allow own="org.genivi.persistence.admin_svc"/>
+ <allow send_destination="org.genivi.persistence.admin_svc"/>
+ </policy>
+ <policy context="default">
+ <allow send_destination="org.genivi.persistence.admin_svc"/>
+ </policy>
+</busconfig> \ No newline at end of file
diff --git a/Administrator/doc/AutoTools HowTo.docx b/Administrator/doc/AutoTools HowTo.docx
new file mode 100644
index 0000000..114abdc
--- /dev/null
+++ b/Administrator/doc/AutoTools HowTo.docx
Binary files differ
diff --git a/Administrator/generated/Makefile.am b/Administrator/generated/Makefile.am
new file mode 100644
index 0000000..8a2cb80
--- /dev/null
+++ b/Administrator/generated/Makefile.am
@@ -0,0 +1,35 @@
+#######################################################################################################################
+#
+# Copyright (C) 2012 Continental Automotive Systems, Inc.
+#
+# Author: Ana.Chisca@continental-corporation.com
+#
+# Makefile template for the Persistence Administration Service generated sources
+#
+# Process this file with automake to produce a Makefile.in.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#######################################################################################################################
+
+# List generated sources here to assert that they are available at build start
+BUILT_SOURCES = NodeStateConsumer.c \
+ NodeStateConsumer.h \
+ NodeStateLifecycleConsumer.c \
+ NodeStateLifecycleConsumer.h
+
+# Delete all generated files on 'make clean'
+CLEANFILES = NodeStateConsumer.c \
+ NodeStateConsumer.h \
+ NodeStateLifecycleConsumer.c \
+ NodeStateLifecycleConsumer.h
+
+
+# Targets to create generated sources during the build
+NodeStateConsumer.c NodeStateConsumer.h: $(nsmdbusinterfacesdir)/org.genivi.NodeStateManager.Consumer.xml
+ gdbus-codegen --interface org.genivi.NodeStateManager. --c-namespace NodeState --generate-c-code NodeStateConsumer $(nsmdbusinterfacesdir)/org.genivi.NodeStateManager.Consumer.xml
+
+NodeStateLifecycleConsumer.c NodeStateLifecycleConsumer.h: $(nsmdbusinterfacesdir)/org.genivi.NodeStateManager.LifecycleConsumer.xml
+ gdbus-codegen --interface org.genivi.NodeStateManager.LifeCycle --c-namespace NodeStateLifeCycle --generate-c-code NodeStateLifecycleConsumer $(nsmdbusinterfacesdir)/org.genivi.NodeStateManager.LifecycleConsumer.xml \ No newline at end of file
diff --git a/Administrator/inc/private/ssw_pers_admin_access_lib.h b/Administrator/inc/private/ssw_pers_admin_access_lib.h
new file mode 100644
index 0000000..251b669
--- /dev/null
+++ b/Administrator/inc/private/ssw_pers_admin_access_lib.h
@@ -0,0 +1,85 @@
+#ifndef PERSADMIN_ACCESS_LIB_H
+#define PERSADMIN_ACCESS_LIB_H
+
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Interface: private - persistence admin service access lib
+*
+* The file defines contains the defines according to
+* https://collab.genivi.org/wiki/display/genivi/SysInfraEGPersistenceConceptInterface
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Version Reason
+* 2013.04.15 uidu0250 2.0.0.0 CSP_WZ#3424: Add IF extension for "restore to default"
+* 2012.11.16 uidl9757 1.0.0.0 CSP_WZ#1280: persadmin_response_msg_s: rename bResult to result and change type to long
+* 2012.11.12 uidl9757 1.0.0.0 CSP_WZ#1280: Member "type" in persadmin_request_msg_s must be PersASSelectionType_e
+* 2012.11.13 uidl9757 1.0.0.0 CSP_WZ#1280: Created
+*
+**********************************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "persComTypes.h"
+#include "persistence_admin_service.h"
+#include "persComDataOrg.h"
+
+#define PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH (PERS_ORG_MAX_LENGTH_PATH_FILENAME + 1)//256
+
+/* named synchronization objects */
+#define PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST "/PersadminAccessLibRequest"
+#define PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE "/PersadminAccessLibResponse"
+#define PERSADMIN_ACCESSLIB_SYNC_SEMAPHORE "/PersadminAccessLibSync"
+
+/* supported opperations */
+typedef enum
+{
+ PAS_Req_DataBackupCreate = 0,
+ PAS_Req_DataBackupRecovery,
+ PAS_Req_DataFolderExport,
+ PAS_Req_DataFolderImport,
+ PAS_Req_ResourceConfigAdd,
+ PAS_Req_ResourceConfigChangeProperties,
+ PAS_Req_UserDataCopy,
+ PAS_Req_UserDataDelete,
+ PAS_Req_DataRestoreToDefault,
+ /* add new definitions here*/
+ PAS_Req_LastEntry
+}persadmin_request_e ;
+
+/* used to pass client's request to the processing thread */
+typedef struct
+{
+ persadmin_request_e eRequest ;
+ PersASSelectionType_e type ;
+ PersASDefaultSource_e defaultSource ;
+ char path1[PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH] ; /* for backup_name, dst_folder, src_folder, resource_file */
+ char path2[PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH] ; /* applicationID */
+ unsigned int user_no ;
+ unsigned int seat_no ;
+ unsigned int src_user_no ;
+ unsigned int src_seat_no ;
+ unsigned int dest_user_no ;
+ unsigned int dest_seat_no ;
+}persadmin_request_msg_s ;
+
+/* used to pass response from processing thread to the client who made the request */
+typedef struct
+{
+ long result ;
+}persadmin_response_msg_s ;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PERSADMIN_ACCESS_LIB_H */
diff --git a/Administrator/inc/private/ssw_pers_admin_common.h b/Administrator/inc/private/ssw_pers_admin_common.h
new file mode 100644
index 0000000..2d44631
--- /dev/null
+++ b/Administrator/inc/private/ssw_pers_admin_common.h
@@ -0,0 +1,96 @@
+#ifndef SSW_PERS_ADMIN_COMMON_H
+#define SSW_PERS_ADMIN_COMMON_H
+
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Interface: private - other common functionality
+*
+* The file defines contains the defines according to
+* https://collab.genivi.org/wiki/display/genivi/SysInfraEGPersistenceConceptInterface
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Version Reason
+* 2013.03.21 uidu0250 1.0.0.0 CSP_WZ#2250: Provide compress/uncompress functionality
+* 2013.02.07 uidu0250 1.0.0.0 CSP_WZ#2220: Removed persadmin_get_hash_for_file declaration
+* 2013.01.22 uidn3591 1.0.0.0 CSP_WZ#2250: Implemented wrappers over libarchive to compress/uncompress files into/from an archive
+* 2013.01.04 uidu0250 1.0.0.0 CSP_WZ#2060: Changed CRC32 to CRC16 provided by HelpLibs
+* 2013.01.03 uidl9757 1.0.0.0 CSP_WZ#2060: Common interface to be used by both PCL and PAS
+* 2012.12.11 uidu0250 1.0.0.0 CSP_WZ#1280: Added declaration for persadmin_get_hash_for_file
+* 2012.11.16 uidn3565 1.0.0.0 CSP_WZ#1280: Added declarations for persadmin_list_application_folders & persadmin_list_application_folders_get_size
+* 2012.11.16 uidl9757 1.0.0.0 CSP_WZ#1280: Created
+*
+**********************************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+
+#define BACKUP_LOCATION ("/tmp/backups/")
+#define BACKUP_FORMAT (".arch.tar.gz")
+
+extern const char StringTerminator;
+extern const char PathSeparator;
+
+/*
+* export the application's information about links (to groups and public data)
+* returns the number of exported links, or a negative value in case of error
+*/
+sint_t persadmin_export_links(pstr_t absPathApplicationFolder, pstr_t absPathExportFolder) ;
+
+/*
+* install links (to groups and public data) into the application folder(indicated by absPathApplicationFolder)
+* based on information available inside the import folder (indicated by absPathImportFolder)
+* returns the number of installed links, or a negative value in case of error
+*/
+sint_t persadmin_import_links(pstr_t absPathImportFolder, pstr_t absPathApplicationFolder) ;
+
+/**
+ * @brief List all application folders under the given root data path.
+ *
+ * @param rootPath [in] Absolute path to the folder storing applications' data; the final path separator is not required - e.g. "/Data/mnt-c"
+ * @param list [out] Buffer receiving the list of application folders; entries are relative to rootPath, are separated by '\0' and are ended with a double '\0'
+ * @param listSize [in] Size in bytes of of list; should be at least equal to the positive return value of persadmin_list_application_folders_get_size()
+ * @return Positive value - the size of data written in list, negative - error.
+ * TODO: define error codes
+ */
+sint_t persadmin_list_application_folders( pconststr_t rootPath, pstr_t list, sint_t listSize );
+
+/**
+ * @brief Compute the size of the buffer needed to accommodate the list of application folders
+ *
+ * @param rootPath [in] Absolute path to the folder storing applications' data; the final path separator is not required - e.g. "/Data/mnt-c"
+ * @return Positive value - the size in bytes of application data folders listing, negative - error.
+ * TODO: define error codes
+ */
+sint_t persadmin_list_application_folders_get_size( pconststr_t rootPath );
+
+/**
+ * @brief Saves files together into a single archive.
+ *
+ * @return 0 for success, negative value otherwise.
+ */
+sint_t persadmin_compress(pstr_t compressTo, pstr_t compressFrom);
+
+/**
+ * @brief Restore files from an archive.
+ *
+ * @return 0 for success, negative value otherwise.
+ */
+sint_t persadmin_uncompress(pstr_t extractFrom, pstr_t extractTo);
+
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_PERS_ADMIN_COMMON_H */
diff --git a/Administrator/inc/private/ssw_pers_admin_config.h b/Administrator/inc/private/ssw_pers_admin_config.h
new file mode 100644
index 0000000..319ab85
--- /dev/null
+++ b/Administrator/inc/private/ssw_pers_admin_config.h
@@ -0,0 +1,377 @@
+#ifndef OSS_PERSISTENCE_ADMIN_CONFIG_H
+#define OSS_PERSISTENCE_ADMIN_CONFIG_H
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Interface: protected - Access to configuration files (json, xml)
+*
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.03.25 uidl9757 1.0.0.0 Created
+*
+**********************************************************************************************************************/
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComDataOrg.h"
+#include "persComDbAccess.h"
+#include "persComRct.h"
+
+
+/*
+ * Structure of uncompressed WebTool's output
+ *
+ * []resource
+ * ...[]public
+ * . ...installRules.json
+ * . ...[]public
+ * . ...[]file
+ * . . []defaultData
+ * . . []configurableDefaultData
+ * . . []initialData
+ * . ...[]key
+ * . . factoryDefaultData.json
+ * . . configurableDefaultData.json
+ * . . initialDefault.json
+ * . ...installExceptions.json
+ * . ...resourceconfiguration.json
+ * ...[]groups
+ * . ...installRules.json
+ * . ...[]10
+ * . ...[]file
+ * . . []defaultData
+ * . . []configurableDefaultData
+ * . . []initialData
+ * . ...[]key
+ * . . factoryDefaultData.json
+ * . . configurableDefaultData.json
+ * . . initialDefault.json
+ * . ...GroupContent.json
+ * . ...installExceptions.json
+ * . ...resourceconfiguration.json
+ * . []20
+ * ...[]apps
+ * ...installRules.json
+ * ...[]one_application
+ * . ...[]file
+ * . . []defaultData
+ * . . []configurableDefaultData
+ * . . []initialData
+ * . ...[]key
+ * . . factoryDefaultData.json
+ * . . configurableDefaultData.json
+ * . . initialDefault.json
+ * . . installExceptions.json
+ * . ...resourceconfiguration.json
+ * ...[]another_application
+ */
+
+#define PERSADM_CFG_RESOURCE_ROOT_FOLDER_NAME "resource"
+#define PERSADM_CFG_RESOURCE_PUBLIC_FOLDER_NAME "public"
+#define PERSADM_CFG_RESOURCE_PUBLIC_FOLDER_PATHNAME PERSADM_CFG_RESOURCE_ROOT_FOLDER_NAME"/"PERSADM_CFG_RESOURCE_PUBLIC_FOLDER_NAME
+#define PERSADM_CFG_RESOURCE_GROUPS_FOLDER_NAME "groups"
+#define PERSADM_CFG_RESOURCE_GROUPS_FOLDER_PATHNAME PERSADM_CFG_RESOURCE_ROOT_FOLDER_NAME"/"PERSADM_CFG_RESOURCE_GROUPS_FOLDER_NAME
+#define PERSADM_CFG_RESOURCE_APPS_FOLDER_NAME "apps"
+#define PERSADM_CFG_RESOURCE_APPS_FOLDER_PATHNAME PERSADM_CFG_RESOURCE_ROOT_FOLDER_NAME"/"PERSADM_CFG_RESOURCE_APPS_FOLDER_NAME
+
+#define PERSADM_CFG_RESOURCE_RCT_FILENAME "resourceconfiguration.json"
+#define PERSADM_CFG_RESOURCE_INSTALL_RULES_FILENAME "installRules.json"
+#define PERSADM_CFG_RESOURCE_INSTALL_EXCEPTIONS_FILENAME "installExceptions.json"
+#define PERSADM_CFG_RESOURCE_GROUP_CONTENT_FILENAME "GroupContent.json"
+
+#define PERSADM_CFG_RESOURCE_ROOT_FILEDATA_FOLDER_NAME "file"
+#define PERSADM_CFG_RESOURCE_FACTORY_DEFAULT_FILEDATA_FOLDER_NAME PERS_ORG_DEFAULT_DATA_FOLDER_NAME
+#define PERSADM_CFG_RESOURCE_CONFIG_DEFAULT_FILEDATA_FOLDER_NAME PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME
+#define PERSADM_CFG_RESOURCE_NON_DEFAULT_FILEDATA_FOLDER_NAME "initialData.json"
+
+#define PERSADM_CFG_RESOURCE_ROOT_KEYDATA_FOLDER_NAME "key"
+#define PERSADM_CFG_RESOURCE_FACTORY_DEFAULT_KEYDATA_FILENAME "factoryDefaultData.json"
+#define PERSADM_CFG_RESOURCE_CONFIG_KEYDEFAULT_DATA_FILENAME "configurableDefaultData.json"
+#define PERSADM_CFG_RESOURCE_NON_DEFAULT_KEYDATA_FILENAME "initialDefault.json"
+
+
+/** types of configuration files */
+typedef enum PersAdminCfgFileTypes_e_
+{
+ PersAdminCfgFileType_InstallRules = 0, /**< config rules for all the applications or groups */
+ PersAdminCfgFileType_InstallExceptions, /**< config rules for a single application or group */
+ PersAdminCfgFileType_RCT, /**< resource configuration table */
+ PersAdminCfgFileType_Database, /**< database with default or init values for resourceIDs */
+ PersAdminCfgFileType_GroupContent, /**< list with the applications that are member of a group */
+
+ /** insert new entries here ... */
+ PersAdminCfgFileType_LastEntry /**< last entry */
+} PersAdminCfgFileTypes_e;
+
+
+/** global rules */
+typedef enum PersAdminCfgInstallRules_e_
+{
+ PersAdminCfgInstallRules_NewInstall = 0, /**< delete existent data and install the new data */
+ PersAdminCfgInstallRules_Uninstall, /**< remove the existent data */
+ PersAdminCfgInstallRules_DontTouch, /**< don't touch the application/group/resource */
+ PersAdminCfgInstallRules_UpdateAll, /**< update(merge) the existent data with new data (factory-default, config-default and non-default) */
+ PersAdminCfgInstallRules_UpdateAllSkipDefaultFactory, /**< update(merge) the existent data with new data (config-default and non-default) */
+ PersAdminCfgInstallRules_UpdateAllSkipDefaultConfig, /**< update(merge) the existent data with new data (factory-default and non-default) */
+ PersAdminCfgInstallRules_UpdateAllSkipDefaultAll, /**< update(merge) the existent data with new data (non-default) */
+ PersAdminCfgInstallRules_UpdateDefaultFactory, /**< update(merge) the existent data with new data (factory-default) */
+ PersAdminCfgInstallRules_UpdateDefaultConfig, /**< update(merge) the existent data with new data (config-default) */
+ PersAdminCfgInstallRules_UpdateDefaultAll, /**< update(merge) the existent data with new data (factory-default, config-default) */
+ PersAdminCfgInstallRules_UpdateSetOfResources, /**< update/remove data for a set of resources (factory-default, config-default and non-default) */
+ PersAdminCfgInstallRules_UninstallNonDefault, /**< uninstall non-default data (similar to reset to default) */
+
+ /** insert new entries here ... */
+ PersAdminCfgInstallRules_LastEntry /**< last entry */
+} PersAdminCfgInstallRules_e;
+
+
+/** local rules */
+typedef enum PersAdminCfgInstallExceptions_e_
+{
+ PersAdminCfgInstallExceptions_Update = 0, /**< update(merge) the resource's existent data with new data */
+ PersAdminCfgInstallExceptions_DontTouch, /**< don't touch the resource's data */
+ PersAdminCfgInstallExceptions_Delete, /**< remove the resource's existent data */
+
+ /** insert new entries here ... */
+ PersAdminCfgInstallExceptions_LastEntry /**< last entry */
+} PersAdminCfgInstallExceptions_e;
+
+
+/** entry in global rules file */
+typedef struct PersAdminCfgInstallRulesEntry_s_
+{
+ char responsible[PERS_RCT_MAX_LENGTH_RESPONSIBLE]; /**< name of the application/group */
+ PersAdminCfgInstallRules_e eRule; /**< config rule for itemIdentifier */
+} PersAdminCfgInstallRulesEntry_s;
+
+/** entry in local rules file */
+typedef struct PersAdminCfgRuleLocalEntry_s_
+{
+ char itemIdentifier[PERS_DB_MAX_LENGTH_KEY_NAME]; /**< name of the resource */
+ PersAdminCfgInstallExceptions_e eRule; /**< config rule for itemIdentifier */
+} PersAdminCfgRuleLocalEntry_s;
+
+/** entry in database */
+typedef struct PersAdminCfgDbEntry_s_
+{
+ char itemIdentifier[PERS_DB_MAX_LENGTH_KEY_NAME]; /**< name of the resource */
+ char data[PERS_DB_MAX_SIZE_KEY_DATA]; /**< config rule for itemIdentifier */
+} PersAdminCfgDbEntry_s ;
+
+
+/** entry in group content */
+typedef struct PersAdminCfgGroupContentEntry_s_
+{
+ char appName[PERS_RCT_MAX_LENGTH_RESPONSIBLE]; /**< name of the application that is member of the group */
+} PersAdminCfgGroupContentEntry_s ;
+
+/** entry in resource config table */
+typedef struct PersAdminCfgRctEntry_s_
+{
+ char resourceID[PERS_RCT_MAX_LENGTH_RESOURCE_ID]; /**< identifier of the resource */
+ PersistenceConfigurationKey_s sConfig ; /**< configuration for resourceID */
+} PersAdminCfgRctEntry_s ;
+
+/** entry in config files for key type resources */
+typedef struct PersAdminCfgKeyDataEntry_s_
+{
+ char identifier[PERS_DB_MAX_LENGTH_KEY_NAME]; /**< identifier of the resource */
+ int dataSize ; /**< size of data */
+ char data[PERS_DB_MAX_SIZE_KEY_DATA]; /**< init/default data for the key type resource */
+} PersAdminCfgKeyDataEntry_s ;
+
+
+/***********************************************************************************************************************************
+*********************************************** General usage **********************************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief Obtain a handler to config file (RCT, rules, DB) indicated by cfgFilePathname
+ *
+ * \param cfgFilePathname [in] absolute path to config file (length limited to \ref PERS_ORG_MAX_LENGTH_PATH_FILENAME)
+ * \param eCfgFileType [in] absolute path to config file (length limited to \ref PERS_ORG_MAX_LENGTH_PATH_FILENAME)
+ *
+ * \return >= 0 for valid handler, negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgFileOpen(char const * filePathname, PersAdminCfgFileTypes_e eCfgFileType) ;
+
+/**
+ * \brief Close handler to config file
+ *
+ * \param handlerCfgFile [in] handler obtained with persCfgFileOpen
+ *
+ * \return 0 for success, negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgFileClose(signed int handlerCfgFile) ;
+
+/***********************************************************************************************************************************
+*********************************************** RCT related ************************************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief read a resourceID's configuration from RCT
+ *
+ * \param handlerRCT [in] handler obtained with persAdmCfgFileOpen
+ * \param resourceID [in] resource's identifier (length limited to \ref PERS_RCT_MAX_LENGTH_RESOURCE_ID)
+ * \param psConfig_out [out]where to return the configuration for resourceID
+ *
+ * \return 0 for success, or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRctRead(signed int handlerRCT, char const * resourceID, PersistenceConfigurationKey_s* psConfig_out) ;
+
+
+/**
+ * \brief Find the buffer's size needed to accommodate the list of resourceIDs in RCT
+ * \note : resourceIDs in the list are separated by '\0'
+ *
+ * \param handlerRCT [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return needed size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRctGetSizeResourcesList(signed int handlerRCT) ;
+
+/**
+ * \brief Get the list of the resourceIDs in RCT
+ * \note : resourceIDs in the list are separated by '\0'
+ *
+ * \param handlerRCT [in] handler obtained with persAdmCfgFileOpen
+ * \param listBuffer_out [out]buffer where to return the list of resourceIDs
+ * \param listBufferSize [in] size of listBuffer_out
+ *
+ * \return list size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRctGetResourcesList(signed int handlerRCT, char* listBuffer_out, signed int listBufferSize) ;
+
+
+/***********************************************************************************************************************************
+*********************************************** Install Rules related **************************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief Find the buffer's size needed to accommodate the list of apps/groups names in install rules file
+ * \note : the items in the list are separated by '\0'
+ *
+ * \param handlerRulesFile [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return needed size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRulesGetSizeFoldersList(signed int handlerRulesFile) ;
+
+/**
+ * \brief Get the list of apps/groups names in install rules file
+ * \note : the items in the list are separated by '\0'
+ *
+ * \param handlerRulesFile [in] handler obtained with persAdmCfgFileOpen
+ * \param listBuffer_out [out]buffer where to return the list of apps/groups names
+ * \param listBufferSize [in] size of listBuffer_out
+ *
+ * \return list size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRulesGetFoldersList(signed int handlerRulesFile, char* listBuffer_out, signed int listBufferSize) ;
+
+/**
+ * \brief Get the rule for the app/group install folder
+ *
+ * \param handlerRulesFile [in] handler obtained with persAdmCfgFileOpen
+ * \param folderName [in] name of the app/group install folder
+ * \param peRule_out [out]buffer where to return the rule for the folder
+ *
+ * \return 0 for success, or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRulesGetRuleForFolder(signed int handlerRulesFile, char* folderName, PersAdminCfgInstallRules_e* peRule_out) ;
+
+
+/***********************************************************************************************************************************
+*********************************************** Install Exceptions related *********************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief Find the buffer's size needed to accommodate the list of resources in install exceptions file
+ * \note : the items in the list are separated by '\0'
+ *
+ * \param handlerExceptionsFile [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return needed size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgExcGetSizeResourcesList(signed int handlerExceptionsFile) ;
+
+/**
+ * \brief Get the list of resources in install exceptions file
+ * \note : the items in the list are separated by '\0'
+ *
+ * \param handlerExceptionsFile [in] handler obtained with persAdmCfgFileOpen
+ * \param listBuffer_out [out]buffer where to return the list of apps/groups names
+ * \param listBufferSize [in] size of listBuffer_out
+ *
+ * \return list size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgExcGetFoldersList(signed int handlerExceptionsFile, char* listBuffer_out, signed int listBufferSize) ;
+
+/**
+ * \brief Get the rule for the app/group install folder
+ *
+ * \param handlerRulesFile [in] handler obtained with persAdmCfgFileOpen
+ * \param resource [in] identifier of the resource affected by the exception
+ * \param peException_out [out]buffer where to return the exception for the resource
+ *
+ * \return 0 for success, or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgExcGetExceptionForResource(signed int handlerExceptionsFile, char* resource, PersAdminCfgInstallExceptions_e* peException_out) ;
+
+/***********************************************************************************************************************************
+*********************************************** Group content related **************************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief Find the buffer's size needed to accomodate the list of members in the group
+ *
+ * \param handlerGroupContent [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return needed size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgGroupContentGetSizeMembersList(signed int handlerGroupContent) ;
+
+
+/**
+ * \brief Get the list of members in the group
+ * \note : resourceIDs in the list are separated by '\0'
+ *
+ * \param handlerGroupContent [in] handler obtained with persAdmCfgFileOpen
+ * \param listBuffer_out [out]buffer where to return the list of resourceIDs
+ * \param listBufferSize [in] size of listBuffer_out
+ *
+ * \return list size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgGroupContentGetMembersList(signed int handlerGroupContent, char* listBuffer_out, signed int listBufferSize) ;
+
+
+/***********************************************************************************************************************************
+*********************************************** Default data related **************************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief Get the default value for the key type resourceID
+ *
+ * \param hDefaultDataFile [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return size of default data (0 means there is no default data for the key), or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgReadDefaultData(signed int hDefaultDataFile, char const * resourceID, char* defaultDataBuffer_out, signed int bufferSize) ;
+
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /* OSS_PERSISTENCE_ADMIN_CONFIG_H */
diff --git a/Administrator/inc/private/ssw_pers_admin_database_helper.h b/Administrator/inc/private/ssw_pers_admin_database_helper.h
new file mode 100644
index 0000000..0452f66
--- /dev/null
+++ b/Administrator/inc/private/ssw_pers_admin_database_helper.h
@@ -0,0 +1,84 @@
+#ifndef SSW_PERS_ADMIN_DATABASE_HELPER_H
+#define SSW_PERS_ADMIN_DATABASE_HELPER_H
+
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ana.Chisca@continental-corporation.com
+*
+* Interface: private - common functionality for database manipulation
+*
+* The file defines contains the defines according to
+* https://collab.genivi.org/wiki/display/genivi/SysInfraEGPersistenceConceptInterface
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Version Reason
+* 2013.01.19 uidn3591 1.0.0.0 CSP_WZ#2060: Fix delete and copy keys by filter to conform to requirements
+* 2013.01.03 uidl9757 1.0.0.0 CSP_WZ#2060: Use pers_resource_config_table_if.h
+* 2012.11.12 uidn3591 1.0.0.0 CSP_WZ#1280: Created
+*
+**********************************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+
+#include "persistence_admin_service.h"
+#include "persComRct.h"
+
+/**
+ * @brief get the names of an application's databases based on the databases' type (local/shared)
+ * @usage:
+ *
+ * @param pchDBRootPath [in] path to the folder where to look for the databases
+ * @param pchAppName [in] application for which the databases are requested
+ * @param eStorage [in] the type of the requested databases
+ * @param pchDBPaths_out [out] pointer to a buffer where to store the databases' names [the databases' names are separated by '\0']
+ * @param bufSize [in] size of buffer
+ *
+ * @return positive value: size of data passed in pchDBPaths_out ; negative value - error
+ * TODO: define error codes
+ */
+sint_t persadmin_get_all_db_paths_with_names(pconststr_t pchDBRootPath, pconststr_t pchAppName, PersistenceStorage_e eStorage, pstr_t pchDBPaths_out, sint_t bufSize);
+
+
+/**
+ * @brief deletes keys filtered by user name and seat number
+ *
+ * @param pchDBPath[in] path to where the DB can be located
+ * @param user_no [in] the user ID
+ * @param seat_no [in] the seat number (seat 1 to 4; 0 is for all seats)
+ *
+ * @return 0 for success, negative value otherwise;
+ * TODO: define error codes
+ */
+sint_t persadmin_delete_keys_by_filter(PersASSelectionType_e type, pstr_t pchDBPath, uint32_t user_no, uint32_t seat_no);
+
+
+/**
+ * @brief copies keys filtered by user name and seat number
+ *
+ * @param pchdestDBPath [in] destination DB path
+ * @param pchsourceDBPath[in] source DB path
+ * @param user_no [in] the user ID
+ * @param seat_no [in] the seat number (seat 1 to 4; 0 is for all seats)
+ *
+ * @return 0 for success, negative value otherwise;
+ * TODO: define error codes
+ */
+sint_t persadmin_copy_keys_by_filter(PersASSelectionType_e type, pstr_t pchdestDBPath, pstr_t pchsourceDBPath, uint32_t user_no, uint32_t seat_no);
+
+
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_PERS_ADMIN_DATABASE_HELPER_H */
diff --git a/Administrator/inc/private/ssw_pers_admin_dbus.h b/Administrator/inc/private/ssw_pers_admin_dbus.h
new file mode 100644
index 0000000..46e69ac
--- /dev/null
+++ b/Administrator/inc/private/ssw_pers_admin_dbus.h
@@ -0,0 +1,68 @@
+#ifndef SSW_PERS_ADMIN_DBUS_H
+#define SSW_PERS_ADMIN_DBUS_H
+
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Interface: private - persistence admin service DBus access interface
+*
+* The file defines contains the defines according to
+* https://collab.genivi.org/wiki/display/genivi/SysInfraEGPersistenceConceptInterface
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Version Reason
+* 2013-09-17 uidu0250 1.0.0.0 CSP_WZ#5633: Added persadmin_IsRegisteredToNSM function
+* 2013-03-09 uidu0250 1.0.0.0 CSP_WZ#4480: Added persadmin_QuitDBusMainLoop function
+* 2013.04.04 uidu0250 1.0.0.0 CSP_WZ#2739: Using PersCommonIPC for requests to PCL
+* 2012.11.13 uidu0250 1.0.0.0 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "persComTypes.h"
+
+/*
+ * DBus identification of Persistence Administrator Service (PAS)
+ */
+#define PERSISTENCE_ADMIN_SVC_BUS_TYPE G_BUS_TYPE_SYSTEM
+#define PERSISTENCE_ADMIN_SVC_BUS_NAME "org.genivi.persistence.admin_svc"
+#define PERSISTENCE_ADMIN_SVC_OBJ_PATH "/org/genivi/persistence/admin"
+
+
+/**
+ * \brief Initializes the DBus connection and enters the main DBus loop. Returns when the DBus connection is closed
+ *
+ * \return void
+ */
+void persadmin_RunDBusMainLoop(void);
+
+/**
+ * \brief Quits the main DBus loop
+ *
+ * \return void
+ */
+void persadmin_QuitDBusMainLoop(void);
+
+
+/**
+ * \brief Check if the registration to NSM was performed successfully.
+ *
+ * \return true if registered to NSM, false otherwise
+ */
+bool_t persadmin_IsRegisteredToNSM(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SSW_PERS_ADMIN_DBUS_H */
diff --git a/Administrator/inc/private/ssw_pers_admin_files_helper.h b/Administrator/inc/private/ssw_pers_admin_files_helper.h
new file mode 100644
index 0000000..8b35457
--- /dev/null
+++ b/Administrator/inc/private/ssw_pers_admin_files_helper.h
@@ -0,0 +1,192 @@
+#ifndef SSW_PERS_ADMIN_FILES_HELPER_H
+#define SSW_PERS_ADMIN_FILES_HELPER_H
+
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Interface: private - common functionality for files/folder manipulation
+*
+* The file defines contains the defines according to
+* https://collab.genivi.org/wiki/display/genivi/SysInfraEGPersistenceConceptInterface
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Version Reason
+* 2013.02.07 uidu0250 1.0.0.0 CSP_WZ#1280: Added persadmin_check_for_same_file_content to check for identical file content
+* 2012.11.16 uidv2833 1.0.0.0 CSP_WZ#1280: persadmin_delete_folder and persadmin_delete_file return the number of bytes deleted
+* 2012.11.15 uidl9757 1.0.0.0 CSP_WZ#1280: Some extensions:
+ - persadmin_copy_folder and persadmin_copy_file return the number of bytes copied
+ - added persadmin_check_if_file_exist and persadmin_check_if_file_exist
+* 2012.11.12 uidl9757 1.0.0.0 CSP_WZ#1280: Created
+*
+**********************************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "persComDataOrg.h"
+
+#define PERSADMIN_MAX_PATH_LENGHT (PERS_ORG_MAX_LENGTH_PATH_FILENAME + 1) //256
+#define PERSADMIN_MAX_NESTING_DEPTH 12
+
+typedef enum
+{
+ PersadminFilterAll = 0, /* all folders and files are selectes */
+ PersadminFilterFilesAll, /* only files are selected (folders are skipped )*/
+ PersadminFilterFilesRegular, /* only regular files are selected (folders and link files are skipped )*/
+ PersadminFilterFilesLink, /* only link files are selected (folders and regular files are skipped )*/
+ PersadminFilterFoldersAndRegularFiles, /* only folders and regular files are selected */
+ PersadminFilterFoldersAndLinkFiles, /* only folders and link files are selected */
+ PersadminFilterFolders, /* only folders are selected */
+}PersadminFilterMode_e ;
+
+/*
+* filePath can be absolute or relative
+* it is not checked if the file indicated by filePath actually exist
+* returns in fileName_out the part of filePath after the last '/' (or the complete filePath if there is no '/')
+*/
+sint_t persadmin_get_filename(pstr_t filePath, pstr_t fileName_out, sint_t size);
+
+/*
+* filePath can be absolute or relative
+* it is not checked if the file indicated by filePath actually exist
+* returns the part of filePath after the last '.' (but must be after the last '/')
+*/
+sint_t persadmin_get_file_extension(pstr_t filePath, pstr_t fileExtension_out, sint_t size);
+
+
+/*
+* filePath can be absolute or relative
+* it is not checked if the file indicated by filePath actually exist
+* returns the part of filePath before (and including) the last '/'
+*/
+sint_t persadmin_get_folder_path(pstr_t filePath, pstr_t folderPath_out, sint_t size);
+
+/*
+* check if file/folder indicated by pathname exist
+* if (bIsFolder==true) it is checked the existence of the folder, otherway the existence of the file
+* returns 0 if the file/folder exist, a negative value other way
+*/
+sint_t persadmin_check_if_file_exists(pstr_t pathname, bool_t bIsFolder) ;
+
+/*
+* create a link in the path indicated by pathLink which points to path indeicated by pathTarget
+* there is no check if pathTarget actually exist (or is valid)
+* the intermediate folders in pathLink are created if they do not exist
+* returns 0 if the file/folder exist, a negative value other way
+*/
+sint_t persadmin_create_symbolic_link(pstr_t pathLink, pstr_t pathTarget) ;
+
+/**
+ * \brief copy the folder indicated by absPathSource into the folder indicated by absPathDestination
+ * \usage : persadmin_copy_folder("/Data/mnt-c/App-1/", "/var/Pers/bkup/App_1_bkup/")
+ * : copy the content of /Data/mnt-c/App-1/ into /var/Pers/bkup/App_1_bkup/
+ *
+ * \param absPathSource [in] absolute path of source folder
+ * \param absPathDestination [in] absolute path of destination folder
+ * \param eFilter [in] specify what to list (see PersadminFilterMode_e)
+ * \param bRecursive [in] if true, a recursive listing is performed
+ * \return number of bytes copied, negative value for error
+ * TODO: define error codes
+ */
+sint_t persadmin_copy_folder(pstr_t absPathSource, pstr_t absPathDestination, PersadminFilterMode_e eFilter, bool_t bRecursive);
+
+
+/**
+ * \brief create a folder as indicated by absPath
+ * \usage : persadmin_create_folder("/var/Pers/bkup/App_1_bkup/")
+ * \note : all the missing folders in the path are created (i.e. /var/Pers/, /var/Pers/bkup/)
+ *
+ * \param absPath [in] absolute path to folder to be created
+ * \return 0 for success, negative value otherwise;
+ * TODO: define error codes
+ */
+sint_t persadmin_create_folder(pstr_t absPath);
+
+/**
+ * \brief delete a folder
+ * \usage : persadmin_delete_folder("/var/Pers/bkup/App_1_bkup/")
+ *
+ * \param absPath [in] absolute path to folder to be deleted
+ * \return positive value: number of bytes deleted; negative value: error
+ * TODO: define error codes
+ */
+sint_t persadmin_delete_folder(pstr_t absPath);
+
+/**
+ * \brief copy a file (with posibility to rename the copy)
+ * \usage : persadmin_copy_file("/Data/mnt-c/shared/public/cached.itz", "/var/Pers/bkup/CACHED.itz")
+ * : content of /Data/mnt-c/shared/public/cached.itz is copied into /var/Pers/bkup/CACHED.itz
+ *
+ * \param absPathSource [in] absolute path to the source file
+ * \param absPathDestination [in] absolute path to the destination file
+ * \return number of bytes copied, negative value for error
+ * TODO: define error codes
+ */
+sint_t persadmin_copy_file(pstr_t absPathSource, pstr_t absPathDestination);
+
+/**
+ * \brief delete a file
+ * \usage : persadmin_delete_file("/Data/mnt-c/shared/public/cached.itz")
+ *
+ * \param absPath [in] absolute path to the file to be deleted
+ * \return positive value: number of bytes deleted; negative value: error
+ * TODO: define error codes
+ */
+sint_t persadmin_delete_file(pstr_t absPath);
+
+/**
+ * \brief list the content of a folder
+ *
+ * \param folderPath [in] absolute path to the folder to be listed
+ * \param buffer_out [out] where the listing is save ; entries are relative to folderPath and separated by '\0'
+ * \param bufSize [in] size of buffer_out
+ * \param eFilter [in] specify what to list (see PersadminFilterMode_e)
+ * \param bRecursive [in] if true, a recursive listing is performed
+ * \return positive value - the size of data passed in buffer_out, negative - error;
+ * TODO: define error codes
+ */
+sint_t persadmin_list_folder(pconststr_t folderPath, pstr_t buffer_out, sint_t bufSize, PersadminFilterMode_e eFilter, bool_t bRecursive) ;
+
+/**
+ * \brief find the buffer size needed to accommodate the output of a list folder request
+ *
+ * \param folderPath [in] absolute path to the folder to be listed
+ * \param eListingMode [in] specify what to list (see PersadminFilterMode_e)
+ * \param bRecursive [in] if true, a recursive listing is performed
+ * \return positive value - the size needed, negative - error;
+ * TODO: define error codes
+ */
+sint_t persadmin_list_folder_get_size(pconststr_t folderPath, PersadminFilterMode_e eListingMode, bool_t bRecursive) ;
+
+/**
+ * \brief Computes the size in bytes of all files located under the specified folder path. The file search is done recursively.
+ *
+ * \param folderPath [in] absolute path to the folder to be queried
+ * \return positive value - the size in bytes of all files, negative - error;
+ * TODO: define error codes
+ */
+sint_t persadmin_get_folder_size( pconststr_t folderPath );
+
+/**
+ * \brief Checks if the files specified have identical contents (without the usage of checksums)
+ *
+ * \param file1Path [in] absolute path to one of the files to be checked
+ * \param file2Path [in] absolute path to the other file to be checked
+ * \return true - if the files have identical contents, false - otherwise;
+ */
+bool_t persadmin_check_for_same_file_content(pstr_t file1Path, pstr_t file2Path);
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_PERS_ADMIN_FILES_HELPER_H */ \ No newline at end of file
diff --git a/Administrator/inc/private/ssw_pers_admin_pcl.h b/Administrator/inc/private/ssw_pers_admin_pcl.h
new file mode 100644
index 0000000..0dac256
--- /dev/null
+++ b/Administrator/inc/private/ssw_pers_admin_pcl.h
@@ -0,0 +1,74 @@
+#ifndef SSW_PERS_ADMIN_PCL_H
+#define SSW_PERS_ADMIN_PCL_H
+
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Interface: private - persistence admin service PCL access interface (lock/unlock/sync)
+*
+* The file defines contains the defines according to
+* https://collab.genivi.org/wiki/display/genivi/SysInfraEGPersistenceConceptInterface
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Version Reason
+* 2013.04.04 uidu0250 1.0.0.0 CSP_WZ#2739: Using PersCommonIPC for requests to PCL
+* 2012.11.13 uidu0250 1.0.0.0 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "persComTypes.h"
+
+
+
+/**
+ * \brief Init the PAS IPC module
+ *
+ * \return 0 for success, negative value for error (see persComErrors.h)
+ */
+sint_t persadmin_InitIpc(void);
+
+
+
+/**
+ * \brief Request the PCL to sync and lock the memory access
+ *
+ * \return 0 for success, negative value for error (see persComErrors.h)
+ */
+sint_t persadmin_SendLockAndSyncRequestToPCL(void);
+
+
+
+/**
+ * \brief Request the PCL to unlock the memory access
+ *
+ * \return 0 for success, negative value for error (see persComErrors.h)
+ */
+sint_t persadmin_SendUnlockRequestToPCL(void);
+
+
+
+/**
+ * \brief Check if the memory access is already locked
+ *
+ * \return true if the memory access is locked, false otherwise
+ */
+bool_t persadmin_IsPCLAccessLocked(void);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SSW_PERS_ADMIN_DBUS_H */
diff --git a/Administrator/inc/private/ssw_pers_admin_service.h b/Administrator/inc/private/ssw_pers_admin_service.h
new file mode 100644
index 0000000..f73ee49
--- /dev/null
+++ b/Administrator/inc/private/ssw_pers_admin_service.h
@@ -0,0 +1,150 @@
+#ifndef SSW_PERS_ADMIN_SERVICE_H_
+#define SSW_PERS_ADMIN_SERVICE_H_
+
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Interface: private - persistence admin service
+*
+* The file defines contains the defines according to
+* https://collab.genivi.org/wiki/display/genivi/SysInfraEGPersistenceConceptInterface
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Version Reason
+* 2013.09.23 uidl9757 2.1.0.0 CSP_WZ#5781: Watchdog timeout of pas-daemon
+* 2013.04.19 uidu0250 2.0.0.0 CSP_WZ#3424: Add IF extension for "restore to default"
+* 2013.03.26 uidu0250 1.0.0.0 CSP_WZ#3171: Update PAS registration to NSM
+* 2012.11.12 uidl9757 1.0.0.0 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persistence_admin_service.h"
+
+/**
+ * \brief Re-trigger systemd watchdog
+ *
+ * \return none
+ **/
+void persadmin_RetriggerWatchdog(void);
+
+/**
+ * @brief Allow the export of data from specified folder to the system following different levels (application, user or complete)
+ *
+ * @param type represents the quality of the data to backup: all, application, user
+ * @param dst_folder name of the destination folder of the data
+ *
+ * @return positive value: number of bytes imported; negative value: error code
+ */
+long persadmin_data_folder_export(PersASSelectionType_e type, pconststr_t dst_folder);
+
+/**
+ * @brief Allow recovery of from backup on different level (application, user or complete)
+ *
+ * @param type represents the quality of the data to backup: all, application, user
+ * @param backup_name name of the backup to allow identification
+ * @param applicationID the application identifier
+ * @param user_no the user ID
+ * @param seat_no the seat number (seat 1 to 4, 0xFF for all)
+ *
+ * @return positive value: number of written bytes; negative value: error code
+ */
+long persadmin_data_backup_create(PersASSelectionType_e type, char* backup_name, char* applicationID, unsigned int user_no, unsigned int seat_no);
+
+/**
+ * @brief Allow the import of data from specified folder to the system respecting different level (application, user or complete)
+ *
+ * @param type represent the quality of the data to backup: all, application, user
+ * @param src_folder name of the source folder of the data
+ *
+ * @return positive value: number of bytes imported; negative value: error code
+ */
+long persadmin_data_folder_import(PersASSelectionType_e type, pconststr_t src_folder);
+
+/**
+ * @brief Allow recovery of from backup on different level (application, user or complete)
+ *
+ * @param type represent the quality of the data to backup: all, application, user
+ * @param backup_name name of the backup to allow identification
+ * @param applicationID the application identifier
+ * @param user_no the user ID
+ * @param seat_no the seat number (seat 1 to 4)
+ *
+ * @return positive value: number of bytes restored; negative value: error code
+ */
+long persadmin_data_backup_recovery(PersASSelectionType_e type, char* backup_name, char* applicationID, unsigned int user_no, unsigned int seat_no);
+
+/**
+* \brief Allows restore of default values on different level (application, user or complete)
+*
+* \param type represents the quality of the data to backup: all, application, user
+* \param defaultSource source of the default to allow reset
+* \param applicationID the application identifier
+* \param user_no the user ID
+* \param seat_no the seat number (seat 0 to 3)
+*
+* \return positive value: number of bytes restored; negative value: error code (\ref PAS_RETURNS)
+*/
+long persadmin_data_restore_to_default(PersASSelectionType_e type, PersASDefaultSource_e defaultSource, const char* applicationID, unsigned int user_no, unsigned int seat_no);
+
+
+/**
+ * @brief Delete user data
+ *
+ * @param type represent the quality of the data to backup: all, application, user
+ * @param user_no the user ID
+ * @param seat_no the seat number (seat 1 to 4)
+ *
+ * @return positive value: number of deleted bytes; negative value: error code
+ */
+long persadmin_user_data_delete(unsigned int user_no, unsigned int seat_no);
+
+
+/**
+ * @brief Allow to extend the configuration for persistency of data from specified level (application, user).
+ * Used during new persistency entry installation
+ *
+ * @param resource_file name of the persistency resource configuration to integrate
+ *
+ * @return positive value: number of modified entries in the resource configuration; negative value: error code
+ */
+long persadmin_resource_config_add(char* resource_file);
+
+
+/**
+ * @brief Allow the modification of the resource properties from data (key-values and files)
+ *
+ * @param resource_config_file name of the persistency resource configuration to integrate
+ *
+ * @return positive value: number of modified properties in the resource configuration; negative value: error code
+ */
+long persadmin_resource_config_change_properties(char* resource_config_file);
+
+
+/**
+ * @brief Allow the copy of user related data between different users
+ *
+ * @param src_user_no the user ID source
+ * @param src_seat_no the seat number source (seat 0 to 3)
+ * @param dest_user_no the user ID destination
+ * @param dest_seat_no the seat number destination (seat 0 to 3)
+ *
+ * @return positive value: number of bytes copied; negative value: error code
+ */
+long persadmin_user_data_copy(unsigned int src_user_no, unsigned int src_seat_no, unsigned int dest_user_no, unsigned int dest_seat_no);
+
+/**
+ * @brief Set PAS shutdown state
+ *
+ * @param state the shutdown state : true if the shutdown is pending, false otherwise
+ *
+ * @return : void
+ */
+void persadmin_set_shutdown_state(bool_t state);
+
+#endif /* SSW_PERS_ADMIN_SERVICE_H_ */
diff --git a/Administrator/inc/public/persistence_admin_service.h b/Administrator/inc/public/persistence_admin_service.h
new file mode 100644
index 0000000..335a893
--- /dev/null
+++ b/Administrator/inc/public/persistence_admin_service.h
@@ -0,0 +1,209 @@
+#ifndef PERSISTENCE_ADMIN_SERVICE_H
+#define PERSISTENCE_ADMIN_SERVICE_H
+/*******************************************************************************
+ *
+ * Copyright (C) 2012 Continental Automotive Systems, Inc.
+ *
+ * Author: guy.sagnes@continental-corporation.com
+ *
+ * Interface: public - Implementation of the Interface PersAdminService
+ *
+ * For additional details see
+ * https://collab.genivi.org/wiki/display/genivi/SysInfraEGPersistenceConceptInterface
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Date Author Version Description (GSA- to check with doxy)
+ * 2013.04.30 G.Sagnes 2.1.0.0 add restore capability over persAdminDataRestore()
+ * 2013.01.24 G.Sagnes 2.0.0.0 adapt functions name to GENIVI coding rules
+ * change user and seat type to unsigned int
+ * extend the error codes
+ * 2012.11.06 G.Sagnes 1.1.0.0 add definition of PERSIST_SELECT_ALL_USER,
+ * PERSIST_SELECT_ALL_SEAT correction of return
+ * value for resource_config_add()
+ * 2012.07.14 G.Sagnes 1.0.0.0 Initial version of the interface
+ *
+ ******************************************************************************/
+
+/** \defgroup GEN_PERS_ADMINSERVICE_INTERFACE API document
+ * \{
+ */
+
+/** Module version
+The lower significant byte is equal 0 for released version only
+*/
+#define PERSIST_ADMINSERVICE_INTERFACE_VERSION (0x02010000U)
+
+/** \defgroup PAS_RETURNS persAdmin Return Values
+ * ::PAS_SUCCESS, ::PAS_ERROR_CODE, ::PAS_FAILURE_INVALID_PARAMETER
+
+ * These defines are used to define the return values of the given low level access functions
+ * - ::PAS_SUCCESS: the function call succeded
+ * - ::PAS_ERROR_CODE..::PAS_FAILURE: the function call failed
+ * \{
+ */
+/* Error code return by the SW Package, related to SW_PackageID. */
+#define PAS_PACKAGEID 0x013 /*!< Software package identifier, use for return value base */
+#define PAS_BASERETURN_CODE (PAS_PACKAGEID << 16) /*!< Basis of the return value containing SW PackageID */
+
+#define PAS_SUCCESS 0x00000000 /*!< the function call succeded */
+
+#define PAS_ERROR_CODE (-(PAS_BASERETURN_CODE)) /*!< basis of the error (negative values) */
+#define PAS_FAILURE_INVALID_PARAMETER (PAS_ERROR_CODE - 1) /*!< Invalid parameter in the API call */
+#define PAS_FAILURE_BUFFER_TOO_SMALL (PAS_ERROR_CODE - 2) /*!< The provided buffer can not accommodate the available data size */
+#define PAS_FAILURE_OUT_OF_MEMORY (PAS_ERROR_CODE - 3) /*!< not enough memory, malloc failed, no handler available */
+#define PAS_FAILURE_INVALID_FORMAT (PAS_ERROR_CODE - 4) /*!< format of the import source is not as expected (internal layout, type, etc) */
+#define PAS_FAILURE_NOT_FOUND (PAS_ERROR_CODE - 5) /*!< one of the following resource file, folder or key not found */
+#define PAS_FAILURE_INCOMPLETE_OPERATION (PAS_ERROR_CODE - 6) /*!< operation not completed due to shut-down notification */
+#define PAS_FAILURE_ACCESS_DENIED (PAS_ERROR_CODE - 7) /*!< tried to access a file without having the right */
+#define PAS_FAILURE_DBUS_ISSUE (PAS_ERROR_CODE - 8) /*!< related to DBUS */
+#define PAS_FAILURE_OS_RESOURCE_ACCESS (PAS_ERROR_CODE - 9) /*!< related to mutex, queues, threads, etc.*/
+#define PAS_FAILURE_OPERATION_NOT_SUPPORTED (PAS_ERROR_CODE - 10) /*!< operation not (yet) supported */
+
+#define PAS_FAILURE (PAS_ERROR_CODE - 0xFFFF) /*!< should be the max. value for error */
+
+#define PAS_WARNING_CODE (PAS_BASERETURN_CODE) /*!< basis of the warning (positive values) */
+/** \} */
+
+/** \defgroup PERS_ADMIN_HELPER Configuration parameter
+ * \{
+ */
+
+#define PERSIST_SELECT_ALL_USERS (0xFFFFFFFF) /**< 32bit value used to allow access to all users */
+#define PERSIST_SELECT_ALL_SEATS (0xFFFFFFFF) /**< 32bit value used to allow access to all seats */
+
+/** enumerator used to identify the type of selected data for backup, import, export */
+typedef enum _PersASSelectionType_e
+{
+ PersASSelectionType_All = 0, /**< select all data/files: (node+user)->(application+shared) */
+ PersASSelectionType_User = 1, /**< select user data/files: (user)->(application+shared) */
+ PersASSelectionType_Application = 2, /**< select application data/files: (application)->(node+user) */
+ /* insert new entries here ... */
+ PersASSelectionType_LastEntry /**< last entry */
+
+} PersASSelectionType_e;
+
+
+/** enumerator used to identify the type of selected data for backup, import, export
+* \since V2.1.0
+*/
+typedef enum _PersASDefaultSource_e
+{
+PersASDefaultSource_Factory = 0, /**< select from factory definition */
+PersASDefaultSource_Configurable = 1, /**< select from user factory or configurable default if exist */
+/* insert new entries here ... */
+PersASDefaultSource_LastEntry /**< last entry */
+} PersASDefaultSource_e;
+/** \} */
+
+/**
+ * \brief Allow creation of a backup on different level (application, user or complete)
+ *
+ * \param type represent the quality of the data to backup: all, application, user
+ * \param backup_name name of the backup to allow identification
+ * \param applicationID the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat number (seat 0 to 3)
+ *
+ * \return positive value: number of bytes written; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminDataBackupCreate(PersASSelectionType_e type, const char* backup_name, const char* applicationID, unsigned int user_no, unsigned int seat_no);
+
+/**
+ * \brief Allow recovery of from backup on different level (application, user or complete)
+ *
+ * \param type represent the quality of the data to backup: all, application, user
+ * \param backup_name name of the backup to allow identification
+ * \param applicationID the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat number (seat 0 to 3)
+ *
+ * \return positive value: number of bytes restored; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminDataBackupRecovery(PersASSelectionType_e type, const char* backup_name, const char* applicationID, unsigned int user_no, unsigned int seat_no);
+
+/**
+ * \brief Allow to identify and prepare the data to allow an export from system
+ *
+ * \param type represent the quality of the data to backup: all, application, user
+ * \param dst_folder name of the destination folder for the data
+ *
+ * \return positive value: number of bytes written; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminDataFolderExport(PersASSelectionType_e type, const char* dst_folder);
+
+/**
+ * \brief Allow the import of data from specified folder to the system respecting different level (application, user or complete)
+ *
+ * \param type represent the quality of the data to backup: all, application, user
+ * \param src_folder name of the source folder of the data
+ *
+ * \return positive value: number of bytes imported; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminDataFolderImport(PersASSelectionType_e type, const char* src_folder);
+
+/**
+ * \brief Allow to extend the configuration for persistency of data from specified level (application, user).
+ * Used during new persistency entry installation
+ *
+ * \param resource_file name of the persistency resource configuration to integrate
+ *
+ * \return positive value: number of modified entries in the resource configuration; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminResourceConfigAdd(const char* resource_file);
+
+/**
+ * \brief Allow the modification of the resource properties from data (key-values and files)
+ *
+ * \param resource_file name of the persistency resource configuration to integrate
+ *
+ * \return positive value: number of modified properties in the resource configuration; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminResourceConfigChangeProperties(const char* resource_file);
+
+/**
+ * \brief Allow the copy of user related data between different users
+ *
+ * \param src_user_no the user ID source
+ * \param src_seat_no the seat number source (seat 0 to 3)
+ * \param dest_user_no the user ID destination
+ * \param dest_seat_no the seat number destination (seat 0 to 3)
+ *
+ * \return positive value: number of bytes copied; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminUserDataCopy(unsigned int src_user_no, unsigned int src_seat_no, unsigned int dest_user_no, unsigned int dest_seat_no);
+
+/**
+ * \brief Delete the user related data from persistency containers
+ *
+ * \param user_no the user ID
+ * \param seat_no the seat number (seat 0 to 3)
+ *
+ * \return positive value: number of bytes deleted; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminUserDataDelete(unsigned int user_no, unsigned int seat_no);
+
+/**
+* \brief Allow restore of values from default on different level (application, user or complete)
+*
+* \param type represents the data to restore: all, application, user
+* \param defaultSource source of the default to allow reset
+* \param applicationID the application identifier
+* \param user_no the user ID
+* \param seat_no the seat number (seat 0 to 3)
+*
+* \return positive value: number of bytes restored; negative value: error code (\ref PAS_RETURNS)
+*
+* \since V2.1.0
+*/
+
+long persAdminDataRestore(PersASSelectionType_e type, PersASDefaultSource_e defaultSource,
+ const char* applicationID, unsigned int user_no, unsigned int seat_no);
+
+
+/** \} */ /* End of API */
+#endif /* PERSISTENCE_ADMIN_SERVICE_H */
+
+
diff --git a/Administrator/pkgconfig/libpersadminaccess.pc.in b/Administrator/pkgconfig/libpersadminaccess.pc.in
new file mode 100644
index 0000000..b3d05da
--- /dev/null
+++ b/Administrator/pkgconfig/libpersadminaccess.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libperscommon
+Description: library to access the persistence administration service
+Version: @VERSION@
+Cflags: -I${includedir}
+Libs: -L${libdir} -lpers_admin_access_lib
+Libs.private: @LIBS@
diff --git a/Administrator/src/ssw_pers_admin_access_lib.c b/Administrator/src/ssw_pers_admin_access_lib.c
new file mode 100644
index 0000000..4abaf37
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_access_lib.c
@@ -0,0 +1,1216 @@
+/**********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Implementation of functions declared in persistence_admin_service.h
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.04.15 uidu0250 CSP_WZ#3424: Add IF extension for "restore to default"
+* 2013.03.19 uidn3591 CSP_WZ#3061: Update PAS access library according with persAdmin IF Version 2.0.0
+* 2012.11.23 uidn3591 CSP_WZ#1280: Minor bug fixes
+* 2012.11.16 uidl9757 CSP_WZ#1280: persadmin_response_msg_s: rename bResult to result and change type to long
+* 2012.11.12 uidl9757 CSP_WZ#1280: Created
+*
+**********************************************************************************************************************/
+
+/* ---------------------- include files --------------------------------- */
+#include "persComTypes.h"
+#include "string.h"
+#include "stdio.h"
+#include "stdlib.h"
+#include <stddef.h>
+#include <unistd.h>
+#include <sys/file.h>
+#include "fcntl.h"
+#include <errno.h>
+#include <sys/stat.h>
+#include <mqueue.h>
+#include <semaphore.h>
+
+#include "persistence_admin_service.h"
+#include "ssw_pers_admin_access_lib.h"
+
+/* ---------------------- local functions ---------------------------------- */
+static bool_t persadmin_lockSyncSem(sem_t ** ppSynchSem_inout) ;
+static bool_t persadmin_unlockSyncSem(sem_t ** ppSynchSem_inout) ;
+
+/* ---------------------- local variables ---------------------------------- */
+
+
+/**
+ * \brief Allow creation of a backup on different level (application, user or complete)
+ *
+ * \param type represent the quality of the data to backup: all, application, user
+ * \param backup_name name of the backup to allow identification
+ * \param applicationID the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat number (seat 0 to 3)
+ *
+ * \return positive value: number of bytes written; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminDataBackupCreate(PersASSelectionType_e type, const char* backup_name, const char* applicationID, unsigned int user_no, unsigned int seat_no)
+{
+ pstr_t FuncName = "persAdminDataBackupCreate:" ;
+ bool_t bEverythingOK = true ;
+ persadmin_request_msg_s sRequest ;
+ persadmin_response_msg_s sResponse ;
+ mqd_t mqdMsgQueueRequest = -1 ;
+ mqd_t mqdMsgQueueResponse = -1 ;
+ bool_t bSemLocked = false ;
+ sem_t * pSynchSem = NIL ;
+ long result = -1 ;
+ long errorCode = PAS_FAILURE ;
+
+ /* check params */
+ if((NIL != backup_name) && (NIL != applicationID))
+ {
+ if(((type >= PersASSelectionType_All) && (type < PersASSelectionType_LastEntry)) /*&& (user_no <= 4) && (seat_no <= 4)*/)
+ {
+ sint_t len1 = strlen(backup_name) ;
+ sint_t len2 = strlen(applicationID) ;
+ if((len1 >= PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH) || (len2 >= PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH))
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - path too long (len1=%d len2=%d)\n", FuncName, len1, len2) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - type=%d user_no=%d seat_no=%d\n", FuncName, type, user_no, seat_no) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - null pointer passed\n", FuncName) ;
+ }
+
+ if(bEverythingOK)
+ {
+ if(persadmin_lockSyncSem(&pSynchSem))
+ {
+ bSemLocked = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ printf("%s %d <%s> <%s> %d %d\n",
+ FuncName, type, backup_name, applicationID, user_no, seat_no) ;
+ mqdMsgQueueRequest = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, O_WRONLY);
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mqdMsgQueueResponse = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, O_RDONLY);
+ if(mqdMsgQueueResponse < 0)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, strerror(errno)) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sRequest.eRequest = PAS_Req_DataBackupCreate ;
+ sRequest.type = type ;
+ sRequest.user_no = user_no ;
+ sRequest.seat_no = seat_no ;
+ strcpy(sRequest.path1, backup_name) ;
+ strcpy(sRequest.path2, applicationID) ;
+
+ if(0 == mq_send(mqdMsgQueueRequest, (char*)&sRequest, sizeof(sRequest), 0))
+ {
+ /* request sent, now wait for response... */
+ sint_t responseSize = mq_receive(mqdMsgQueueResponse, (char*)&sResponse, sizeof(sResponse), NULL) ;
+ if(sizeof(sResponse) == responseSize)
+ {
+ result = sResponse.result ;
+ printf("%s request result=%ld !!!\n", FuncName, result) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_receive returned %d (expected %d)\n", FuncName, responseSize, sizeof(sResponse)) ;
+ }
+ }
+ }
+
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mq_close(mqdMsgQueueRequest) ;
+ }
+ if(mqdMsgQueueResponse >= 0)
+ {
+ mq_close(mqdMsgQueueResponse) ;
+ }
+
+ if(bSemLocked)
+ {
+ persadmin_unlockSyncSem(&pSynchSem) ;
+ }
+
+ return (bEverythingOK ? result : (errorCode)) ;
+}
+
+/**
+ * \brief Allow recovery of from backup on different level (application, user or complete)
+ *
+ * \param type represent the quality of the data to backup: all, application, user
+ * \param backup_name name of the backup to allow identification
+ * \param applicationID the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat number (seat 0 to 3)
+ *
+ * \return positive value: number of bytes restored; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminDataBackupRecovery(PersASSelectionType_e type, const char* backup_name, const char* applicationID, unsigned int user_no, unsigned int seat_no)
+{
+ pstr_t FuncName = "persAdminDataBackupRecovery:" ;
+ bool_t bEverythingOK = true ;
+ persadmin_request_msg_s sRequest ;
+ persadmin_response_msg_s sResponse ;
+ mqd_t mqdMsgQueueRequest = -1 ;
+ mqd_t mqdMsgQueueResponse = -1 ;
+ bool_t bSemLocked = false ;
+ sem_t * pSynchSem = NIL ;
+ long result = -1 ;
+ long errorCode = PAS_FAILURE ;
+
+ /* check params */
+ if((NIL != backup_name) && (NIL != applicationID))
+ {
+ if(((type >= PersASSelectionType_All) && (type < PersASSelectionType_LastEntry)) /*&& (user_no <= 4) && (seat_no <= 4)*/)
+ {
+ sint_t len1 = strlen(backup_name) ;
+ sint_t len2 = strlen(applicationID) ;
+ if((len1 >= PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH) || (len2 >= PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH))
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - path too long (len1=%d len2=%d)\n", FuncName, len1, len2) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - type=%d user_no=%d seat_no=%d\n", FuncName, type, user_no, seat_no) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - null pointer passed\n", FuncName) ;
+ }
+
+ if(bEverythingOK)
+ {
+ if(persadmin_lockSyncSem(&pSynchSem))
+ {
+ bSemLocked = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ printf("%s %d <%s> <%s> %d %d\n",
+ FuncName, type, backup_name, applicationID, user_no, seat_no) ;
+ mqdMsgQueueRequest = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, O_WRONLY);
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mqdMsgQueueResponse = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, O_RDONLY);
+ if(mqdMsgQueueResponse < 0)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, strerror(errno)) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sRequest.eRequest = PAS_Req_DataBackupRecovery ;
+ sRequest.type = type;
+ sRequest.user_no = user_no ;
+ sRequest.seat_no = seat_no ;
+ strcpy(sRequest.path1, backup_name) ;
+ strcpy(sRequest.path2, applicationID) ;
+
+ if(0 == mq_send(mqdMsgQueueRequest, (char*)&sRequest, sizeof(sRequest), 0))
+ {
+ /* request sent, now wait for response... */
+ sint_t responseSize = mq_receive(mqdMsgQueueResponse, (char*)&sResponse, sizeof(sResponse), NULL) ;
+ if(sizeof(sResponse) == responseSize)
+ {
+ result = sResponse.result ;
+ printf("%s request result=%ld !!!\n", FuncName, result) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_receive returned %d (expected %d)\n", FuncName, responseSize, sizeof(sResponse)) ;
+ }
+ }
+ }
+
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mq_close(mqdMsgQueueRequest) ;
+ }
+ if(mqdMsgQueueResponse >= 0)
+ {
+ mq_close(mqdMsgQueueResponse) ;
+ }
+
+ if(bSemLocked)
+ {
+ persadmin_unlockSyncSem(&pSynchSem) ;
+ }
+
+ return (bEverythingOK ? result : (errorCode)) ;
+}
+
+/**
+* \brief Allow restore of values from default on different level (application, user or complete)
+*
+* \param type represents the data to restore: all, application, user
+* \param defaultSource source of the default to allow reset
+* \param applicationID the application identifier
+* \param user_no the user ID
+* \param seat_no the seat number (seat 0 to 3)
+*
+* \return positive value: number of bytes restored; negative value: error code (\ref PAS_RETURNS)
+*
+* \since V2.1.0
+*/
+long persAdminDataRestore(PersASSelectionType_e type, PersASDefaultSource_e defaultSource, const char* applicationID, unsigned int user_no, unsigned int seat_no)
+{
+ pstr_t FuncName = "persAdminDataRestore:";
+ bool_t bEverythingOK = true;
+
+ persadmin_request_msg_s sRequest;
+ persadmin_response_msg_s sResponse;
+ mqd_t mqdMsgQueueRequest = -1;
+ mqd_t mqdMsgQueueResponse = -1;
+ bool_t bSemLocked = false;
+ sem_t * pSynchSem = NIL;
+ long result = -1;
+ long errorCode = PAS_FAILURE;
+
+ /* check params */
+ if(NIL != applicationID)
+ {
+ if(((type >= PersASSelectionType_All) && (type < PersASSelectionType_LastEntry)) &&
+ ((defaultSource >= PersASDefaultSource_Factory) && (defaultSource < PersASDefaultSource_LastEntry)))
+ {
+ sint_t appNameLength = strlen(applicationID);
+ if(appNameLength >= PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH)
+ {
+ bEverythingOK = false;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER;
+ printf("%s Invalid params - path too long (appNameLength=%d)\n", FuncName, appNameLength);
+ }
+ }
+ else
+ {
+ bEverythingOK = false;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - type=%d defaultSource=%d user_no=%d seat_no=%d\n", FuncName, type, defaultSource, user_no, seat_no);
+ }
+ }
+ else
+ {
+ bEverythingOK = false;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER;
+ printf("%s Invalid params - null pointer passed\n", FuncName);
+ }
+
+ if(bEverythingOK)
+ {
+ if(persadmin_lockSyncSem(&pSynchSem))
+ {
+ bSemLocked = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ printf("%s %d %d <%s> %d %d\n",
+ FuncName, type, defaultSource, applicationID, user_no, seat_no) ;
+ mqdMsgQueueRequest = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, O_WRONLY);
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mqdMsgQueueResponse = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, O_RDONLY);
+ if(mqdMsgQueueResponse < 0)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, strerror(errno)) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sRequest.eRequest = PAS_Req_DataRestoreToDefault ;
+ sRequest.type = type;
+ sRequest.defaultSource = defaultSource;
+ sRequest.user_no = user_no ;
+ sRequest.seat_no = seat_no ;
+ strcpy(sRequest.path2, applicationID) ;
+
+ if(0 == mq_send(mqdMsgQueueRequest, (char*)&sRequest, sizeof(sRequest), 0))
+ {
+ /* request sent, now wait for response... */
+ sint_t responseSize = mq_receive(mqdMsgQueueResponse, (char*)&sResponse, sizeof(sResponse), NULL) ;
+ if(sizeof(sResponse) == responseSize)
+ {
+ result = sResponse.result ;
+ printf("%s request result=%ld !!!\n", FuncName, result) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_receive returned %d (expected %d)\n", FuncName, responseSize, sizeof(sResponse)) ;
+ }
+ }
+ }
+
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mq_close(mqdMsgQueueRequest) ;
+ }
+ if(mqdMsgQueueResponse >= 0)
+ {
+ mq_close(mqdMsgQueueResponse) ;
+ }
+
+ if(bSemLocked)
+ {
+ persadmin_unlockSyncSem(&pSynchSem) ;
+ }
+
+ return (bEverythingOK ? result : (errorCode)) ;
+}
+
+
+/**
+ * \brief Allow to identify and prepare the data to allow an export from system
+ *
+ * \param type represent the quality of the data to backup: all, application, user
+ * \param dst_folder name of the destination folder for the data
+ *
+ * \return positive value: number of bytes written; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminDataFolderExport(PersASSelectionType_e type, const char* dst_folder)
+{
+ pstr_t FuncName = "persAdminDataFolderExport:" ;
+ bool_t bEverythingOK = true ;
+ persadmin_request_msg_s sRequest ;
+ persadmin_response_msg_s sResponse ;
+ mqd_t mqdMsgQueueRequest = -1 ;
+ mqd_t mqdMsgQueueResponse = -1 ;
+ bool_t bSemLocked = false ;
+ sem_t * pSynchSem = NIL ;
+ long result = -1 ;
+ long errorCode = PAS_FAILURE ;
+
+ /* check params */
+ if(NIL != dst_folder)
+ {
+ if((type >= PersASSelectionType_All) && (type < PersASSelectionType_LastEntry))
+ {
+ sint_t len = strlen(dst_folder) ;
+ if(len >= PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - path too long (len=%d)\n", FuncName, len) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - type=%d\n", FuncName, type) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - null pointer passed\n", FuncName) ;
+ }
+
+ if(bEverythingOK)
+ {
+ if(persadmin_lockSyncSem(&pSynchSem))
+ {
+ bSemLocked = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ printf("%s %d <%s>\n",
+ FuncName, type, dst_folder) ;
+ mqdMsgQueueRequest = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, O_WRONLY);
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mqdMsgQueueResponse = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, O_RDONLY);
+ if(mqdMsgQueueResponse < 0)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, strerror(errno)) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sRequest.eRequest = PAS_Req_DataFolderExport ;
+ sRequest.type = type ;
+ strcpy(sRequest.path1, dst_folder) ;
+
+ if(0 == mq_send(mqdMsgQueueRequest, (char*)&sRequest, sizeof(sRequest), 0))
+ {
+ /* request sent, now wait for response... */
+ sint_t responseSize = mq_receive(mqdMsgQueueResponse, (char*)&sResponse, sizeof(sResponse), NULL) ;
+ if(sizeof(sResponse) == responseSize)
+ {
+ result = sResponse.result ;
+ printf("%s request result=%ld !!!\n", FuncName, result) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_receive returned %d (expected %d)\n", FuncName, responseSize, sizeof(sResponse)) ;
+ }
+ }
+ }
+
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mq_close(mqdMsgQueueRequest) ;
+ }
+ if(mqdMsgQueueResponse >= 0)
+ {
+ mq_close(mqdMsgQueueResponse) ;
+ }
+
+ if(bSemLocked)
+ {
+ persadmin_unlockSyncSem(&pSynchSem) ;
+ }
+
+ return (bEverythingOK ? result : (errorCode)) ;
+}
+
+/**
+ * \brief Allow the import of data from specified folder to the system respecting different level (application, user or complete)
+ *
+ * \param type represent the quality of the data to backup: all, application, user
+ * \param src_folder name of the source folder of the data
+ *
+ * \return positive value: number of bytes imported; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminDataFolderImport(PersASSelectionType_e type, const char* src_folder)
+{
+ pstr_t FuncName = "persAdminDataFolderImport:" ;
+ bool_t bEverythingOK = true ;
+ persadmin_request_msg_s sRequest ;
+ persadmin_response_msg_s sResponse ;
+ mqd_t mqdMsgQueueRequest = -1 ;
+ mqd_t mqdMsgQueueResponse = -1 ;
+ bool_t bSemLocked = false ;
+ sem_t * pSynchSem = NIL ;
+ long result = -1 ;
+ long errorCode = PAS_FAILURE ;
+
+ /* check params */
+ if(NIL != src_folder)
+ {
+ if((type >= PersASSelectionType_All) && (type < PersASSelectionType_LastEntry))
+ {
+ sint_t len = strlen(src_folder) ;
+ if(len >= PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - path too long (len=%d)\n", FuncName, len) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - type=%d\n", FuncName, type) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - null pointer passed\n", FuncName) ;
+ }
+
+ if(bEverythingOK)
+ {
+ if(persadmin_lockSyncSem(&pSynchSem))
+ {
+ bSemLocked = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ printf("%s %d <%s>\n",
+ FuncName, type, src_folder) ;
+ mqdMsgQueueRequest = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, O_WRONLY);
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mqdMsgQueueResponse = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, O_RDONLY);
+ if(mqdMsgQueueResponse < 0)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, strerror(errno)) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sRequest.eRequest = PAS_Req_DataFolderImport ;
+ sRequest.type = type ;
+ strcpy(sRequest.path1, src_folder) ;
+
+ if(0 == mq_send(mqdMsgQueueRequest, (char*)&sRequest, sizeof(sRequest), 0))
+ {
+ /* request sent, now wait for response... */
+ sint_t responseSize = mq_receive(mqdMsgQueueResponse, (char*)&sResponse, sizeof(sResponse), NULL) ;
+ if(sizeof(sResponse) == responseSize)
+ {
+ result = sResponse.result ;
+ printf("%s request result=%ld !!!\n", FuncName, result) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_receive returned %d (expected %d)\n", FuncName, responseSize, sizeof(sResponse)) ;
+ }
+ }
+ }
+
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mq_close(mqdMsgQueueRequest) ;
+ }
+ if(mqdMsgQueueResponse >= 0)
+ {
+ mq_close(mqdMsgQueueResponse) ;
+ }
+
+ if(bSemLocked)
+ {
+ persadmin_unlockSyncSem(&pSynchSem) ;
+ }
+
+ return (bEverythingOK ? result : (errorCode)) ;
+}
+
+/**
+ * \brief Allow to extend the configuration for persistency of data from specified level (application, user).
+ * Used during new persistency entry installation
+ *
+ * \param resource_file name of the persistency resource configuration to integrate
+ *
+ * \return positive value: number of modified entries in the resource configuration; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminResourceConfigAdd(const char* resource_file)
+{
+ pstr_t FuncName = "persAdminResourceConfigAdd:" ;
+ bool_t bEverythingOK = true ;
+ persadmin_request_msg_s sRequest ;
+ persadmin_response_msg_s sResponse ;
+ mqd_t mqdMsgQueueRequest = -1 ;
+ mqd_t mqdMsgQueueResponse = -1 ;
+ bool_t bSemLocked = false ;
+ sem_t * pSynchSem = NIL ;
+ long result = -1 ;
+ long errorCode = PAS_FAILURE ;
+
+ /* check params */
+ if(NIL != resource_file)
+ {
+ sint_t len = strlen(resource_file) ;
+ if(len >= PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - path too long (len=%d)\n", FuncName, len) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - null pointer passed\n", FuncName) ;
+ }
+
+ if(bEverythingOK)
+ {
+ if(persadmin_lockSyncSem(&pSynchSem))
+ {
+ bSemLocked = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ printf("%s<%s>\n",
+ FuncName, resource_file) ;
+ mqdMsgQueueRequest = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, O_WRONLY);
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mqdMsgQueueResponse = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, O_RDONLY);
+ if(mqdMsgQueueResponse < 0)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, strerror(errno)) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sRequest.eRequest = PAS_Req_ResourceConfigAdd ;
+ strcpy(sRequest.path1, resource_file) ;
+
+ if(0 == mq_send(mqdMsgQueueRequest, (char*)&sRequest, sizeof(sRequest), 0))
+ {
+ /* request sent, now wait for response... */
+ sint_t responseSize = mq_receive(mqdMsgQueueResponse, (char*)&sResponse, sizeof(sResponse), NULL) ;
+ if(sizeof(sResponse) == responseSize)
+ {
+ result = sResponse.result ;
+ printf("%s request result=%ld !!!\n", FuncName, result) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_receive returned %d (expected %d)\n", FuncName, responseSize, sizeof(sResponse)) ;
+ }
+ }
+ }
+
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mq_close(mqdMsgQueueRequest) ;
+ }
+ if(mqdMsgQueueResponse >= 0)
+ {
+ mq_close(mqdMsgQueueResponse) ;
+ }
+
+ if(bSemLocked)
+ {
+ persadmin_unlockSyncSem(&pSynchSem) ;
+ }
+
+ return (bEverythingOK ? result : (errorCode)) ;
+}
+
+/**
+ * \brief Allow the modification of the resource properties from data (key-values and files)
+ *
+ * \param resource_file name of the persistency resource configuration to integrate
+ *
+ * \return positive value: number of modified properties in the resource configuration; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminResourceConfigChangeProperties(const char* resource_file)
+{
+ pstr_t FuncName = "persAdminResourceConfigChangeProperties:" ;
+ bool_t bEverythingOK = true ;
+ persadmin_request_msg_s sRequest ;
+ persadmin_response_msg_s sResponse ;
+ mqd_t mqdMsgQueueRequest = -1 ;
+ mqd_t mqdMsgQueueResponse = -1 ;
+ bool_t bSemLocked = false ;
+ sem_t * pSynchSem = NIL ;
+ long result = -1 ;
+ long errorCode = PAS_FAILURE ;
+
+ /* check params */
+ if(NIL != resource_file)
+ {
+ sint_t len = strlen(resource_file) ;
+ if(len >= PERSADMIN_ACCESSLIB_REQUEST_MAX_PATH)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - path too long (len=%d)\n", FuncName, len) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - null pointer passed\n", FuncName) ;
+ }
+
+ if(bEverythingOK)
+ {
+ if(persadmin_lockSyncSem(&pSynchSem))
+ {
+ bSemLocked = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ printf("%s<%s>\n",
+ FuncName, resource_file) ;
+ mqdMsgQueueRequest = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, O_WRONLY);
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mqdMsgQueueResponse = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, O_RDONLY);
+ if(mqdMsgQueueResponse < 0)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, strerror(errno)) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sRequest.eRequest = PAS_Req_ResourceConfigChangeProperties ;
+ strcpy(sRequest.path1, resource_file) ;
+
+ if(0 == mq_send(mqdMsgQueueRequest, (char*)&sRequest, sizeof(sRequest), 0))
+ {
+ /* request sent, now wait for response... */
+ sint_t responseSize = mq_receive(mqdMsgQueueResponse, (char*)&sResponse, sizeof(sResponse), NULL) ;
+ if(sizeof(sResponse) == responseSize)
+ {
+ result = sResponse.result ;
+ printf("%s request result=%ld !!!\n", FuncName, result) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_receive returned %d (expected %d)\n", FuncName, responseSize, sizeof(sResponse)) ;
+ }
+ }
+ }
+
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mq_close(mqdMsgQueueRequest) ;
+ }
+ if(mqdMsgQueueResponse >= 0)
+ {
+ mq_close(mqdMsgQueueResponse) ;
+ }
+
+ if(bSemLocked)
+ {
+ persadmin_unlockSyncSem(&pSynchSem) ;
+ }
+
+ return (bEverythingOK ? result : (errorCode)) ;
+}
+
+/**
+ * \brief Allow the copy of user related data between different users
+ *
+ * \param src_user_no the user ID source
+ * \param src_seat_no the seat number source (seat 0 to 3)
+ * \param dest_user_no the user ID destination
+ * \param dest_seat_no the seat number destination (seat 0 to 3)
+ *
+ * \return positive value: number of bytes copied; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminUserDataCopy(unsigned int src_user_no, unsigned int src_seat_no, unsigned int dest_user_no, unsigned int dest_seat_no)
+{
+ pstr_t FuncName = "persAdminUserDataCopy:" ;
+ bool_t bEverythingOK = true ;
+ persadmin_request_msg_s sRequest ;
+ persadmin_response_msg_s sResponse ;
+ mqd_t mqdMsgQueueRequest = -1 ;
+ mqd_t mqdMsgQueueResponse = -1 ;
+ bool_t bSemLocked = false ;
+ sem_t * pSynchSem = NIL ;
+ long result = -1 ;
+ long errorCode = PAS_FAILURE ;
+
+ /* check params */
+ if((src_user_no <= 4) && (src_seat_no <= 4) && (dest_user_no <= 4) && (dest_seat_no <= 4))
+ {
+
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - src_user_no=%d src_seat_no=%d dest_user_no=%d dest_seat_no=%d \n", FuncName, src_user_no, src_seat_no, dest_user_no, dest_seat_no) ;
+ }
+
+
+ if(bEverythingOK)
+ {
+ if(persadmin_lockSyncSem(&pSynchSem))
+ {
+ bSemLocked = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ printf("%s %d %d %d %d\n",
+ FuncName, src_user_no, src_seat_no, dest_user_no, dest_seat_no) ;
+ mqdMsgQueueRequest = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, O_WRONLY);
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mqdMsgQueueResponse = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, O_RDONLY);
+ if(mqdMsgQueueResponse < 0)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, strerror(errno)) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sRequest.eRequest = PAS_Req_DataBackupCreate ;
+ sRequest.src_user_no = src_user_no ;
+ sRequest.src_seat_no = src_seat_no ;
+ sRequest.dest_user_no = dest_user_no ;
+ sRequest.dest_seat_no = dest_seat_no ;
+
+ if(0 == mq_send(mqdMsgQueueRequest, (char*)&sRequest, sizeof(sRequest), 0))
+ {
+ /* request sent, now wait for response... */
+ sint_t responseSize = mq_receive(mqdMsgQueueResponse, (char*)&sResponse, sizeof(sResponse), NULL) ;
+ if(sizeof(sResponse) == responseSize)
+ {
+ result = sResponse.result ;
+ printf("%s request result=%ld !!!\n", FuncName, result) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_receive returned %d (expected %d)\n", FuncName, responseSize, sizeof(sResponse)) ;
+ }
+ }
+ }
+
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mq_close(mqdMsgQueueRequest) ;
+ }
+ if(mqdMsgQueueResponse >= 0)
+ {
+ mq_close(mqdMsgQueueResponse) ;
+ }
+
+ if(bSemLocked)
+ {
+ persadmin_unlockSyncSem(&pSynchSem) ;
+ }
+
+ return (bEverythingOK ? result : (errorCode)) ;
+}
+
+/**
+ * \brief Delete the user related data from persistency containers
+ *
+ * \param user_no the user ID
+ * \param seat_no the seat number (seat 0 to 3)
+ *
+ * \return positive value: number of bytes deleted; negative value: error code (\ref PAS_RETURNS)
+ */
+long persAdminUserDataDelete(unsigned int user_no, unsigned int seat_no)
+{
+ pstr_t FuncName = "persAdminUserDataDelete:" ;
+ bool_t bEverythingOK = true ;
+ persadmin_request_msg_s sRequest ;
+ persadmin_response_msg_s sResponse ;
+ mqd_t mqdMsgQueueRequest = -1 ;
+ mqd_t mqdMsgQueueResponse = -1 ;
+ bool_t bSemLocked = false ;
+ sem_t * pSynchSem = NIL ;
+ long result = -1 ;
+ long errorCode = PAS_FAILURE ;
+
+ /* check params */
+ if((user_no <= 4) && (seat_no <= 4))
+ {
+
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_INVALID_PARAMETER ;
+ printf("%s Invalid params - user_no=%d seat_no=%d \n", FuncName, user_no, seat_no) ;
+ }
+
+
+ if(bEverythingOK)
+ {
+ if(persadmin_lockSyncSem(&pSynchSem))
+ {
+ bSemLocked = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ printf("%s %d %d\n",
+ FuncName, user_no, seat_no) ;
+ mqdMsgQueueRequest = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, O_WRONLY);
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mqdMsgQueueResponse = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, O_RDONLY);
+ if(mqdMsgQueueResponse < 0)
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_open(%s) errno=<%s>\n", FuncName, PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, strerror(errno)) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sRequest.eRequest = PAS_Req_UserDataDelete ;
+ sRequest.user_no = user_no ;
+ sRequest.seat_no = seat_no ;
+
+ if(0 == mq_send(mqdMsgQueueRequest, (char*)&sRequest, sizeof(sRequest), 0))
+ {
+ /* request sent, now wait for response... */
+ sint_t responseSize = mq_receive(mqdMsgQueueResponse, (char*)&sResponse, sizeof(sResponse), NULL) ;
+ if(sizeof(sResponse) == responseSize)
+ {
+ result = sResponse.result ;
+ printf("%s request result=%ld !!!\n", FuncName, result) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = PAS_FAILURE_OS_RESOURCE_ACCESS ;
+ printf("%s mq_receive returned %d (expected %d)\n", FuncName, responseSize, sizeof(sResponse)) ;
+ }
+ }
+ }
+
+ if(mqdMsgQueueRequest >= 0)
+ {
+ mq_close(mqdMsgQueueRequest) ;
+ }
+ if(mqdMsgQueueResponse >= 0)
+ {
+ mq_close(mqdMsgQueueResponse) ;
+ }
+
+ if(bSemLocked)
+ {
+ persadmin_unlockSyncSem(&pSynchSem) ;
+ }
+
+ return (bEverythingOK ? result : (errorCode)) ;
+}
+
+
+static bool_t persadmin_lockSyncSem(sem_t ** ppSynchSem_inout)
+{
+ pstr_t FuncName = "persadmin_lockSyncSem:" ;
+ bool_t bEverythingOK = true ;
+
+ if(NIL == *ppSynchSem_inout)
+ {
+ *ppSynchSem_inout = sem_open(PERSADMIN_ACCESSLIB_SYNC_SEMAPHORE, O_RDONLY) ;
+ if(NIL != *ppSynchSem_inout)
+ {
+ if(0 != sem_wait(*ppSynchSem_inout))
+ {
+ bEverythingOK = false ;
+ printf("%s sem_wait() errno=<%s> !!!\n", FuncName, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ printf("%s sem_open(%s, O_RDONLY)() errno=<%s> !!!\n", FuncName, PERSADMIN_ACCESSLIB_SYNC_SEMAPHORE, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ printf("%s pSynchSem != NULL !!!\n", FuncName) ;
+ }
+
+ return bEverythingOK ;
+}
+
+static bool_t persadmin_unlockSyncSem(sem_t ** ppSynchSem_inout)
+{
+ pstr_t FuncName = "persadmin_unlockSyncSem:" ;
+ bool_t bEverythingOK = true ;
+
+ if(NIL != *ppSynchSem_inout)
+ {
+ if(0 == sem_post(*ppSynchSem_inout))
+ {
+ if(0 == sem_close(*ppSynchSem_inout))
+ {
+ *ppSynchSem_inout = NIL ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ printf("%s sem_close() errno=<%s> !!!\n", FuncName, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ printf("%s sem_post() errno=<%s> !!!\n", FuncName, strerror(errno)) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ printf("%s pSynchSem is NULL !!!\n", FuncName) ;
+ }
+
+ return bEverythingOK ;
+}
+
diff --git a/Administrator/src/ssw_pers_admin_backup.c b/Administrator/src/ssw_pers_admin_backup.c
new file mode 100644
index 0000000..d6fb924
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_backup.c
@@ -0,0 +1,1092 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ana.Chisca@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.03.20 uidu0250 CSP_WZ#2250: Provide compress/uncompress functionality
+* 2013.02.28 uidn3591 CSP_WZ#2250: QAC + provide compress functionality
+* 2013.01.08 uidn3591 CSP_WZ#2060: Update according with latest fixes in database_helper
+* 2012.11.22 uidn3591 CSP_WZ#1280: Minor bug fixing
+* 2012.11.19 uidn3591 CSP_WZ#1280: Merge updates
+* 2012.11.16 uidn3591 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include <stddef.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "dlt/dlt.h"
+
+#include "persistence_admin_service.h"
+#include "ssw_pers_admin_files_helper.h"
+#include "ssw_pers_admin_database_helper.h"
+#include "ssw_pers_admin_common.h"
+#include "ssw_pers_admin_service.h"
+#include "persComDataOrg.h"
+#include "persComTypes.h"
+
+
+
+/* L&T context */
+#define LT_HDR "BCKUP >> "
+DLT_IMPORT_CONTEXT (persAdminSvcDLTCtx)
+
+#define E_INVALID_PARAMS PAS_FAILURE_INVALID_PARAMETER
+#define E_TO_BE_DEFINED PAS_FAILURE
+#define E_OK PAS_SUCCESS
+
+
+#define PATH_RELATIVE_MAX_SIZE ( PERS_ORG_MAX_LENGTH_PATH_FILENAME + 1 )
+#define PATH_ABS_MAX_SIZE ( 512)
+#define PATHS_DB_MAX_SIZE (PATH_ABS_MAX_SIZE * 4)
+
+#define NAME_APP_MAX_SIZE ( 64)
+#define NAMES_APP_MAX_SIZE (NAME_APP_MAX_SIZE * 100)
+
+#define IS_VALID_APPL(applicationID) ((NIL != (applicationID)) && (0 != (*(applicationID))))
+#define IS_VALID_USER(user_no) ((PERSIST_SELECT_ALL_USERS == (user_no)) || ((1 <= (user_no)) && (4 >= (user_no))))
+#define IS_VALID_SEAT(seat_no) ((PERSIST_SELECT_ALL_SEATS == (seat_no)) || ((1 <= (seat_no)) && (4 >= (seat_no))))
+
+const char* gSharedPublicRelativePath = PERS_ORG_SHARED_FOLDER_NAME PERS_ORG_PUBLIC_FOLDER_NAME_;
+const char* gSharedGroupRelativePath = PERS_ORG_SHARED_FOLDER_NAME PERS_ORG_GROUP_FOLDER_NAME_ "/";
+
+
+static long persadmin_priv_data_backup_create_all (pstr_t backup_name);
+static long persadmin_priv_data_backup_create_application (pstr_t backup_name, pstr_t applicationID, uint32_t user_no, uint32_t seat_no);
+static long persadmin_priv_data_backup_create_application_cached (pstr_t backup_name, pstr_t applicationID, uint32_t user_no, uint32_t seat_no);
+static long persadmin_priv_data_backup_create_application_write_through (pstr_t backup_name, pstr_t applicationID, uint32_t user_no, uint32_t seat_no);
+static long persadmin_priv_data_backup_create_user_all (pstr_t backup_name, uint32_t user_no, uint32_t seat_no);
+static long persadmin_priv_data_backup_create_user_all_cached (pstr_t backup_name, uint32_t user_no, uint32_t seat_no, pstr_t pchNamesApp);
+static long persadmin_priv_data_backup_create_user_all_write_through (pstr_t backup_name, uint32_t user_no, uint32_t seat_no, pstr_t pchNamesApp);
+static long persadmin_priv_data_backup_create_user_all_databases (pstr_t backup_name, uint32_t user_no, uint32_t seat_no, pstr_t pchNamesApp);
+
+static long persadmin_priv_data_backup_create_node (pconststr_t backup_name, pconststr_t pchBckupPathSrc, pconststr_t pchLocalPublicGroup);
+static long persadmin_priv_data_backup_create_user (pconststr_t backup_name, pconststr_t pchBckupPathSrc, pconststr_t pchLocalPublicGroup, uint32_t user_no, uint32_t seat_no);
+static long persadmin_priv_data_backup_create_databases (pconststr_t backup_name, PersASSelectionType_e type, pconststr_t applicationID, PersistenceStorage_e eStorage, uint32_t user_no, uint32_t seat_no);
+
+static long persadmin_data_backup_create_user_all_local_for_storage (pconststr_t backup_name, pstr_t pchNamesAppTemp, pconststr_t pchPathTemp, uint32_t user_no, uint32_t seat_no);
+static long persadmin_data_backup_create_user_all_shared_for_storage (pconststr_t backup_name, pconststr_t pchLocalPath, pconststr_t pchSharedPublicPath, pconststr_t pchSharedGroupPath, uint32_t user_no, uint32_t seat_no);
+
+static void persadmin_priv_data_backup_archive (PersASSelectionType_e type, pstr_t backup_name, pstr_t applicationID);
+
+/* return positive value: number of bytes written; negative value: error code
+ */
+long persadmin_data_backup_create(PersASSelectionType_e type, char* backup_name, char* applicationID, unsigned int user_no, unsigned int seat_no)
+{
+ /* number of written bytes; */
+ sint64_t sResult = 0;
+
+ if( (NIL == backup_name) ||
+ (PersASSelectionType_LastEntry <= type) || (PersASSelectionType_All > type) )
+ {
+ /* set error; */
+ sResult = E_INVALID_PARAMS;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("data_backup_create -"), DLT_STRING("invalid input parameters"));
+ }
+ else
+ {
+ switch( type )
+ {
+ /* main flow complete backup (system recovery point); */
+ /* select all data/files: (node+user).(all applications+shared); */
+ /* ignore ApplID, userNumber & seatNumber; */
+ case PersASSelectionType_All:
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("data_backup_create -"), DLT_STRING("All"));
+ /* create backup; */
+ sResult = persadmin_priv_data_backup_create_all(backup_name);
+
+ break;
+ }
+
+ /* alternative flow application backup (application recovery point); */
+ /* select application data/files: (node+user).(application); */
+ case PersASSelectionType_Application:
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("data_backup_create -"), DLT_STRING("Application"));
+ /* create backup; */
+ sResult = persadmin_priv_data_backup_create_application(backup_name, applicationID, user_no, seat_no);
+
+ break;
+ }
+
+ /* alternative flow application backup (user recovery point); */
+ /* select user data/files: (user).(all applications+shared); */
+ case PersASSelectionType_User:
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("data_backup_create -"), DLT_STRING("User"));
+ /* create backup; */
+ sResult = persadmin_priv_data_backup_create_user_all(backup_name, user_no, seat_no);
+
+ break;
+ }
+
+ default:
+ {
+ /* nothing to do */
+ break;
+ }
+ }
+ }
+
+ /* everything ok; */
+ if( 0 <= sResult )
+ {
+ /* compute the number of bytes in /backup folder & return the result; */
+ sResult = persadmin_get_folder_size(backup_name);
+ /* compress backup (e.g. *.tar.gz) no matter the result; */
+ persadmin_priv_data_backup_archive(type, backup_name, applicationID);
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("data_backup_create -"), (NIL != backup_name) ? DLT_STRING(backup_name) : DLT_STRING(""), DLT_INT(sResult), DLT_STRING("bytes"));
+
+ /* return number of written bytes; */
+ return sResult;
+
+} /* persadmin_data_backup_create() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static long persadmin_priv_data_backup_create_all(pstr_t backup_name)
+{
+ sint64_t sResult = 0;
+ bool_t bCanContinue = true;
+ str_t pchBckupPathDst [PATH_ABS_MAX_SIZE];
+ sint_t s32SizeBckup = sizeof(pchBckupPathDst);
+
+ /* reset; */
+ (void)memset(pchBckupPathDst, 0, (size_t)s32SizeBckup);
+
+ /* backup the shared and application data; */
+
+ /* append root path to backup name -> /backup_name/Data; */
+ (void)snprintf(pchBckupPathDst, (size_t)s32SizeBckup, "%s%s", backup_name, gRootPath);
+
+ /* TODO: check if folder exists; */
+ /* copy content of source (/Data) to destination (/backup); */
+ sResult = persadmin_copy_folder(gRootPath, pchBckupPathDst, PersadminFilterAll, true);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_all -"), DLT_STRING("persadmin_copy_folder"),
+ DLT_STRING(gRootPath), DLT_STRING("to"), DLT_STRING(pchBckupPathDst), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ else
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_all -"), DLT_STRING("backed up"),
+ DLT_STRING(gRootPath), DLT_STRING("to"), DLT_STRING(pchBckupPathDst));
+ }
+
+ /* TODO: filter destination folder of files which do not correspond with the definition in BackupFileList.info; */
+ /* persadmin_priv_filter_folder(); */
+
+ /* return result; */
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_all() */
+
+
+static long persadmin_priv_data_backup_create_application(pstr_t backup_name, pstr_t applicationID, uint32_t user_no, uint32_t seat_no)
+{
+ sint_t sResult = 0;
+
+ /* check input parameters; */
+ if( (!IS_VALID_APPL(applicationID)) ||
+ (!IS_VALID_USER(user_no)) ||
+ (!IS_VALID_SEAT(seat_no)))
+ {
+ /* set result; */
+ sResult = E_INVALID_PARAMS;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_application -"), DLT_STRING("invalid input parameters"), DLT_INT(user_no), DLT_INT(seat_no));
+ }
+
+ /* backup application data: /Node & /User(s); */
+
+ else
+ {
+ /* CACHED; */
+ sResult = persadmin_priv_data_backup_create_application_cached(backup_name, applicationID, user_no, seat_no);
+ if( 0 <= sResult )
+ {
+ /* WRITE-THROUGH; */
+ sResult = persadmin_priv_data_backup_create_application_write_through(backup_name, applicationID, user_no, seat_no);
+ }
+ if( 0 <= sResult )
+ {
+ /* common for CACHED and WRITE-THROUGH - request data bases, filter & copy them at the needed location; */
+ sResult = persadmin_priv_data_backup_create_databases(backup_name, PersASSelectionType_Application, applicationID, PersistenceStorage_local, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_application -"), DLT_STRING("persadmin_priv_data_backup_create_databases"),
+ DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+ }
+
+ /* TODO: filter destination folder of files which do not correspond with the definition in BackupFileList.info; */
+ /* persadmin_priv_filter_folder(); */
+
+ /* return result; */
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_application() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static long persadmin_priv_data_backup_create_application_cached(pstr_t backup_name, pstr_t applicationID, uint32_t user_no, uint32_t seat_no)
+{
+ sint_t sResult = 0;
+ str_t pchPathTemp [PATH_ABS_MAX_SIZE];
+ str_t pchLocalCachePath [PATH_ABS_MAX_SIZE];
+ sint_t s32SizePathTemp = sizeof(pchPathTemp);
+ sint_t s32SizeCachePath = sizeof(pchLocalCachePath);
+
+ /* copy folders; */
+
+ /* create source path; */
+ (void)memset(pchPathTemp, 0, (size_t)s32SizePathTemp);
+ (void)snprintf(pchPathTemp, (size_t)s32SizePathTemp, gLocalCachePath, "", "");
+
+ sResult = persadmin_priv_data_backup_create_node(backup_name, pchPathTemp, applicationID);
+ if( 0 > sResult )
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_application -"), DLT_STRING("persadmin_priv_data_backup_create_node"),
+ DLT_STRING(pchPathTemp), DLT_STRING(applicationID), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if( 0 <= sResult )
+ {
+ sResult = persadmin_priv_data_backup_create_user(backup_name, pchPathTemp, applicationID, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_application -"), DLT_STRING("persadmin_priv_data_backup_create_user"),
+ DLT_STRING(pchPathTemp), DLT_STRING(applicationID), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if(0 <= sResult)
+ {
+ /* copy RCT file */
+
+ /* /Data/mnt-c/\<appId\>/\<database_name\> */
+ (void)memset(pchLocalCachePath, 0, (size_t)s32SizeCachePath);
+ (void)snprintf(pchLocalCachePath, (size_t)s32SizeCachePath, gLocalCachePath, applicationID, gResTableCfg);
+
+ /* \<backup_name\>/Data/mnt-c/\<appId\>/\<database_name\> */
+ (void)memset(pchPathTemp, 0, (size_t)s32SizePathTemp);
+ (void)snprintf(pchPathTemp, (size_t)s32SizePathTemp, "%s%s", backup_name, pchLocalCachePath);
+
+ sResult = persadmin_copy_file(pchLocalCachePath, pchPathTemp);
+ if( 0 > sResult )
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_application -"), DLT_STRING("persadmin_copy_file"),
+ DLT_STRING(pchLocalCachePath), DLT_STRING(pchPathTemp), DLT_STRING(applicationID), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+ }
+
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_application_cached() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static long persadmin_priv_data_backup_create_application_write_through(pstr_t backup_name, pstr_t applicationID, uint32_t user_no, uint32_t seat_no)
+{
+ sint_t sResult = 0;
+ str_t pchPathTemp [PATH_ABS_MAX_SIZE];
+ str_t pchLocalWtPath [PATH_ABS_MAX_SIZE];
+ sint_t s32SizePathTemp = sizeof(pchPathTemp);
+ sint_t s32SizeLocalWtPath = sizeof(pchLocalWtPath);
+
+
+ /* copy folders; */
+
+ /* create source path; */
+ (void)memset(pchPathTemp, 0, (size_t)s32SizePathTemp);
+ (void)snprintf(pchPathTemp, (size_t)s32SizePathTemp, gLocalWtPath, "", "");
+
+ sResult = persadmin_priv_data_backup_create_node(backup_name, pchPathTemp, applicationID);
+ if( 0 > sResult )
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_application -"), DLT_STRING("persadmin_priv_data_backup_create_node"),
+ DLT_STRING(pchPathTemp), DLT_STRING(applicationID), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if( 0 <= sResult )
+ {
+ sResult = persadmin_priv_data_backup_create_user(backup_name, pchPathTemp, applicationID, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_application -"), DLT_STRING("persadmin_priv_data_backup_create_user"),
+ DLT_STRING(pchPathTemp), DLT_STRING(applicationID), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if(0 <= sResult)
+ {
+ /* /Data/mnt-wt/\<appId\>/\<database_name\> */
+ (void)memset(pchLocalWtPath, 0, (size_t)s32SizeLocalWtPath);
+ (void)snprintf(pchLocalWtPath, (size_t)s32SizeLocalWtPath, gLocalWtPath, applicationID, gResTableCfg);
+
+ /* \<backup_name\>/Data/mnt-wt/\<appId\>/\<database_name\> */
+ (void)memset(pchPathTemp, 0, (size_t)s32SizePathTemp);
+ (void)snprintf(pchPathTemp, (size_t)s32SizePathTemp, "%s%s", backup_name, pchLocalWtPath);
+
+ sResult = persadmin_copy_file(pchLocalWtPath, pchPathTemp);
+ if( 0 > sResult )
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_application -"), DLT_STRING("persadmin_copy_file"),
+ DLT_STRING(pchLocalWtPath), DLT_STRING(pchPathTemp), DLT_STRING(applicationID), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+ }
+
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_application_write_through() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static long persadmin_priv_data_backup_create_user_all(pstr_t backup_name, uint32_t user_no, uint32_t seat_no)
+{
+ sint_t sResult = 0;
+ bool_t bCanContinue = true;
+ str_t* pchNamesApp = NIL;
+
+ /* check input parameters; */
+ if( (!IS_VALID_USER(user_no)) || (!IS_VALID_SEAT(seat_no)) )
+ {
+ /* set result; */
+ sResult = E_INVALID_PARAMS;
+ /* set can continue; */
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user_all -"), DLT_STRING("invalid input parameters"), DLT_INT(user_no), DLT_INT(seat_no));
+ }
+
+ /* backup shared + application data: /User(s); */
+
+ if( true == bCanContinue )
+ {
+ /* common for CACHED and WRITE-THROUGH - get all application names; */
+ sResult = persadmin_list_application_folders_get_size("");
+ if( 0 >= sResult )
+ {
+ /* set can continue; */
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user_all -"), DLT_STRING("persadmin_list_application_folders_get_size"),
+ DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+
+ if( true == bCanContinue )
+ {
+ pchNamesApp = (str_t*) malloc((size_t)sResult * sizeof(str_t)); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if( NIL == pchNamesApp )
+ {
+ /* set result; */
+ sResult = E_TO_BE_DEFINED;
+ /* set can continue; */
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user_all -"), DLT_STRING("can not allocate"),
+ DLT_INT(sResult), DLT_STRING("bytes"));
+ }
+ else
+ {
+ sResult = persadmin_list_application_folders("", pchNamesApp, sResult);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user_all -"), DLT_STRING("persadmin_list_application_folders"),
+ DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+ }
+
+ if( true == bCanContinue )
+ {
+ /* CACHED; */
+ sResult = persadmin_priv_data_backup_create_user_all_cached(backup_name, user_no, seat_no, pchNamesApp);
+ if( 0 <= sResult )
+ {
+ /* WRITE-THROUGH; */
+ sResult = persadmin_priv_data_backup_create_user_all_write_through(backup_name, user_no, seat_no, pchNamesApp);
+ }
+ if( 0 <= sResult )
+ {
+ /* common for CACHED and WRITE-THROUGH - save local & shared data bases; */
+ sResult = persadmin_priv_data_backup_create_user_all_databases(backup_name, user_no, seat_no, pchNamesApp);
+ }
+ }
+
+ /* free the memory; */
+ if( NIL != pchNamesApp )
+ {
+ free(pchNamesApp); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pchNamesApp = NIL;
+ }
+
+ /* TODO: filter entire destination path and delete files, whose extensions are not in the BackupFileList.info; */
+
+ /* return result; */
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_user_all() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static long persadmin_priv_data_backup_create_user_all_cached(pstr_t backup_name, uint32_t user_no, uint32_t seat_no, pstr_t pchNamesApp)
+{
+ sint_t sResult = 0;
+ bool_t bCanContinue = true;
+
+ str_t pchLocalCachePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME]; /* strlen(gLocalCachePath) + 1 */
+ sint_t s32Size = (sint_t) sizeof(pchLocalCachePath);
+ str_t* pchNamesAppTemp = pchNamesApp;
+
+ /* create source path; */
+ (void)memset(pchLocalCachePath, 0, (size_t)s32Size);
+ (void)snprintf(pchLocalCachePath, (size_t)s32Size, gLocalCachePath, "", "");
+
+ /* ("/backup", "applicationID", "/Data/mnt-c", , ); */
+ sResult = persadmin_data_backup_create_user_all_local_for_storage(backup_name, pchNamesAppTemp, pchLocalCachePath, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user_all -"), DLT_STRING("persadmin_data_backup_create_user_all_local_for_storage"),
+ DLT_STRING(pchLocalCachePath), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if( true == bCanContinue )
+ {
+ str_t pchSharedPublicCachePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME]; /* strlen(gSharedPublicCachePath) + 1 */
+ s32Size = (sint_t) sizeof(pchSharedPublicCachePath);
+
+ /* create source path; */
+ (void)memset(pchSharedPublicCachePath, 0, (size_t)s32Size);
+ (void)snprintf(pchSharedPublicCachePath, (size_t)s32Size, gSharedPublicCachePath, "");
+
+ /* ("/backup", ","/Data/mnt-c", "/Data/mnt-c/shared/public", "/Data/mnt-c/shared/group/", , ) */
+ sResult = persadmin_data_backup_create_user_all_shared_for_storage(backup_name, pchLocalCachePath, pchSharedPublicCachePath, gSharedCachePathRoot, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user_all -"), DLT_STRING("persadmin_data_backup_create_user_all_shared_for_storage"),
+ DLT_STRING(pchLocalCachePath), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_user_all_cached() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static long persadmin_priv_data_backup_create_user_all_write_through(pstr_t backup_name, uint32_t user_no, uint32_t seat_no, pstr_t pchNamesApp)
+{
+ sint_t sResult = 0;
+ bool_t bCanContinue = true;
+
+ str_t pchLocalWtPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME]; /* strlen(gLocalWtPath) + 1 */
+ sint_t s32Size = (sint_t)sizeof(pchLocalWtPath);
+ str_t* pchNamesAppTemp = pchNamesApp;
+
+ /* create source path; */
+ (void)memset(pchLocalWtPath, 0, (size_t)s32Size);
+ (void)snprintf(pchLocalWtPath, (size_t)s32Size, gLocalWtPath, "", "");
+
+ /* ("/backup", "applicationID", "/Data/mnt-wt", , ); */
+ sResult = persadmin_data_backup_create_user_all_local_for_storage(backup_name, pchNamesAppTemp, pchLocalWtPath, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user_all -"), DLT_STRING("persadmin_data_backup_create_user_all_local_for_storage"),
+ DLT_STRING(pchLocalWtPath), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if( true == bCanContinue )
+ {
+ str_t pchSharedPublicWtPath[PERS_ORG_MAX_LENGTH_PATH_FILENAME]; /* strlen(gSharedPublicWtPath) + 1 */
+ s32Size = (sint_t)sizeof(pchSharedPublicWtPath);
+
+ /* create source path; */
+ (void)memset(pchSharedPublicWtPath, 0, (size_t)s32Size);
+ (void)snprintf(pchSharedPublicWtPath, (size_t)s32Size, gSharedPublicWtPath, "");
+
+ /* ("/backup", ","/Data/mnt-wt", "/Data/mnt-wt/shared/public", "/Data/mnt-wt/shared/group/", , ) */
+ sResult = persadmin_data_backup_create_user_all_shared_for_storage(backup_name, pchLocalWtPath, pchSharedPublicWtPath, gSharedCachePathRoot, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user_all -"), DLT_STRING("persadmin_data_backup_create_user_all_shared_for_storage"),
+ DLT_STRING(pchLocalWtPath), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_user_all_write_through() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static long persadmin_priv_data_backup_create_user_all_databases(pstr_t backup_name, uint32_t user_no, uint32_t seat_no, pstr_t pchNamesApp)
+{
+ sint_t sResult = 0;
+ bool_t bCanContinue = true;
+
+ str_t* pchNamesAppTemp = pchNamesApp;
+
+ /* go through all applications and save local data; */
+ while( (0 != *pchNamesAppTemp) && (true == bCanContinue) )
+ {
+ /* save & filter local databases; */
+ sResult = persadmin_priv_data_backup_create_databases(backup_name, PersASSelectionType_User, pchNamesAppTemp, PersistenceStorage_local, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_application -"), DLT_STRING("persadmin_priv_data_backup_create_databases - local"),
+ DLT_STRING(pchNamesAppTemp), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if( true == bCanContinue )
+ {
+ /* move on to the next data base; */
+ pchNamesAppTemp += (strlen(pchNamesAppTemp) + 1 /* \0 */);
+ }
+ }
+
+ if( true == bCanContinue )
+ {
+ /* go through all applications and save shared data; */
+ sResult = persadmin_priv_data_backup_create_databases(backup_name, PersASSelectionType_User, "", PersistenceStorage_shared, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_application -"), DLT_STRING("persadmin_priv_data_backup_create_databases - shared"),
+ DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_user_all_databases() */
+
+
+static long persadmin_priv_data_backup_create_node(pconststr_t backup_name, pconststr_t pchBckupPathSrc, pconststr_t pchLocalPublicGroup)
+{
+ sint_t sResult = 0;
+ str_t pchPathTempSrc [PATH_ABS_MAX_SIZE];
+ str_t pchPathTempDst [PATH_ABS_MAX_SIZE];
+ sint_t s32SizePathTemp = PATH_ABS_MAX_SIZE;
+
+ /* /Node; */
+
+ /* reset; */
+ (void)memset(pchPathTempSrc, 0, (size_t)s32SizePathTemp);
+ (void)memset(pchPathTempDst, 0, (size_t)s32SizePathTemp);
+
+ /* create source; */
+ (void)snprintf(pchPathTempSrc, (size_t)s32SizePathTemp, "%s%s%s", pchBckupPathSrc, pchLocalPublicGroup, gNode);
+
+ /* check if /Node folder exists; */
+ if( 0 == persadmin_check_if_file_exists(pchPathTempSrc, true) )
+ {
+ /* create destination; */
+ (void)snprintf(pchPathTempDst, (size_t)s32SizePathTemp, "%s%s", backup_name, pchPathTempSrc);
+
+ /* copy /Node to destination; */
+ sResult = persadmin_copy_folder(pchPathTempSrc, pchPathTempDst, PersadminFilterAll, true);
+ if( 0 > sResult )
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_node -"), DLT_STRING("persadmin_copy_folder"),
+ DLT_STRING(pchPathTempSrc), DLT_STRING("ERR"),DLT_INT(sResult));
+ }
+ else
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_node -"), DLT_STRING("backed up"),
+ DLT_STRING(pchPathTempSrc), DLT_STRING("to"), DLT_STRING(pchPathTempDst));
+ }
+ }
+ else
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_node -"),
+ DLT_STRING(pchPathTempSrc), DLT_STRING("does not exist"));
+ }
+
+ /* return result; */
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_node() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static long persadmin_priv_data_backup_create_user(pconststr_t backup_name, pconststr_t pchBckupPathSrc, pconststr_t pchLocalPublicGroup, uint32_t user_no, uint32_t seat_no)
+{
+ sint_t sResult = 0;
+ str_t pchPathTempSrc [PATH_ABS_MAX_SIZE];
+ str_t pchPathTempDst [PATH_ABS_MAX_SIZE];
+ sint_t s32SizePathTemp = PATH_ABS_MAX_SIZE;
+
+ /* /User(s); */
+
+ /* reset; */
+ (void)memset(pchPathTempSrc, 0, (size_t)s32SizePathTemp);
+ (void)memset(pchPathTempDst, 0, (size_t)s32SizePathTemp);
+
+ /* create source; */
+ /* all users & all seats; */
+ if( (PERSIST_SELECT_ALL_USERS == user_no) && (PERSIST_SELECT_ALL_SEATS == seat_no) )
+ {
+ (void)snprintf(pchPathTempSrc, (size_t)s32SizePathTemp, "%s%s%s", pchBckupPathSrc, pchLocalPublicGroup, gUser);
+ }
+ /* only one user & all seats; */
+ if( (PERSIST_SELECT_ALL_USERS != user_no) && (PERSIST_SELECT_ALL_SEATS == seat_no) )
+ {
+ (void)snprintf(pchPathTempSrc, (size_t)s32SizePathTemp, "%s%s%s%d", pchBckupPathSrc, pchLocalPublicGroup, gUser, user_no);
+ }
+ /* only one user & one seat; */
+ if( (PERSIST_SELECT_ALL_USERS != user_no) && (PERSIST_SELECT_ALL_SEATS != seat_no) )
+ {
+ (void)snprintf(pchPathTempSrc, (size_t)s32SizePathTemp, "%s%s%s%d%s%d", pchBckupPathSrc, pchLocalPublicGroup, gUser, user_no, gSeat, seat_no);
+ }
+
+ if( 0 == persadmin_check_if_file_exists(pchPathTempSrc, true) )
+ {
+ /* create destination; */
+ (void)snprintf(pchPathTempDst, (size_t)s32SizePathTemp, "%s%s", backup_name, pchPathTempSrc);
+
+ /* copy /User(s) to destination; */
+ sResult = persadmin_copy_folder(pchPathTempSrc, pchPathTempDst, PersadminFilterAll, true);
+ if( 0 > sResult )
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user -"), DLT_STRING("persadmin_copy_folder"),
+ DLT_STRING(pchPathTempSrc), DLT_STRING("ERR"),DLT_INT(sResult));
+ }
+ else
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user -"), DLT_STRING("backed up"),
+ DLT_STRING(pchPathTempSrc), DLT_STRING("to"), DLT_STRING(pchPathTempDst));
+ }
+ }
+ else
+ {
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_user -"),
+ DLT_STRING(pchPathTempSrc), DLT_STRING("does not exist"));
+ }
+
+ /* return result; */
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_user() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static long persadmin_priv_data_backup_create_databases(pconststr_t backup_name, PersASSelectionType_e type, pconststr_t applicationID, PersistenceStorage_e eStorage, uint32_t user_no, uint32_t seat_no)
+{
+ sint_t sResult = 0;
+ bool_t bCanContinue = true;
+ str_t pchDBPaths [PATHS_DB_MAX_SIZE];
+ sint_t s32SizeDBPaths = sizeof(pchDBPaths);
+
+ /* reset; */
+ (void)memset(pchDBPaths, 0, (size_t)s32SizeDBPaths);
+
+ if( (NIL == applicationID) ||
+ (PersistenceStorage_LastEntry <= eStorage) || (PersistenceStorage_local > eStorage) )
+ {
+ /* set error; */
+ sResult = E_INVALID_PARAMS;
+ /* set can continue; */
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_databases -"), DLT_STRING("invalid input parameters"));
+ }
+
+ if( true == bCanContinue )
+ {
+ /* request data bases; */
+ sResult = persadmin_get_all_db_paths_with_names("", applicationID, eStorage, pchDBPaths, s32SizeDBPaths);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_databases -"), DLT_STRING("persadmin_get_all_db_paths_with_names"),
+ DLT_STRING(applicationID), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+
+ if( true == bCanContinue )
+ {
+ str_t pchPathTemp [PATH_ABS_MAX_SIZE];
+ sint_t s32SizePathTemp = sizeof(pchPathTemp);
+ str_t* pchDB = pchDBPaths;
+
+ /* save the actual data size; */
+ s32SizeDBPaths = sResult;
+
+ /* go through all data bases & update them; */
+ while( (0 != *pchDB) && (true == bCanContinue) )
+ {
+ /* reset; */
+ (void)memset(pchPathTemp, 0, (size_t)s32SizePathTemp);
+ /* create destination path; */
+ (void)snprintf(pchPathTemp, (size_t)s32SizePathTemp, "%s%s", backup_name, pchDB);
+
+ /* filter destination data base based on the user/seat information; */
+ sResult = persadmin_copy_keys_by_filter(type, pchPathTemp, pchDB, user_no, seat_no);
+
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_create_databases -"), DLT_STRING("persadmin_get_all_db_paths_with_names"),
+ DLT_STRING(pchPathTemp), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if( true == bCanContinue )
+ {
+ /* move on to the next data base; */
+ pchDB += (strlen(pchDB) + 1 /* \0 */);
+ }
+ }
+ }
+
+ /* return result; */
+ return sResult;
+
+} /* persadmin_priv_data_backup_create_databases() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 7-SSW_Administrator_0004*/
+
+
+static long persadmin_data_backup_create_user_all_local_for_storage(pconststr_t backup_name, pstr_t pchNamesAppTemp, pconststr_t pchPathTemp, uint32_t user_no, uint32_t seat_no)
+{
+ sint_t sResult = 0;
+ bool_t bCanContinue = true;
+ str_t pchPathTempSrc [PATH_ABS_MAX_SIZE];
+ str_t pchPathTempDst [PATH_ABS_MAX_SIZE];
+ sint_t s32SizePathTemp = PATH_ABS_MAX_SIZE;
+
+ /* go through all applications and save local data; */
+ while( (0 != *pchNamesAppTemp) && (true == bCanContinue) )
+ {
+ /* copy folders; */
+ /* persadmin_priv_data_backup_create_user("/backup", "/Data/mnt-c/", "applicationID", user_no, seat_no); */
+ /* persadmin_priv_data_backup_create_user("/backup", "/Data/mnt-wt/", "applicationID", user_no, seat_no); */
+ sResult = persadmin_priv_data_backup_create_user(backup_name, pchPathTemp, pchNamesAppTemp, user_no, seat_no);
+
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_data_backup_create_user_all_local_for_storage -"), DLT_STRING("persadmin_priv_data_backup_create_user"),
+ DLT_STRING(pchPathTemp), DLT_STRING(pchNamesAppTemp), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if(true == bCanContinue)
+ {
+ /* copy RCT file */
+
+ /* /Data/mnt-c/\<appId\>/\<database_name\> */
+ /* /Data/mnt-wt/\<appId\>/\<database_name\> */
+ (void)memset(pchPathTempSrc, 0, (size_t)s32SizePathTemp);
+ (void)snprintf(pchPathTempSrc, (size_t)s32SizePathTemp, "%s%s%s", pchPathTemp, pchNamesAppTemp, gResTableCfg);
+
+ /* \<backup_name\>/Data/mnt-c/\<appId\>/\<database_name\> */
+ /* \<backup_name\>/Data/mnt-wt/\<appId\>/\<database_name\> */
+ (void)memset(pchPathTempDst, 0, (size_t)s32SizePathTemp);
+ (void)snprintf(pchPathTempDst, (size_t)s32SizePathTemp, "%s%s", backup_name, pchPathTempSrc);
+
+ sResult = persadmin_copy_file(pchPathTempSrc, pchPathTempDst);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_data_backup_create_user_all_local_for_storage -"), DLT_STRING("persadmin_copy_file"),
+ DLT_STRING(pchPathTempSrc), DLT_STRING(pchPathTempDst), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+
+ if( true == bCanContinue )
+ {
+ /* export links for each application; */
+
+ /* reset; */
+ (void)memset(pchPathTempSrc, 0, (size_t)s32SizePathTemp);
+ (void)memset(pchPathTempDst, 0, (size_t)s32SizePathTemp);
+ /* /Data/mnt-c/applicationID; */
+ /* /Data/mnt-wt/applicationID; */
+ (void)snprintf(pchPathTempSrc, (size_t)s32SizePathTemp, "%s%s", pchPathTemp, pchNamesAppTemp);
+ /* /backup/Data/mnt-c/applicationID; */
+ /* /backup/Data/mnt-wt/applicationID; */
+ (void)snprintf(pchPathTempDst, (size_t)s32SizePathTemp, "%s%s", backup_name, pchPathTempSrc);
+
+ sResult = persadmin_export_links(pchPathTempSrc, pchPathTempDst);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_data_backup_create_user_all_local_for_storage -"), DLT_STRING("persadmin_export_links"),
+ DLT_STRING(pchPathTempSrc), DLT_STRING(pchPathTempDst), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+
+ if( true == bCanContinue )
+ {
+ /* move on to the next data base; */
+ pchNamesAppTemp += (strlen(pchNamesAppTemp) + 1 /* \0 */);
+ }
+ }
+
+ /* return result; */
+ return sResult;
+
+} /* persadmin_data_backup_create_user_all_local_for_storage() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static long persadmin_data_backup_create_user_all_shared_for_storage(pconststr_t backup_name, pconststr_t pchLocalPath, pconststr_t pchSharedPublicPath, pconststr_t pchSharedGroupPath, uint32_t user_no, uint32_t seat_no)
+{
+ sint_t sResult = 0;
+ bool_t bCanContinue = true;
+ str_t pchPathTempSrc [PATH_ABS_MAX_SIZE];
+ str_t pchPathTempDst [PATH_ABS_MAX_SIZE];
+ sint_t s32SizePathTemp = PATH_ABS_MAX_SIZE;
+
+ /* save shared user data; */
+ if( 0 == persadmin_check_if_file_exists(pchSharedPublicPath, true) )
+ {
+ /* persadmin_priv_data_backup_create_user("/backup", "/Data/mnt-c", "/shared/public", user_no, seat_no); */
+ /* persadmin_priv_data_backup_create_user("/backup", "/Data/mnt-wt", "/shared/public", user_no, seat_no); */
+ sResult = persadmin_priv_data_backup_create_user(backup_name, pchLocalPath, gSharedPublicRelativePath, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_data_backup_create_user_all_shared_for_storage -"), DLT_STRING("persadmin_priv_data_backup_create_user"),
+ DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if(true == bCanContinue)
+ {
+ /* copy RCT file */
+
+ /* /Data/mnt-c/shared/public/\<database_name\> */
+ /* /Data/mnt-wt/shared/public/\<database_name\> */
+ (void)memset(pchPathTempSrc, 0, (size_t)s32SizePathTemp);
+ (void)snprintf(pchPathTempSrc, (size_t)s32SizePathTemp, "%s%s%s", pchLocalPath, gSharedPublicRelativePath, gResTableCfg);
+
+ /* /<backup_name\>/Data/mnt-c/\<appId\>/\<database_name\> */
+ /* /<backup_name\>/Data/mnt-wt/\<appId\>/\<database_name\> */
+ (void)memset(pchPathTempDst, 0, (size_t)s32SizePathTemp);
+ (void)snprintf(pchPathTempDst, (size_t)s32SizePathTemp, "%s%s", backup_name, pchPathTempSrc);
+
+ sResult = persadmin_copy_file(pchPathTempSrc, pchPathTempDst);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_data_backup_create_user_all_shared_for_storage -"), DLT_STRING("persadmin_copy_file"),
+ DLT_STRING(pchPathTempSrc), DLT_STRING(pchPathTempDst), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+ }
+
+ if( (0 == persadmin_check_if_file_exists(pchSharedGroupPath, true)) &&
+ (true == bCanContinue))
+ {
+ pstr_t pstrBufferTemp = NIL;
+ sint_t s32SizeTemp = 0;
+ str_t pchSharedGroupRelativePath [PATH_RELATIVE_MAX_SIZE];
+ sint_t s32SizePath = sizeof(pchSharedGroupRelativePath);
+
+ /* list all folders; */
+ sint_t s32FolderSize = 0;
+ pstr_t pstrBuffer = NIL;
+
+ /* list source folder; */
+ sResult = s32FolderSize = persadmin_list_folder_get_size(pchSharedGroupPath, PersadminFilterFolders, false);
+
+ if( 0 > s32FolderSize )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_data_backup_create_user_all_shared_for_storage -"), DLT_STRING("persadmin_list_folder_get_size"),
+ DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if( true == bCanContinue )
+ {
+ pstrBuffer = (pstr_t) malloc((size_t)s32FolderSize * sizeof(str_t)); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if( NIL != pstrBuffer )
+ {
+ /* list folder "/Data/mnt-c/shared/group/"; */
+ /* list folder "/Data/mnt-wt/shared/group/"; */
+ sResult = persadmin_list_folder(pchSharedGroupPath, pstrBuffer, s32FolderSize, PersadminFilterFolders, false);
+ if( s32FolderSize != sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_data_backup_create_user_all_shared_for_storage -"), DLT_STRING("persadmin_list_folder"),
+ DLT_STRING("ERR"), DLT_INT(sResult), DLT_INT(s32FolderSize));
+ }
+ else
+ {
+ pstrBufferTemp = pstrBuffer;
+ }
+ }
+ else
+ {
+ bCanContinue = false;
+ }
+ }
+
+ while( (s32SizeTemp < s32FolderSize) && (true == bCanContinue) )
+ {
+ /* TODO: optimize so that only groupID is appended -> /shared/group/ is common; */
+ /* create source relative path "shared/group/10"; */
+ (void)memset(pchSharedGroupRelativePath, 0, (size_t)s32SizePath);
+ (void)snprintf(pchSharedGroupRelativePath, (size_t)s32SizePath, "%s%s", gSharedGroupRelativePath, pstrBufferTemp);
+
+ /* for each folder create the relative path "/shared/group/10" & backup user data; */
+ /* persadmin_priv_data_backup_create_user("/backup", "/Data/mnt-c", "/shared/group/10", user_no, seat_no); */
+ sResult = persadmin_priv_data_backup_create_user(backup_name, pchLocalPath, pchSharedGroupRelativePath, user_no, seat_no);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ /* some info; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_data_backup_create_user_all_shared_for_storage -"), DLT_STRING("persadmin_priv_data_backup_create_user"),
+ DLT_STRING(pstrBufferTemp), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+
+ if(true == bCanContinue)
+ {
+ /* copy RCT file */
+
+ /* /Data/mnt-c/shared/group/\<group_id\>\<database_name\> */
+ /* /Data/mnt-wt/shared/group/\<group_id\>\<database_name\> */
+ (void)memset(pchPathTempSrc, 0, (size_t)s32SizePathTemp);
+ (void)snprintf(pchPathTempSrc, (size_t)s32SizePathTemp, "%s%s%s", pchLocalPath, pchSharedGroupRelativePath, gResTableCfg);
+
+
+ /* \<backup_name\>/Data/mnt-c/shared/group/\<group_id\>\<database_name\> */
+ /* \<backup_name\>/Data/mnt-wt/shared/group/\<group_id\>\<database_name\> */
+ (void)memset(pchPathTempDst, 0, (size_t)s32SizePathTemp);
+ (void)snprintf(pchPathTempDst, (size_t)s32SizePathTemp, "%s%s", backup_name, pchPathTempSrc);
+
+ sResult = persadmin_copy_file(pchPathTempSrc, pchPathTempDst);
+ if( 0 > sResult )
+ {
+ bCanContinue = false;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_data_backup_create_user_all_shared_for_storage -"), DLT_STRING("persadmin_copy_file"),
+ DLT_STRING(pchPathTempSrc), DLT_STRING(pchPathTempDst), DLT_STRING("ERR"), DLT_INT(sResult));
+ }
+ }
+
+ if( true == bCanContinue )
+ {
+ /* move on to the next group "10", "20" ...; */
+ s32SizeTemp += ((sint_t)strlen(pstrBufferTemp) + 1 /* \0 */);
+ pstrBufferTemp += s32SizeTemp;
+ }
+ }
+
+ /* free the memory; */
+ if( NIL != pstrBuffer )
+ {
+ free(pstrBuffer); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pstrBuffer = NIL;
+ }
+ }
+
+ /* return result; */
+ return sResult;
+
+} /* persadmin_data_backup_create_user_all_shared_for_storage() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 7-SSW_Administrator_0004*/
+
+
+static void persadmin_priv_data_backup_archive(PersASSelectionType_e type, pstr_t backup_name, pstr_t applicationID)
+{
+ sint_t sResult = 0;
+
+ if( 0 > persadmin_check_if_file_exists(BACKUP_LOCATION, true) )
+ {
+ sResult = persadmin_create_folder(BACKUP_LOCATION);
+ }
+
+ if( 0 == sResult )
+ {
+ str_t pchPathCompressTo [PATH_ABS_MAX_SIZE];
+ str_t pchPathCompressFrom [PATH_ABS_MAX_SIZE];
+
+ (void)snprintf(pchPathCompressFrom, sizeof(pchPathCompressFrom), "%s%s", backup_name, PERS_ORG_ROOT_PATH);
+
+ /* create the tar name; */
+ switch( type )
+ {
+ case PersASSelectionType_Application:
+ {
+ /* if( IS_VALID_APPL(applicationID) ) already checked in persadmin_priv_data_backup_create_application */
+ (void)snprintf(pchPathCompressTo, sizeof(pchPathCompressTo), "%s%s%s", BACKUP_LOCATION, applicationID, BACKUP_FORMAT);
+ break;
+ }
+ case PersASSelectionType_User:
+ {
+ (void)snprintf(pchPathCompressTo, sizeof(pchPathCompressTo), "%s%s%s", BACKUP_LOCATION, "user", BACKUP_FORMAT);
+ break;
+ }
+ case PersASSelectionType_All:
+ {
+ (void)snprintf(pchPathCompressTo, sizeof(pchPathCompressTo), "%s%s%s", BACKUP_LOCATION, "all", BACKUP_FORMAT);
+ break;
+ }
+ default:
+ {
+ /* nothing to do */
+ break;
+ }
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_archive -"),
+ DLT_STRING("create"),
+ DLT_STRING("<"),
+ DLT_STRING(pchPathCompressTo),
+ DLT_STRING(">"),
+ DLT_STRING("from"),
+ DLT_STRING("<"),
+ DLT_STRING(pchPathCompressFrom),
+ DLT_STRING(">"));
+
+ /* usage persadmin_compress("/path/to/compress/to/archive_name.tgz", "/path/from/where/to/compress"); */
+ /* return 0 for success, negative value otherwise; */
+ sResult = persadmin_compress(pchPathCompressTo, pchPathCompressFrom);
+ if( 0 > sResult )
+ {
+ /* warning; */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR), DLT_STRING("persadmin_priv_data_backup_archive -"), DLT_INT(sResult));
+ }
+ }
+
+} /* persadmin_priv_data_backup_archive() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
diff --git a/Administrator/src/ssw_pers_admin_common.c b/Administrator/src/ssw_pers_admin_common.c
new file mode 100644
index 0000000..0b0d640
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_common.c
@@ -0,0 +1,51 @@
+/********************************************************************************************************************* * * Copyright (C) 2012 Continental Automotive Systems, Inc. * * Author: Ionut.Ieremie@continental-corporation.com * * Implementation of funtions declaredin ssw_pers_admin_common.h * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Date Author Reason * 2013.03.20 uidu0250 CSP_WZ#2250: Provide compress/uncompress functionality * 2013.02.07 uidu0250 CSP_WZ#2220: Removed Helplibs dependency (CRC16 checksum calculation) * 2013.01.22 uidn3591 CSP_WZ#2060: Implemented wrappers over libarchive to compress/uncompress files into/from an archive * 2013.01.04 uidu0250 CSP_WZ#2060: Switched get_hash_for_file implementation from using CRC32 to using CRC16 provided by HelpLibs * 2012.11.15 uidl9757 CSP_WZ#1280: Use protected interface pers_data_organization_if.h * 2012.11.16 uidn3565 CSP_WZ#1280: Added implementation for - persadmin_list_application_folders - persadmin_list_application_folders_get_size * 2012.11.15 uidl9757 CSP_WZ#1280: Created * **********************************************************************************************************************/
+/* ---------------------- include files --------------------------------- */ #include "persComTypes.h" #include <stddef.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> /* compress/uncompress */ #include <archive.h> #include <archive_entry.h> #include "malloc.h" #include "ssw_pers_admin_common.h" #include "ssw_pers_admin_files_helper.h" #include "persComDataOrg.h" #include "persistence_admin_service.h"
+ /* ---------------------- local definitions -------------------------------- */ #define READ_BUFFER_LENGTH (16384) #define COPY_BUFFER_LENGTH (128) #define PATH_ABS_MAX_SIZE ( 512) #define PERSADMIN_POLICY_MARKER_CACHED PERS_ORG_CACHE_FOLDER_NAME #define PERSADMIN_POLICY_MARKER_WT PERS_ORG_WT_FOLDER_NAME
+#define CRC16_FILE_CHUNK_SIZE (10 * 1024) /* TO DO : This should be published in a protected interface */ #define PERSADMIN_LINKS_INFO_FILENAME "linksInfo.lnk"
+#define GetApplicationRootPath( RootPath, FullPath ) \ int pathLength = strlen( RootPath ); \ char FullPath[ strlen( gLocalCachePath ) + pathLength + sizeof( StringTerminator ) ]; \ snprintf( FullPath, sizeof( FullPath ), "%s", RootPath ); \ snprintf( FullPath + pathLength, sizeof( FullPath ) - pathLength, gLocalCachePath, "", "" )
+/* ---------------------- local types -------------------------------------- */
+ /* ---------------------- local functions ---------------------------------- */ static sint_t persadmin_common_extract_group_id(pstr_t linkName) ; static void persadmin_common_remove_endofline(pstr_t line) ; static bool_t persadmin_is_shared_folder( pconststr_t name, int length ); static sint_t persadmin_copy_data(struct archive *ar, struct archive *aw);
+ /* ---------------------- local variables ---------------------------------- */ //moved to "ssw_pers_admin_common.h" //extern const char StringTerminator;
+ /* * export the application's information about links (to groups and public data) * returns the number of exported links, or a negative value in case of error */ sint_t persadmin_export_links(pstr_t absPathApplicationFolder, pstr_t absPathExportFolder) { pstr_t FuncName = "persadmin_export_links:" ; bool_t bEverythingOK = true ; pstr_t buffer = NIL ; bool_t bNothingToExport = false ; sint_t exportedLinks = 0 ; sint_t neededBufferSize = 0 ; FILE * fileExport = NIL ;
+ if( (NIL == absPathApplicationFolder) || (NIL == absPathExportFolder)) { bEverythingOK = false ; printf("\n%s NIL param \n", FuncName) ; } else { if(0 != persadmin_check_if_file_exists(absPathApplicationFolder, true)) { bEverythingOK = false ; printf("\n%s folder does not exist (%s) \n", FuncName, absPathApplicationFolder) ; } else { if(0 != persadmin_check_if_file_exists(absPathExportFolder, true)) { bEverythingOK = false ; printf("\n%s folder does not exist (%s) \n", FuncName, absPathExportFolder) ; } } }
+ if(bEverythingOK) { neededBufferSize = persadmin_list_folder_get_size(absPathApplicationFolder, PersadminFilterFilesLink, false) ; if(neededBufferSize > 0) { buffer = (pstr_t)malloc(neededBufferSize*sizeof(str_t)) ; if(NIL == buffer) { bEverythingOK = false ; } else { sint_t listingSize = persadmin_list_folder(absPathApplicationFolder, buffer, neededBufferSize, PersadminFilterFilesLink, false) ; if(neededBufferSize != listingSize) { bEverythingOK = false ; printf("\n%s persadmin_list_folder(%s) returned %d (expected %d) \n", FuncName, absPathApplicationFolder, listingSize, neededBufferSize) ; } } } else { if(0 == neededBufferSize) { /* no links to export */ bNothingToExport = true ; } else { bEverythingOK = false ; printf("\n%s persadmin_list_folder_get_size(<%s>, FilterFilesLink, false) failed\n", FuncName, absPathApplicationFolder) ; } } }
+ if(bEverythingOK && (! bNothingToExport)) { /* create the export file */ str_t completePath[PERSADMIN_MAX_PATH_LENGHT] ; sint_t lenPathExport = strlen(absPathExportFolder) ; sint_t lenLinkFilename = strlen(PERSADMIN_LINKS_INFO_FILENAME) ;
+ if( (lenPathExport + 1 + lenLinkFilename) < PERSADMIN_MAX_PATH_LENGHT ) { strncpy(completePath, absPathExportFolder, sizeof(completePath)) ; if('/' != completePath[lenPathExport -1]) { strncat(completePath, "/", sizeof(completePath)) ; } strncat(completePath, PERSADMIN_LINKS_INFO_FILENAME, sizeof(completePath)) ;
+ fileExport = fopen(completePath, "w") ; if(NIL == fileExport) { bEverythingOK = false ; printf("\n%s fopen(<%s>, w) errno = %s\n", FuncName, completePath, strerror(errno)) ; } } else { bEverythingOK = false ; printf("\n%s path too long (%s/%s)\n", FuncName, absPathExportFolder, PERSADMIN_LINKS_INFO_FILENAME) ; } }
+ if(bEverythingOK && (! bNothingToExport)) { /* for each link file in buffer, create an entry (line) in the export file * for links to group - only the number of the group (i.e. a hex value in 0x00 - 0xFF domain) is stored * for links to public data - the word "public" is stored **/ sint_t posInBuffer = 0 ; while((posInBuffer < neededBufferSize) && bEverythingOK) { sint_t lenCurrentLink = strlen(buffer+posInBuffer) ; if(0 == strcmp(buffer+posInBuffer, PERS_ORG_SHARED_PUBLIC_SYMLINK_NAME)) { /* it is the link to the public data */ if(0 > fputs("public\n", fileExport)) { bEverythingOK = false ; printf("\n%s fputs(public) errno=%s\n", FuncName, strerror(errno)) ; } else { exportedLinks++ ; } } else { sint_t groupID = persadmin_common_extract_group_id(buffer+posInBuffer) ; if(groupID >= 0) { str_t line[PERSADMIN_MAX_PATH_LENGHT] ; printf("\n%s groupID(%s)=0x%02X\n", FuncName, buffer+posInBuffer, groupID) ; snprintf(line, sizeof(line), "%02X\n", groupID) ; if(0 > fputs(line, fileExport)) { bEverythingOK = false ; printf("\n%s fputs(%02X) errno=%s\n", FuncName, groupID, strerror(errno)) ; } else { exportedLinks++ ; } } else { printf("\n%s unable to extract group ID from (%s). Ignore it\n", FuncName, buffer+posInBuffer) ; } } posInBuffer += (lenCurrentLink + 1) ; } }
+ if(NIL != buffer) { free(buffer) ; }
+ if(NIL != fileExport) { fclose(fileExport) ; }
+ return bEverythingOK ? exportedLinks : PAS_FAILURE; }
+/* * install links (to groups and public data) into the application folder(indicated by absPathApplicationFolder) * based on information available inside the import folder (indicated by absPathImportFolder) * returns the number of installed links, or a negative value in case of error */ sint_t persadmin_import_links(pstr_t absPathImportFolder, pstr_t absPathApplicationFolder) { pstr_t FuncName = "persadmin_import_links:" ; bool_t bEverythingOK = true ; bool_t bNothingToImport = false ; sint_t importedLinks = 0 ; FILE * fileImport = NIL ; bool_t bImportInCachedPath = true ;
+ if( (NIL == absPathImportFolder) || (NIL == absPathApplicationFolder)) { bEverythingOK = false ; printf("\n%s NIL param \n", FuncName) ; } else { if(0 != persadmin_check_if_file_exists(absPathImportFolder, true)) { bEverythingOK = false ; printf("\n%s folder does not exist (%s) \n", FuncName, absPathImportFolder) ; } else { if(0 != persadmin_check_if_file_exists(absPathApplicationFolder, true)) { bEverythingOK = false ; printf("\n%s folder does not exist (%s) \n", FuncName, absPathApplicationFolder) ; } } }
+ if(bEverythingOK) { /* check if the absPathApplicationFolder is a cached or write-through path */ if(NIL != strstr(absPathApplicationFolder, PERSADMIN_POLICY_MARKER_CACHED)) { /* cached path */ bImportInCachedPath = true ; } else { /* not a cached path, so it ahould be a write-through path */ if(NIL != strstr(absPathApplicationFolder, PERSADMIN_POLICY_MARKER_WT)) { /* write-through */ bImportInCachedPath = false ; } else { bEverythingOK = false ; printf("\n%s no cached or wt path (%s) \n", FuncName, absPathApplicationFolder) ; } } }
+ if(bEverythingOK) { /* open the source file */ str_t completePath[PERSADMIN_MAX_PATH_LENGHT] ; sint_t lenPathImport = strlen(absPathImportFolder) ; sint_t lenLinkFilename = strlen(PERSADMIN_LINKS_INFO_FILENAME) ;
+ if( (lenPathImport + 1 + lenLinkFilename) < PERSADMIN_MAX_PATH_LENGHT ) { strncpy(completePath, absPathImportFolder, sizeof(completePath)) ; if('/' != completePath[lenPathImport -1]) { strncat(completePath, "/", sizeof(completePath)) ; } strncat(completePath, PERSADMIN_LINKS_INFO_FILENAME, sizeof(completePath)) ;
+ fileImport = fopen(completePath, "r") ; if(NIL == fileImport) { /* nothing to import */ bNothingToImport = true ; printf("\n%s fopen(<%s>, r) errno = %s\n", FuncName, completePath, strerror(errno)) ; } } else { bEverythingOK = false ; printf("\n%s path too long (%s/%s)\n", FuncName, absPathImportFolder, PERSADMIN_LINKS_INFO_FILENAME) ; } }
+ if(bEverythingOK && (! bNothingToImport)) { bool_t bEndOfFileReached = false ;
+ str_t appFolderPath[PERSADMIN_MAX_PATH_LENGHT] ; sint_t lenAppFolder = strlen(absPathApplicationFolder) ;
+ if(lenAppFolder + 1 < PERSADMIN_MAX_PATH_LENGHT) { strncpy(appFolderPath, absPathApplicationFolder, sizeof(appFolderPath)) ; if('/' != appFolderPath[lenAppFolder-1]) { strncat(appFolderPath, "/", sizeof(appFolderPath)) ; lenAppFolder += 1 ; } } else { bEverythingOK = false ; printf("\n%s path too long (%s)\n", FuncName, absPathImportFolder) ; } while((! bEndOfFileReached) && bEverythingOK) { str_t line[256] ; pstr_t pResult = fgets(line, sizeof(line), fileImport) ; if(NIL == pResult) { /* end of file */ bEndOfFileReached = true ; } else { if(strlen(line) > (sizeof(line) - 3)) /* 3 <=> \n \r \0 */ { bEverythingOK = false ; printf("%s - unexpected line too long \n", FuncName) ; } else { str_t linkTarget[256] ; str_t linkPathname[256] ; bool_t bIgnoreLine = false ; persadmin_common_remove_endofline(line) ; if(0 == strcmp(line, "public")) { snprintf(linkTarget, sizeof(linkTarget), "%s", bImportInCachedPath ? PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ : PERS_ORG_SHARED_PUBLIC_WT_PATH_) ; if((sizeof(linkPathname)-1) < snprintf(linkPathname, sizeof(linkPathname), "%s%s", appFolderPath, PERS_ORG_SHARED_PUBLIC_SYMLINK_NAME)) { /* hard to believe, but anyway */ bIgnoreLine = true ; printf("%s - unexpected linkPathname too long (%s%s) \n", FuncName, appFolderPath, PERS_ORG_SHARED_PUBLIC_SYMLINK_NAME) ; } } else { sint_t groupID ; sint_t result = sscanf(line, "%X", &groupID) ; if(1 == result) { snprintf(linkTarget, sizeof(linkTarget), "%s%02X", (bImportInCachedPath ? PERS_ORG_SHARED_GROUP_CACHE_PATH_ : PERS_ORG_SHARED_GROUP_WT_PATH_), groupID) ; if((sizeof(linkPathname)-1) < snprintf(linkPathname, sizeof(linkPathname), "%s%s%02X", appFolderPath, PERS_ORG_SHARED_GROUP_SYMLINK_PREFIX, groupID)) { /* hard to believe, but anyway */ bIgnoreLine = true ; printf("%s - unexpected linkPathname too long (%s%s%02X) \n", FuncName, appFolderPath, PERS_ORG_SHARED_GROUP_SYMLINK_PREFIX, groupID) ; } } else { bIgnoreLine = true ; printf("%s - unable to extract group ID from (%s) - ignore it \n", FuncName, line) ; } }
+ if( ! bIgnoreLine) { if(0 <= persadmin_check_if_file_exists(linkPathname, false)) { if(0 > persadmin_delete_file(linkPathname)) { bEverythingOK = false ; printf("%s - unable to delete existing link (%s) \n", FuncName, linkPathname) ; } }
+ if(bEverythingOK) { if(0 == persadmin_create_symbolic_link(linkPathname, linkTarget)) { importedLinks++ ; } else { bEverythingOK = false ; printf("%s - persadmin_create_symbolic_link(<%s>, <%s>) failed \n", FuncName, linkPathname, linkTarget) ; } } } } }
+ } }
+ if(NIL != fileImport) { fclose(fileImport) ; }
+ return bEverythingOK ? importedLinks : PAS_FAILURE; }
+
+/* * linkName is not checked against NIL * return group ID, or negative value for error * it is assumed that lenght of linkName < PERSADMIN_MAX_PATH_LENGHT **/ static sint_t persadmin_common_extract_group_id(pstr_t linkName) { sint_t groupID = -1 ; sint_t lenPrefix = strlen(PERS_ORG_SHARED_GROUP_SYMLINK_PREFIX) ;
+ if(strlen(linkName) > lenPrefix) { if(0 == strncmp(linkName, PERS_ORG_SHARED_GROUP_SYMLINK_PREFIX, lenPrefix)) { if(1 != sscanf(linkName+lenPrefix, "%X", &groupID)) { groupID = -1 ; } } }
+ return groupID ; }
+/* * line is not checked against NIL * the content of line is changed **/ static void persadmin_common_remove_endofline(pstr_t line) { sint_t len = strlen(line) ; if((len > 0) && (('\r' == line[len-1]) || ('\n' == line[len-1]))) { line[len-1] = '\0' ; }
+ if((len > 1) && (('\r' == line[len-2]) || ('\n' == line[len-2]))) { line[len-2] = '\0' ; } }
+ sint_t persadmin_list_application_folders( pconststr_t rootPath, pstr_t list, sint_t listSize ) { sint_t result = PAS_FAILURE;
+ if ( ( rootPath != 0 ) && ( list != 0 ) && ( listSize > 0 ) ) { GetApplicationRootPath( rootPath, completeRootPath );
+ // Clear the output buffer before retrieving the actual list memset( list, 0, listSize );
+ result = persadmin_list_folder( completeRootPath, list, listSize, PersadminFilterFolders, false );
+ if ( result >= 0 ) { char * crtName = list; bool_t done = false; result += sizeof( StringTerminator ); while ( ( ( * crtName ) != 0 ) && ( done == false ) ) { int length = strlen( crtName ); if ( persadmin_is_shared_folder( crtName, length ) == true ) { result -= length + sizeof( StringTerminator ); memmove( crtName, crtName + length + sizeof( StringTerminator ), listSize - ( crtName - list ) - length - sizeof( StringTerminator ) ); done = true; } else { crtName += length + sizeof( StringTerminator ); } } } }
+ return result; }
+sint_t persadmin_list_application_folders_get_size( pconststr_t rootPath ) { sint_t result = PAS_FAILURE;
+ GetApplicationRootPath( rootPath, completeRootPath ); result = persadmin_list_folder_get_size( completeRootPath, PersadminFilterFolders, false );
+ if ( result > 0 ) { // Add space for doubling the final '\0' - this is not done inside persadmin_list_folder_get_size() result += sizeof( StringTerminator ); }
+ return result; }
+bool_t persadmin_is_shared_folder( pconststr_t name, int length ) { bool_t result = false; int compLen = strlen( gSharedPathName );
+ if ( ( name != 0 ) && ( length == compLen ) ) { int i = 0; result = true; for ( ; ( ( i < compLen ) && ( result == true ) ); ++i ) { if ( gSharedPathName[ i ] != name[ i ] ) { result = false; } } }
+ return result; } /** * @brief Saves files together into a single archive. * @usage persadmin_compress("/path/to/compress/to/archive_name.tgz", "/path/from/where/to/compress") * @return 0 for success, negative value otherwise. */ sint_t persadmin_compress(pstr_t compressTo, pstr_t compressFrom) { uint8_t buffer [READ_BUFFER_LENGTH]; str_t pchParentPath [PATH_ABS_MAX_SIZE]; pstr_t pchStrPos = NIL; struct archive *psArchive = NIL; struct archive *psDisk = NIL; struct archive_entry *psEntry = NIL; sint_t s32Result = ARCHIVE_OK; sint_t s32Length = 0; sint_t fd; sint_t s32ParentPathLength = 0; if( (NIL == compressTo) || (NIL == compressFrom) ) { s32Result = ARCHIVE_FAILED; printf("persadmin_compress - invalid parameters \n"); } if( ARCHIVE_OK == s32Result ) { printf("persadmin_compress - create <%s> from <%s>\n", compressTo, compressFrom); psArchive = archive_write_new(); if( NIL == psArchive ) { s32Result = ARCHIVE_FAILED; printf("persadmin_compress - archive_write_new ERR\n"); } } if( ARCHIVE_OK == s32Result ) { /* this in turn calls archive_write_add_filter_gzip; */ s32Result = archive_write_set_compression_gzip(psArchive); if( ARCHIVE_OK != s32Result ) { printf("persadmin_compress - archive_write_set_compression_gzip ERR %d\n", s32Result); } } if( ARCHIVE_OK == s32Result ) { /* portable archive exchange; */ archive_write_set_format_pax(psArchive); compressTo = (strcmp(compressTo, "-") == 0) ? NIL : compressTo; s32Result = archive_write_open_filename(psArchive, compressTo); if( ARCHIVE_OK != s32Result ) { printf("persadmin_compress - archive_write_open_filename ERR %d\n", s32Result); } } if( ARCHIVE_OK == s32Result ) { psDisk = archive_read_disk_new(); if( NIL == psDisk ) { s32Result = ARCHIVE_FAILED; printf("persadmin_compress - archive_read_disk_new ERR\n"); } } if( ARCHIVE_OK == s32Result ) { archive_read_disk_set_standard_lookup(psDisk); s32Result = archive_read_disk_open(psDisk, compressFrom); if( ARCHIVE_OK != s32Result ) { printf("persadmin_compress - archive_read_disk_new ERR %s\n", archive_error_string(psDisk)); } } memset(pchParentPath, 0, sizeof(pchParentPath)); snprintf(pchParentPath, sizeof(pchParentPath), compressFrom); pchStrPos = strrchr(pchParentPath, '/'); if(NIL != pchStrPos) { *pchStrPos = '\0'; } s32ParentPathLength = strlen(pchParentPath); while( ARCHIVE_OK == s32Result ) { psEntry = archive_entry_new(); s32Result = archive_read_next_header2(psDisk, psEntry); switch( s32Result ) { case ARCHIVE_EOF: { /* nothing else to do; */ break; } case ARCHIVE_OK: { str_t pstrTemp[PATH_ABS_MAX_SIZE]; pstr_t p = (pstr_t)archive_entry_pathname(psEntry); if(NIL != p) { /* remove parent section and save relative pathnames */ memset(pstrTemp, 0, sizeof(pstrTemp)); snprintf(pstrTemp, sizeof(pstrTemp), "%s", p + (s32ParentPathLength + 1)); archive_entry_copy_pathname(psEntry, pstrTemp); } archive_read_disk_descend(psDisk); s32Result = archive_write_header(psArchive, psEntry); if( ARCHIVE_OK > s32Result) { printf("persadmin_compress - archive_write_header ERR %s\n", archive_error_string(psArchive)); } if( ARCHIVE_FATAL == s32Result ) { /* exit; */ printf("persadmin_compress - archive_write_header ERR FATAL\n"); } if( ARCHIVE_FAILED < s32Result ) { #if 0 /* Ideally, we would be able to use * the same code to copy a body from * an archive_read_disk to an * archive_write that we use for * copying data from an archive_read * to an archive_write_disk. * Unfortunately, this doesn't quite * work yet. */ persadmin_copy_data(psDisk, psArchive); #else /* For now, we use a simpler loop to copy data * into the target archive. */ fd = open(archive_entry_sourcepath(psEntry), O_RDONLY); s32Length = read(fd, buffer, READ_BUFFER_LENGTH); while( s32Length > 0 ) { archive_write_data(psArchive, buffer, s32Length); s32Length = read(fd, buffer, READ_BUFFER_LENGTH); } close(fd); #endif } break; } default: { printf("persadmin_compress - archive_read_next_header2 ERR %s\n", archive_error_string(psDisk)); /* exit; */ break; } } if( NIL != psEntry ) { archive_entry_free(psEntry); } } /* perform cleaning operations; */ if( NIL != psDisk ) { archive_read_close(psDisk); archive_read_free(psDisk); } if( NIL != psArchive ) { archive_write_close(psArchive); archive_write_free(psArchive); } /* overwrite result; */ s32Result = (s32Result == ARCHIVE_EOF) ? ARCHIVE_OK : s32Result; /* return result; */ return s32Result; } /* persadmin_compress() */ /** * @brief Restore files from an archive. * @usage persadmin_uncompress("/path/from/where/to/extract/archive_name.tgz", "/path/where/to/extract/") - extract to specified folder * @usage persadmin_uncompress("/path/from/where/to/extract/archive_name.tgz", "") - extract to local folder * @return 0 for success, negative value otherwise. */ sint_t persadmin_uncompress(pstr_t extractFrom, pstr_t extractTo) { struct archive *psArchive = NIL; struct archive *psExtract = NIL; struct archive_entry *psEntry = NIL; sint_t s32Result = ARCHIVE_OK; sint_t s32Flags = ARCHIVE_EXTRACT_TIME; /* select which attributes to restore; */ s32Flags |= ARCHIVE_EXTRACT_PERM; s32Flags |= ARCHIVE_EXTRACT_ACL; s32Flags |= ARCHIVE_EXTRACT_FFLAGS; if( (NIL == extractFrom) || (NIL == extractTo) ) { s32Result = ARCHIVE_FAILED; printf("persadmin_uncompress - invalid parameters\n"); } if( ARCHIVE_OK == s32Result ) { psArchive = archive_read_new(); if( NIL == psArchive ) { s32Result = ARCHIVE_FAILED; printf("persadmin_uncompress - archive_read_new ERR\n"); } } if( ARCHIVE_OK == s32Result ) { archive_read_support_format_all(psArchive); archive_read_support_compression_all(psArchive); psExtract = archive_write_disk_new(); s32Result = ((NIL == psExtract) ? ARCHIVE_FAILED : s32Result); archive_write_disk_set_options(psExtract, s32Flags); archive_write_disk_set_standard_lookup(psExtract); } if( ARCHIVE_OK == s32Result ) { s32Result = archive_read_open_filename(psArchive, extractFrom, 10240); /* exit if s32Result != ARCHIVE_OK; */ } while( ARCHIVE_OK == s32Result ) { s32Result = archive_read_next_header(psArchive, &psEntry); switch( s32Result ) { case ARCHIVE_EOF: { /* nothing else to do; */ break; } case ARCHIVE_OK: { /* modify entry here to extract to the needed location; */ str_t pstrTemp[PATH_ABS_MAX_SIZE]; memset(pstrTemp, 0, sizeof(pstrTemp)); snprintf(pstrTemp, sizeof(pstrTemp), "%s%s", extractTo, archive_entry_pathname(psEntry)); printf("persadmin_uncompress - archive_entry_pathname %s\n", pstrTemp); archive_entry_copy_pathname(psEntry, pstrTemp); s32Result = archive_write_header(psExtract, psEntry); if( ARCHIVE_OK == s32Result ) { if( archive_entry_size(psEntry) > 0 ) { s32Result = persadmin_copy_data(psArchive, psExtract); if( ARCHIVE_OK != s32Result ) { printf("persadmin_uncompress - copy_data ERR %s\n", archive_error_string(psExtract)); } /* if( ARCHIVE_WARN > s32Result ) exit; */ } if( ARCHIVE_OK == s32Result ) { s32Result = archive_write_finish_entry(psExtract); if( ARCHIVE_OK != s32Result ) { printf("persadmin_uncompress - archive_write_finish_entry ERR %s\n", archive_error_string(psExtract)); } /* if( ARCHIVE_WARN > s32Result ) exit; */ } } else { printf("persadmin_uncompress - archive_write_header ERR %s\n", archive_error_string(psExtract)); } break; } default: { printf("persadmin_uncompress - archive_read_next_header ERR %d\n", s32Result); break; } } } /* perform cleaning operations; */ if( NIL != psArchive ) { archive_read_close(psArchive); archive_read_free(psArchive); } if( NIL != psExtract ) { archive_write_close(psExtract); archive_write_free(psExtract); } /* overwrite result; */ s32Result = (s32Result == ARCHIVE_EOF) ? ARCHIVE_OK : s32Result; /* return result; */ return s32Result; } /* persadmin_uncompress() */ static sint_t persadmin_copy_data(struct archive *ar, struct archive *aw) { sint_t s32Result = ARCHIVE_OK; sint_t s32Size = 0; uint8_t buffer[COPY_BUFFER_LENGTH]; while( ARCHIVE_OK == s32Result ) { s32Size = archive_read_data(ar, buffer, COPY_BUFFER_LENGTH); if( 0 > s32Size ) { printf("persadmin_copy_data - archive_read_data ERR\n"); s32Result = ARCHIVE_FAILED; } else { if( 0 < s32Size ) { s32Size = archive_write_data(aw, buffer, COPY_BUFFER_LENGTH); if( 0 > s32Size ) { printf("persadmin_copy_data - archive_write_data ERR\n"); s32Result = ARCHIVE_FAILED; } } else { /* nothing to copy; */ break; } } } /* return result; */ return s32Result; } /* persadmin_copy_data() */
diff --git a/Administrator/src/ssw_pers_admin_config.c b/Administrator/src/ssw_pers_admin_config.c
new file mode 100644
index 0000000..a387df6
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_config.c
@@ -0,0 +1,2055 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ana.Chisca@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.10.04 uidl9757 CSP_WZ#5962: Initialisation of Default Value does not work for big key (>63 bytes)
+* 2013.09.27 uidl9757 CSP_WZ#5781: Fix memory leakage
+* 2013.09.23 uidl9757 CSP_WZ#5781: Watchdog timeout of pas-daemon
+* 2013.07.03 uidl9757 CSP_WZ#4576: Install "custom" keys with correct storage
+* 2013.06.10 uidl9757 CSP_WZ#4285: Custom plugin's name has to be extracted from value for "storage" tag
+* 2013.04.03 uidl9757 CSP_WZ#3321: Adapt to persComRct.h version 5.0.0.0
+* 2013.04.02 uidl9757 CSP_WZ#2798: Fix handling of "customID" and "custom_name"
+* 2013.03.25 uidn3591 CSP_WZ#2798: Initial version
+*
+**********************************************************************************************************************/
+
+#include <json/json.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <malloc.h>
+
+#include "dlt/dlt.h"
+
+#include "persistence_admin_service.h"
+#include "persComTypes.h"
+#include "persComRct.h"
+#include "ssw_pers_admin_config.h"
+
+#define MAX_NESTING_DEPTH ( 7)
+#define UNDEFINED_SIZE (-1)
+
+/* L&T context */
+#define LT_HDR "CFG >> "
+DLT_IMPORT_CONTEXT (persAdminSvcDLTCtx)
+
+#define DEBUG
+
+typedef struct _JSON_LookUp_s
+{
+ pstr_t pstrValue_JSON;
+ uint32_t u32Value_PAS;
+
+} JSON_LookUp_s;
+
+
+static JSON_LookUp_s g_JSON_LookUp_Table[] =
+{
+ /* Permissions */
+ {"WO", PersistencePermission_WriteOnly},
+ {"RO", PersistencePermission_ReadOnly},
+ {"RW", PersistencePermission_ReadWrite},
+ /* PersistencePolicy */
+ {"NA", PersistencePolicy_na},
+ {"cached", PersistencePolicy_wc},
+ {"writethrough", PersistencePolicy_wt},
+ /* PersistenceStorage */
+ {"local", PersistenceStorage_local},
+ {"shared", PersistenceStorage_shared},
+ {"hwinfo", PersistenceStorage_custom},
+ {"early", PersistenceStorage_custom},
+ {"emergency", PersistenceStorage_custom},
+ {"secure", PersistenceStorage_custom},
+ {"custom1", PersistenceStorage_custom},
+ {"custom2", PersistenceStorage_custom},
+ {"custom3", PersistenceStorage_custom},
+ /* PersAdminCfgInstallRules */
+ {"PersAdminCfgInstallRules_NewInstall", PersAdminCfgInstallRules_NewInstall},
+ {"PersAdminCfgInstallRules_Uninstall", PersAdminCfgInstallRules_Uninstall},
+ {"PersAdminCfgInstallRules_DontTouch", PersAdminCfgInstallRules_DontTouch},
+ {"PersAdminCfgInstallRules_UpdateAll", PersAdminCfgInstallRules_UpdateAll},
+ {"PersAdminCfgInstallRules_UpdateAllSkipDefaultFactory", PersAdminCfgInstallRules_UpdateAllSkipDefaultFactory},
+ {"PersAdminCfgInstallRules_UpdateAllSkipDefaultConfig", PersAdminCfgInstallRules_UpdateAllSkipDefaultConfig},
+ {"PersAdminCfgInstallRules_UpdateAllSkipDefaultAll", PersAdminCfgInstallRules_UpdateAllSkipDefaultAll},
+ {"PersAdminCfgInstallRules_UpdateDefaultFactory", PersAdminCfgInstallRules_UpdateDefaultFactory},
+ {"PersAdminCfgInstallRules_UpdateDefaultConfig", PersAdminCfgInstallRules_UpdateDefaultConfig},
+ {"PersAdminCfgInstallRules_UpdateDefaultAll", PersAdminCfgInstallRules_UpdateDefaultAll},
+ {"PersAdminCfgInstallRules_UpdateSetOfResources", PersAdminCfgInstallRules_UpdateSetOfResources},
+ {"PersAdminCfgInstallRules_UninstallNonDefault", PersAdminCfgInstallRules_UninstallNonDefault},
+ /* PersAdminCfgInstallExceptions */
+ {"PersAdminCfgInstallExceptions_Update", PersAdminCfgInstallExceptions_Update},
+ {"PersAdminCfgInstallExceptions_DontTouch", PersAdminCfgInstallExceptions_DontTouch},
+ {"PersAdminCfgInstallExceptions_Delete", PersAdminCfgInstallExceptions_Delete},
+ /* */
+ {"file", PersistenceResourceType_file},
+ {"key", PersistenceResourceType_key},
+ {"END_OF_LKUP_LIST", 0}
+};
+
+
+typedef enum _JSON_Key_LookUp_e
+{
+ JsonKey_Resources,
+ JsonKey_Policy,
+ JsonKey_Permission,
+ JsonKey_Storage,
+ JsonKey_MaxSize,
+ JsonKey_Responsible,
+ JsonKey_CustomID,
+ JsonKey_CustomName,
+ JsonKey_Size,
+ JsonKey_Data,
+ JsonKey_Type
+
+} JSON_Key_LookUp_e;
+
+
+static char* g_JSON_Key_Names[] =
+{
+ "resources",
+ /**/
+ "policy",
+ "permission",
+ "storage",
+ "max_size",
+ "responsible",
+ "customID",
+ "custom_name",
+ /**/
+ "size",
+ "data",
+ /**/
+ "type"
+};
+
+static signed int cfg_priv_read_file (signed int handlerRCT, char** ppBufferFile);
+static signed int cfg_priv_extract_rct_information (char* pBuffer_in, signed int siBufferSize, PersistenceConfigurationKey_s* psConfig_out);
+static signed int cfg_priv_extract_rules_information (char* pBuffer_in, PersAdminCfgInstallRules_e* peRule_out);
+static signed int cfg_priv_extract_exception_information (char* pBuffer_in, PersAdminCfgInstallExceptions_e* peException_out);
+static signed int cfg_priv_extract_default_data_information(char* pBuffer_in, signed int siBufferSize_in, char* defaultDataBuffer_out, signed int siBufferSize_out);
+
+static uint32_t cfg_priv_json_to_pas (char* pBuffer_in);
+
+static signed int cfg_priv_json_parse_get_keys_size (json_object* jsobj, char const * resourceID);
+static signed int cfg_priv_json_parse_get_keys_all_size (json_object* jsobj);
+static signed int cfg_priv_json_parse_get_values_size (json_object* jsobj, char const * resourceID);
+
+/* recursive */
+static signed int cfg_priv_json_parse_get_keys (json_object* jsobj, char const * resourceID, char** ppBuffer_out, signed int* psiBufferSize, unsigned int uiNestingCounter);
+static signed int cfg_priv_json_parse_get_keys_all (json_object* jsobj, char** ppBuffer_out, signed int* psiBufferSize);
+/* recursive */
+static signed int cfg_priv_json_parse_get_values (json_object* jsobj, char const * resourceID, char** ppBuffer_out, signed int* psiBufferSize, unsigned int uiNestingCounter);
+/* recursive */
+static signed int cfg_priv_json_parse_get_values_all (json_object* jsobj, char** ppBuffer_out, signed int* psiBufferSize, unsigned int uiNestingCounter);
+static signed int cfg_priv_json_get_value (json_object *jsobj, char** ppBuffer_out, signed int* psiBufferSize);
+
+#ifdef VERBOSE_TRACE
+static void print_buffer (char* pBuffer, unsigned int uiSize);
+#endif
+
+
+/***********************************************************************************************************************************
+*********************************************** General usage **********************************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief Obtain a handler to config file (RCT, rules, DB) indicated by cfgFilePathname
+ *
+ * \param cfgFilePathname [in] absolute path to config file (length limited to \ref PERS_ORG_MAX_LENGTH_PATH_FILENAME)
+ * \param eCfgFileType [in]
+ *
+ * \return >= 0 for valid handler, negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgFileOpen(char const * filePathname, PersAdminCfgFileTypes_e eCfgFileType)
+{
+ /* invalid file handler */
+ signed int siFileHandler = PAS_FAILURE_INVALID_PARAMETER;
+
+ /* check input parameters */
+ if( NIL == filePathname )
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgFileOpen"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ }
+ else
+ {
+ /* try to obtain handler */
+ siFileHandler = open(filePathname, O_RDONLY);
+ /* invalid file handler */
+ if( siFileHandler < 0 )
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgFileOpen"),
+ DLT_STRING("-"),
+ DLT_STRING("failed to open file"),
+ DLT_STRING(filePathname),
+ DLT_STRING("error"),
+ DLT_INT(siFileHandler));
+ siFileHandler = PAS_FAILURE;
+ }
+ }
+
+ /* return result */
+ return siFileHandler;
+
+} /* persAdmCfgFileOpen */
+
+/**
+ * \brief Close handler to config file
+ *
+ * \param handlerCfgFile [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return 0 for success, negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgFileClose(signed int handlerCfgFile)
+{
+ signed int siResult = PAS_FAILURE_INVALID_PARAMETER;
+
+ /* valid handler */
+ if( 0 <= handlerCfgFile )
+ {
+ (void)close(handlerCfgFile);
+ siResult = PAS_SUCCESS;
+ }
+
+ /* return result */
+ return siResult;
+
+} /* persAdmCfgFileClose() */
+
+/***********************************************************************************************************************************
+*********************************************** RCT related ************************************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief read a resourceID's configuration from RCT
+ *
+ * \param handlerRCT [in] handler obtained with persAdmCfgFileOpen
+ * \param resourceID [in] resource's identifier (length limited to \ref PERS_RCT_MAX_LENGTH_RESOURCE_ID)
+ * \param psConfig_out [out]where to return the configuration for resourceID
+ *
+ * \return 0 for success, or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRctRead(signed int handlerRCT, char const * resourceID, PersistenceConfigurationKey_s* psConfig_out)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL;
+ char* pBuffer_out = NIL;
+
+ if( (NIL == resourceID) ||
+ (NIL == psConfig_out) ||
+ (0 > handlerRCT))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRctRead"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ #ifdef VERBOSE_TRACE
+ /* some info */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRctRead"),
+ DLT_STRING("-"),
+ DLT_STRING(resourceID));
+ #endif
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerRCT, &pBufferFile);
+ siResult = (0 == siResult) ? PAS_FAILURE : siResult;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* parse the RCT file */
+
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRctRead"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* get size to accommodate values */
+ siResult = cfg_priv_json_parse_get_values_size(jsobj, resourceID);
+ siResult = (0 == siResult) ? PAS_FAILURE_NOT_FOUND : siResult;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ pBuffer_out = (char*) malloc(((size_t)siResult * sizeof(char))); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if( NIL == pBuffer_out )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRctRead"),
+ DLT_STRING("-"),
+ DLT_STRING("error"),
+ DLT_INT(siResult),
+ DLT_STRING("allocating"),
+ DLT_INT(siResult),
+ DLT_STRING("bytes"));
+ siResult = PAS_FAILURE_OUT_OF_MEMORY;
+ }
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* work with temporary variables */
+ signed int siResultTemp = siResult;
+ char* pBuffer_outTemp = pBuffer_out;
+
+ /* reset */
+ (void)memset(pBuffer_out, 0, ((size_t)siResult * sizeof(char)));
+ /* parse RCT file */
+ siResultTemp = cfg_priv_json_parse_get_values(jsobj, resourceID, &pBuffer_outTemp, &siResultTemp, 0);
+ /* interpret result */
+ siResult = (siResultTemp != siResult) ? PAS_FAILURE : siResultTemp;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+#ifdef VERBOSE_TRACE
+ /* debug only */
+ print_buffer(pBuffer_out, (unsigned int)siResult);
+#endif
+ /* parse corresponding array and extract specific information */
+ siResult = cfg_priv_extract_rct_information(pBuffer_out, siResult, psConfig_out);
+ }
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+ }
+
+ /* perform cleaning operations */
+ if( NIL != pBuffer_out )
+ {
+ free(pBuffer_out); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBuffer_out = NIL;
+ }
+
+ if( NIL != pBufferFile )
+ {
+ free(pBufferFile); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBufferFile = NIL;
+ }
+
+ /* return 0 for success */
+ return siResult;
+
+} /* persAdmCfgRctRead() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/**
+ * \brief Find the buffer's size needed to accommodate the list of resourceIDs in RCT
+ * \note : resourceIDs in the list are separated by '\0'
+ *
+ * \param handlerRCT [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return needed size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRctGetSizeResourcesList(signed int handlerRCT)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL; /* deallocation is in caller's responsibility */
+
+ if( 0 > handlerRCT )
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRctGetSizeResourcesList"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerRCT, &pBufferFile);
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* parse the RCT file */
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRctGetSizeResourcesList"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* get size */
+ siResult = cfg_priv_json_parse_get_keys_size(jsobj, g_JSON_Key_Names[JsonKey_Resources]);
+ }
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+ }
+
+ if(NIL != pBufferFile)
+ {/* deallocation is in caller's responsibility */
+ free(pBufferFile);
+ }
+
+ /* return size */
+ return siResult;
+
+} /* persAdmCfgRctGetSizeResourcesList() */
+
+
+/**
+ * \brief Get the list of the resourceIDs in RCT
+ * \note : resourceIDs in the list are separated by '\0'
+ *
+ * \param handlerRCT [in] handler obtained with persAdmCfgFileOpen
+ * \param listBuffer_out [out]buffer where to return the list of resourceIDs
+ * \param listBufferSize [in] size of listBuffer_out
+ *
+ * \return list size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRctGetResourcesList(signed int handlerRCT, char* listBuffer_out, signed int listBufferSize)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL;
+
+ if( (NIL == listBuffer_out) ||
+ (0 > handlerRCT))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRctGetResourcesList"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerRCT, &pBufferFile);
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRctGetResourcesList"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* work with temporary variables */
+ char* pBuffer_outTemp = listBuffer_out;
+
+ /* reset */
+ (void)memset(listBuffer_out, 0, ((size_t)listBufferSize * sizeof(char)));
+ siResult = listBufferSize;
+
+ /* parse RCT file & search for 'resources' key */
+ siResult = cfg_priv_json_parse_get_keys(jsobj, g_JSON_Key_Names[JsonKey_Resources], &pBuffer_outTemp, &siResult, 0);
+#ifdef VERBOSE_TRACE
+ /* debug only */
+ print_buffer(listBuffer_out, (unsigned int)listBufferSize);
+#endif
+ }
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+
+ /* perform cleaning operations */
+ free(pBufferFile); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBufferFile = NIL;
+ }
+
+ /* return number of bytes in buffer */
+ return siResult;
+
+} /* persAdmCfgRctGetResourcesList() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/***********************************************************************************************************************************
+*********************************************** Install Rules related **************************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief Find the buffer's size needed to accommodate the list of apps/groups names in install rules file
+ * \note : the items in the list are separated by '\0'
+ *
+ * \param handlerRulesFile [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return needed size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRulesGetSizeFoldersList(signed int handlerRulesFile)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL; /* deallocation is in caller's responsibility */
+
+ if( 0 > handlerRulesFile )
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRulesGetSizeFoldersList"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerRulesFile, &pBufferFile);
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* parse the install rules file */
+
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRulesGetSizeFoldersList"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* get size */
+ siResult = cfg_priv_json_parse_get_keys_all_size(jsobj);
+ }
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+ }
+
+ if(NIL != pBufferFile)
+ {/* deallocation is in caller's responsibility */
+ free(pBufferFile);
+ }
+
+ /* return size */
+ return siResult;
+
+} /* persAdmCfgRulesGetSizeFoldersList() */
+
+
+/**
+ * \brief Get the list of apps/groups names in install rules file
+ * \note : the items in the list are separated by '\0'
+ *
+ * \param handlerRulesFile [in] handler obtained with persAdmCfgFileOpen
+ * \param listBuffer_out [out]buffer where to return the list of apps/groups names
+ * \param listBufferSize [in] size of listBuffer_out
+ *
+ * \return list size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRulesGetFoldersList(signed int handlerRulesFile, char* listBuffer_out, signed int listBufferSize)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL;
+
+ if( (NIL == listBuffer_out) ||
+ (0 > handlerRulesFile))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRulesGetFoldersList"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerRulesFile, &pBufferFile);
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRulesGetFoldersList"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* work with temporary variables */
+ char* pBuffer_outTemp = listBuffer_out;
+
+ /* reset */
+ (void)memset(listBuffer_out, 0, ((size_t)listBufferSize * sizeof(char)));
+ siResult = listBufferSize;
+
+ /* parse install rules file & get all keys */
+ siResult = cfg_priv_json_parse_get_keys_all(jsobj, &pBuffer_outTemp, &siResult);
+#ifdef VERBOSE_TRACE
+ /* debug only */
+ print_buffer(listBuffer_out, (unsigned int)listBufferSize);
+#endif
+ }
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+
+ /* perform cleaning operations */
+ free(pBufferFile); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBufferFile = NIL;
+ }
+
+ /* return number of bytes in buffer */
+ return siResult;
+
+} /* persAdmCfgRulesGetFoldersList() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/**
+ * \brief Get the rule for the app/group install folder
+ *
+ * \param handlerRulesFile [in] handler obtained with persAdmCfgFileOpen
+ * \param folderName [in] name of the app/group install folder
+ * \param peRule_out [out]buffer where to return the rule for the folder
+ *
+ * \return 0 for success, or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgRulesGetRuleForFolder(signed int handlerRulesFile, char* folderName, PersAdminCfgInstallRules_e* peRule_out)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL;
+ char* pBuffer_out = NIL;
+
+ if( (NIL == folderName) ||
+ (NIL == peRule_out) ||
+ (0 > handlerRulesFile))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRulesGetRuleForFolder"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerRulesFile, &pBufferFile);
+ siResult = (0 == siResult) ? PAS_FAILURE : siResult;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* parse the install file */
+
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRulesGetRuleForFolder"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* get size to accommodate values */
+ siResult = cfg_priv_json_parse_get_values_size(jsobj, folderName);
+ siResult = (0 == siResult) ? PAS_FAILURE_NOT_FOUND : siResult;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ pBuffer_out = (char*) malloc(((size_t)siResult * sizeof(char))); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if( NIL == pBuffer_out )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRulesGetRuleForFolder"),
+ DLT_STRING("-"),
+ DLT_STRING("error"),
+ DLT_INT(siResult),
+ DLT_STRING("allocating"),
+ DLT_INT(siResult),
+ DLT_STRING("bytes"));
+ siResult = PAS_FAILURE_OUT_OF_MEMORY;
+ }
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* work with temporary variables */
+ signed int siResultTemp = siResult;
+ char* pBuffer_outTemp = pBuffer_out;
+
+ /* reset */
+ (void)memset(pBuffer_out, 0, ((size_t)siResult * sizeof(char)));
+ /* parse install rules file */
+ siResultTemp = cfg_priv_json_parse_get_values(jsobj, folderName, &pBuffer_outTemp, &siResultTemp, 0);
+ /* interpret result */
+ siResult = (siResultTemp != siResult) ? PAS_FAILURE : siResultTemp;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+#ifdef VERBOSE_TRACE
+ /* debug only */
+ print_buffer(pBuffer_out, (unsigned int)siResult);
+#endif
+
+ /* parse corresponding array and extract specific information */
+ siResult = cfg_priv_extract_rules_information(pBuffer_out, peRule_out);
+ }
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+ }
+
+ /* perform cleaning operations */
+ if( NIL != pBuffer_out )
+ {
+ free(pBuffer_out); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBuffer_out = NIL;
+ }
+
+ if( NIL != pBufferFile )
+ {
+ free(pBufferFile); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBufferFile = NIL;
+ }
+
+ /* return 0 for success */
+ return siResult;
+
+} /* persAdmCfgRulesGetRuleForFolder() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/***********************************************************************************************************************************
+*********************************************** Install Exceptions related *********************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief Find the buffer's size needed to accommodate the list of resources in install exceptions file
+ * \note : the items in the list are separated by '\0'
+ *
+ * \param handlerExceptionsFile [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return needed size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgExcGetSizeResourcesList(signed int handlerExceptionsFile)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL; /* deallocation is in caller's responsibility */
+
+ if( 0 > handlerExceptionsFile )
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgExcGetSizeResourcesList"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerExceptionsFile, &pBufferFile);
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* parse the install exceptions file */
+
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgExcGetSizeResourcesList"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* get size */
+ siResult = cfg_priv_json_parse_get_keys_all_size(jsobj);
+ }
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+ }
+
+ if(NIL != pBufferFile)
+ {/* deallocation is in caller's responsibility */
+ free(pBufferFile) ;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgExcGetSizeResourcesList"),
+ DLT_STRING("-"),
+ DLT_STRING("size ="),
+ DLT_INT(siResult));
+
+ /* return size */
+ return siResult;
+
+} /* persAdmCfgExcGetSizeResourcesList() */
+
+
+/**
+ * \brief Get the list of resources in install exceptions file
+ * \note : the items in the list are separated by '\0'
+ *
+ * \param handlerExceptionsFile [in] handler obtained with persAdmCfgFileOpen
+ * \param listBuffer_out [out]buffer where to return the list of apps/groups names
+ * \param listBufferSize [in] size of listBuffer_out
+ *
+ * \return list size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgExcGetFoldersList(signed int handlerExceptionsFile, char* listBuffer_out, signed int listBufferSize)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL;
+
+ if( (NIL == listBuffer_out) ||
+ (0 > handlerExceptionsFile))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgExcGetFoldersList"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerExceptionsFile, &pBufferFile);
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgExcGetFoldersList"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* work with temporary variables */
+ char* pBuffer_outTemp = listBuffer_out;
+
+ /* reset */
+ (void)memset(listBuffer_out, 0, ((size_t)listBufferSize * sizeof(char)));
+ siResult = listBufferSize;
+
+ /* parse install exceptions file & get all keys */
+ siResult = cfg_priv_json_parse_get_keys_all(jsobj, &pBuffer_outTemp, &siResult);
+#ifdef VERBOSE_TRACE
+ /* debug only */
+ print_buffer(listBuffer_out, (unsigned int)listBufferSize);
+#endif
+ }
+
+ /* perform cleaning operations */
+ free(pBufferFile); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBufferFile = NIL;
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+ }
+
+ /* return number of bytes in buffer */
+ return siResult;
+
+} /* persAdmCfgExcGetFoldersList() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/**
+ * \brief Get the rule for the app/group install folder
+ *
+ * \param handlerRulesFile [in] handler obtained with persAdmCfgFileOpen
+ * \param resource [in] identifier of the resource affected by the exception
+ * \param peException_out [out]buffer where to return the exception for the resource
+ *
+ * \return 0 for success, or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgExcGetExceptionForResource(signed int handlerExceptionsFile, char* resource, PersAdminCfgInstallExceptions_e* peException_out)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL;
+ char* pBuffer_out = NIL;
+
+ if( (NIL == resource) ||
+ (NIL == peException_out) ||
+ (0 > handlerExceptionsFile))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgExcGetExceptionForResource"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerExceptionsFile, &pBufferFile);
+ siResult = (0 == siResult) ? PAS_FAILURE : siResult;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* parse the install file */
+
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgExcGetExceptionForResource"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* get size to accommodate values */
+ siResult = cfg_priv_json_parse_get_values_size(jsobj, resource);
+ siResult = (0 == siResult) ? PAS_FAILURE_NOT_FOUND : siResult;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ pBuffer_out = (char*) malloc(((size_t)siResult * sizeof(char))); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if( NIL == pBuffer_out )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgExcGetExceptionForResource"),
+ DLT_STRING("-"),
+ DLT_STRING("error"),
+ DLT_INT(siResult),
+ DLT_STRING("allocating"),
+ DLT_INT(siResult),
+ DLT_STRING("bytes"));
+ siResult = PAS_FAILURE_OUT_OF_MEMORY;
+ }
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* work with temporary variables */
+ signed int siResultTemp = siResult;
+ char* pBuffer_outTemp = pBuffer_out;
+
+ /* reset */
+ (void)memset(pBuffer_out, 0, ((size_t)siResult * sizeof(char)));
+ /* parse install exceptions file */
+ siResultTemp = cfg_priv_json_parse_get_values(jsobj, resource, &pBuffer_outTemp, &siResultTemp, 0);
+ /* interpret result */
+ siResult = (siResultTemp != siResult) ? PAS_FAILURE : siResultTemp;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+#ifdef VERBOSE_TRACE
+ /* debug only */
+ print_buffer(pBuffer_out, (unsigned int)siResult);
+#endif
+ /* parse corresponding array and extract specific information */
+ siResult = cfg_priv_extract_exception_information(pBuffer_out, peException_out);
+ }
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+ }
+
+ /* perform cleaning operations */
+ if( NIL != pBuffer_out )
+ {
+ free(pBuffer_out); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBuffer_out = NIL;
+ }
+
+ if( NIL != pBufferFile )
+ {
+ free(pBufferFile); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBufferFile = NIL;
+ }
+
+ /* return 0 for success */
+ return siResult;
+
+} /* persAdmCfgExcGetExceptionForResource() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+/***********************************************************************************************************************************
+*********************************************** Group content related **************************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief Find the buffer's size needed to accommodate the list of members in the group
+ *
+ * \param handlerGroupContent [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return needed size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgGroupContentGetSizeMembersList(signed int handlerGroupContent)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL; /* deallocation is in caller's responsibility */
+
+ if( 0 > handlerGroupContent )
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgGroupContentGetSizeMembersList"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerGroupContent, &pBufferFile);
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* parse the groups file */
+
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgGroupContentGetSizeMembersList"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* get size */
+ siResult = cfg_priv_json_parse_get_keys_all_size(jsobj);
+ }
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+ }
+
+ if(NIL != pBufferFile)
+ {/* deallocation is in caller's responsibility */
+ free(pBufferFile);
+ }
+
+ /* return size */
+ return siResult;
+
+} /* persAdmCfgGroupContentGetSizeMembersList() */
+
+
+/**
+ * \brief Get the list of members in the group
+ * \note : resourceIDs in the list are separated by '\0'
+ *
+ * \param handlerGroupContent [in] handler obtained with persAdmCfgFileOpen
+ * \param listBuffer_out [out]buffer where to return the list of resourceIDs
+ * \param listBufferSize [in] size of listBuffer_out
+ *
+ * \return list size [byte], or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgGroupContentGetMembersList(signed int handlerGroupContent, char* listBuffer_out, signed int listBufferSize)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL;
+
+ if( (NIL == listBuffer_out) ||
+ (0 > handlerGroupContent))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgGroupContentGetMembersList"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(handlerGroupContent, &pBufferFile);
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgGroupContentGetMembersList"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* work with temporary variables */
+ char* pBuffer_outTemp = listBuffer_out;
+
+ /* reset */
+ (void)memset(listBuffer_out, 0, (size_t)listBufferSize * sizeof(char));
+ siResult = listBufferSize;
+
+ /* parse groups file & get all keys */
+ siResult = cfg_priv_json_parse_get_keys_all(jsobj, &pBuffer_outTemp, &siResult);
+#ifdef VERBOSE_TRACE
+ /* debug only */
+ print_buffer(listBuffer_out, (unsigned int)listBufferSize);
+#endif
+ }
+
+ /* perform cleaning operations */
+ free(pBufferFile); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBufferFile = NIL;
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+ }
+
+ /* return number of bytes in buffer */
+ return siResult;
+
+} /* persAdmCfgGroupContentGetMembersList() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/***********************************************************************************************************************************
+*********************************************** Default data related **************************************************************
+***********************************************************************************************************************************/
+
+/**
+ * \brief Get the default value for the key type resourceID
+ *
+ * \param hDefaultDataFile [in] handler obtained with persAdmCfgFileOpen
+ *
+ * \return size of default data (0 means there is no default data for the key), or negative value for error (\ref PERSADM_CFG_ERROR_CODES_DEFINES)
+ */
+signed int persAdmCfgReadDefaultData(signed int hDefaultDataFile, char const * resourceID, char* defaultDataBuffer_out, signed int bufferSize)
+{
+ signed int siResult = PAS_SUCCESS;
+ char* pBufferFile = NIL;
+ char* pBuffer_out = NIL;
+
+ if( (NIL == resourceID) ||
+ (NIL == defaultDataBuffer_out) ||
+ (0 > hDefaultDataFile))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgReadDefaultData"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* read file content */
+ siResult = cfg_priv_read_file(hDefaultDataFile, &pBufferFile);
+ siResult = (0 == siResult) ? PAS_FAILURE : siResult;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* parse the default data file */
+
+ json_object* jsobj = NIL; /* deallocation is in caller's responsibility */
+ jsobj = json_tokener_parse(pBufferFile);
+ if( NIL == jsobj )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgReadDefaultData"),
+ DLT_STRING("-"),
+ DLT_STRING("json_tokener_parse"));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* get size to accommodate values */
+ siResult = cfg_priv_json_parse_get_values_size(jsobj, resourceID);
+ siResult = (0 == siResult) ? PAS_FAILURE_NOT_FOUND : siResult;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ pBuffer_out = (char*) malloc(((size_t)siResult * sizeof(char))); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if( NIL == pBuffer_out )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgReadDefaultData"),
+ DLT_STRING("-"),
+ DLT_STRING("error"),
+ DLT_INT(siResult),
+ DLT_STRING("allocating"),
+ DLT_INT(siResult),
+ DLT_STRING("bytes"));
+ siResult = PAS_FAILURE_OUT_OF_MEMORY;
+ }
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+ /* work with temporary variables */
+ signed int siResultTemp = siResult;
+ char* pBuffer_outTemp = pBuffer_out;
+
+ /* reset */
+ (void)memset(pBuffer_out, 0, (size_t)siResult * sizeof(char));
+ /* parse default data file */
+ siResultTemp = cfg_priv_json_parse_get_values(jsobj, resourceID, &pBuffer_outTemp, &siResultTemp, 0);
+ /* interpret result */
+ siResult = (siResultTemp != siResult) ? PAS_FAILURE : siResultTemp;
+ }
+
+ if( PAS_SUCCESS < siResult )
+ {
+#ifdef VERBOSE_TRACE
+ /* debug only */
+ print_buffer(pBuffer_out, (unsigned int)siResult);
+#endif
+ /* parse corresponding array and extract specific information */
+ siResult = cfg_priv_extract_default_data_information(pBuffer_out, siResult, defaultDataBuffer_out, bufferSize);
+ }
+
+ if(NIL != jsobj)
+ {/* deallocation is in caller's responsibility */
+ json_object_put(jsobj) ;
+ }
+ }
+
+ /* perform cleaning operations */
+ if( NIL != pBuffer_out )
+ {
+ free(pBuffer_out); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBuffer_out = NIL;
+ }
+
+ if( NIL != pBufferFile )
+ {
+ free(pBufferFile); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pBufferFile = NIL;
+ }
+
+ /* size of data */
+ return siResult;
+
+} /* persAdmCfgReadDefaultData() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static signed int cfg_priv_read_file(signed int handlerRCT, char** ppBufferFile)
+{
+ signed int siResult = PAS_SUCCESS;
+ struct stat sstat;
+
+ if( NIL == ppBufferFile )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("cfg_priv_read_file"),
+ DLT_STRING("-"),
+ DLT_STRING("invalid input parameters"));
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ /* re-position at the start of file */
+ (void)lseek(handlerRCT, 0, SEEK_SET);
+
+ siResult = fstat(handlerRCT, &sstat);
+ if( PAS_SUCCESS > siResult )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("cfg_priv_read_file"),
+ DLT_STRING("-"),
+ DLT_STRING("stat error"),
+ DLT_INT(siResult));
+ siResult = PAS_FAILURE;
+ }
+ else
+ {
+ /* allocate memory to read in the file */
+ *ppBufferFile = (char*) malloc(((size_t)sstat.st_size + 1 /* '\0' */) * sizeof(char)); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if( NIL == (*ppBufferFile) )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persAdmCfgRctRead"),
+ DLT_STRING("-"),
+ DLT_STRING("error"),
+ DLT_INT(siResult),
+ DLT_STRING("allocating"),
+ DLT_INT(sstat.st_size + 1),
+ DLT_STRING("bytes"));
+ siResult = PAS_FAILURE_OUT_OF_MEMORY;
+ }
+ }
+ }
+
+ if( PAS_SUCCESS <= siResult )
+ {
+ /* reset */
+ (void)memset(*ppBufferFile, 0, ((size_t)(sstat.st_size + 1 /* '\0' */) * sizeof(char)) );
+
+ siResult = read(handlerRCT, *ppBufferFile, (size_t)sstat.st_size);
+ if( siResult != sstat.st_size )
+ {
+ /* raise & set error */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("cfg_priv_read_file"),
+ DLT_STRING("-"),
+ DLT_STRING("read error"),
+ DLT_INT(siResult),
+ DLT_STRING("!="),
+ DLT_INT(sstat.st_size));
+ siResult = PAS_FAILURE;
+
+ /* free the allocated memory */
+ free(*ppBufferFile); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ *ppBufferFile = NIL;
+ }
+ }
+
+ /* return number of bytes in the file */
+ return siResult;
+
+} /* cfg_priv_read_file() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/* Assumption that pBuffer_in contains information in the following form: "key1\0data1\0key2\0data2\0.." */
+static signed int cfg_priv_extract_rct_information(char* pBuffer_in, signed int siBufferSize, PersistenceConfigurationKey_s * psConfig_out)
+{
+ signed int siResult = PAS_SUCCESS;
+
+ /* paranoia check */
+ if( (NIL == pBuffer_in) ||
+ (NIL == psConfig_out) ||
+ (0 > siBufferSize))
+ {
+ /* set error */
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ char* pBufferTemp = pBuffer_in;
+
+ /* reset the buffer content */
+ (void)memset(psConfig_out, 0x0, sizeof(PersistenceConfigurationKey_s)) ;
+
+ while( pBufferTemp < (pBuffer_in + siBufferSize) )/* TODO: compute end size only once */
+ {
+ if( 0 == strcmp(g_JSON_Key_Names[JsonKey_Policy], pBufferTemp) )
+ {
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ psConfig_out->policy = (PersistencePolicy_e)cfg_priv_json_to_pas(pBufferTemp);
+ }
+ if( 0 == strcmp(g_JSON_Key_Names[JsonKey_Storage], pBufferTemp) )
+ {
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ psConfig_out->storage = (PersistenceStorage_e)cfg_priv_json_to_pas(pBufferTemp);
+ if(PersistenceStorage_custom == psConfig_out->storage)
+ {
+ /* for the situation when WebTool does not provide the name of the custom plugin in a separate tag "custom_name" */
+ (void)snprintf(psConfig_out->custom_name, sizeof(psConfig_out->custom_name), "%s", pBufferTemp);
+ }
+ }
+ if( 0 == strcmp(g_JSON_Key_Names[JsonKey_Type], pBufferTemp) )
+ {
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ psConfig_out->type = (PersistenceResourceType_e)cfg_priv_json_to_pas(pBufferTemp);
+ }
+ if( 0 == strcmp(g_JSON_Key_Names[JsonKey_Permission], pBufferTemp) )
+ {
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ psConfig_out->permission = cfg_priv_json_to_pas(pBufferTemp);
+ }
+ if( 0 == strcmp(g_JSON_Key_Names[JsonKey_MaxSize], pBufferTemp) )
+ {
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ psConfig_out->max_size = (unsigned int)atoi(pBufferTemp);
+ }
+ if( 0 == strcmp(g_JSON_Key_Names[JsonKey_Responsible], pBufferTemp) )
+ {
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ (void)snprintf(psConfig_out->reponsible, sizeof(psConfig_out->reponsible), "%s", pBufferTemp);
+ }
+ if( 0 == strcmp(g_JSON_Key_Names[JsonKey_CustomName], pBufferTemp) )
+ {
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ (void)snprintf(psConfig_out->custom_name, sizeof(psConfig_out->custom_name), "%s", pBufferTemp);
+ }
+ if( 0 == strcmp(g_JSON_Key_Names[JsonKey_CustomID], pBufferTemp) )
+ {
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ (void)snprintf(psConfig_out->customID, sizeof(psConfig_out->customID), "%s", pBufferTemp);
+ }
+
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ }
+ }
+
+ return siResult;
+
+} /* cfg_priv_extract_rct_information() */
+
+
+static signed int cfg_priv_extract_rules_information(char* pBuffer_in, PersAdminCfgInstallRules_e* peRule_out)
+{
+ signed int siResult = PAS_SUCCESS;
+
+ /* paranoia check */
+ if( (NIL == pBuffer_in) ||
+ (NIL == peRule_out) )
+ {
+ /* set error */
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ *peRule_out = (PersAdminCfgInstallRules_e)cfg_priv_json_to_pas(pBuffer_in);
+ }
+
+ return siResult;
+
+} /* cfg_priv_extract_rules_information() */
+
+
+static signed int cfg_priv_extract_exception_information(char* pBuffer_in, PersAdminCfgInstallExceptions_e* peException_out)
+{
+ signed int siResult = PAS_SUCCESS;
+
+ /* paranoia check */
+ if( (NIL == pBuffer_in) ||
+ (NIL == peException_out) )
+ {
+ /* set error */
+ siResult = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ *peException_out = (PersAdminCfgInstallExceptions_e)cfg_priv_json_to_pas(pBuffer_in);
+ }
+
+ return siResult;
+
+} /* cfg_priv_extract_exception_information() */
+
+
+static signed int cfg_priv_extract_default_data_information(char* pBuffer_in, signed int siBufferSize_in, char* defaultDataBuffer_out, signed int siBufferSize_out)
+{
+ signed int siDataSize = 0;
+
+ /* paranoia check */
+ if( (NIL == pBuffer_in) ||
+ (NIL == defaultDataBuffer_out) ||
+ (0 > siBufferSize_out))
+ {
+ /* set error */
+ siDataSize = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ char* pBufferData = NIL ;
+ char* pBufferTemp = pBuffer_in;
+
+ /* size'\0'15'\0'data'\0'0102030405060708090A0B0C0D0E0F'\0'; */
+ while( pBufferTemp < (pBuffer_in + siBufferSize_in) )
+ {
+ if( 0 == strcmp(g_JSON_Key_Names[JsonKey_Size], pBufferTemp) )
+ {
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ siDataSize = atoi(pBufferTemp);
+ }
+ if( 0 == strcmp(g_JSON_Key_Names[JsonKey_Data], pBufferTemp) )
+ {
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ pBufferData = pBufferTemp ;
+ }
+ pBufferTemp += (strlen(pBufferTemp) + 1 /* \0 */);
+ }
+
+ if( (0 > siDataSize) || (siDataSize > siBufferSize_out) || (NIL == pBufferData) )
+ {
+ /* raise & set error */
+ siDataSize = PAS_FAILURE_INVALID_PARAMETER;
+ }
+ else
+ {
+ unsigned int i = 0;
+ pBufferTemp = pBufferData;
+
+ /* parse buffer */
+ while( pBufferTemp < (pBufferData + (siDataSize * 2)) )
+ {
+ (void)sscanf(pBufferTemp, "%2x", (unsigned int*)(defaultDataBuffer_out + i));
+ /* printf("%d : 0x%x\n", i, *(defaultDataBuffer_out + i)); */
+ /* step over 2 characters */
+ pBufferTemp += 2;
+ /* move on to the next element in output buffer */
+ ++i;
+ }
+ }
+ }
+
+ /* return number of bytes */
+ return siDataSize;
+
+} /* cfg_priv_extract_default_data_information() */
+
+
+/* JSON <-> PAS */
+
+static uint32_t cfg_priv_json_to_pas(char* pBuffer_in)
+{
+ uint32_t u32Result = 0;
+ uint32_t i = 0;
+ bool_t bFound = false;
+ uint32_t u32ElementsNo = sizeof(g_JSON_LookUp_Table)/sizeof(g_JSON_LookUp_Table[0]);
+
+ for( i = 0; (i < u32ElementsNo) && (false == bFound); ++i )
+ {
+ if( 0 == strcmp(g_JSON_LookUp_Table[i].pstrValue_JSON, pBuffer_in) )
+ {
+ u32Result = g_JSON_LookUp_Table[i].u32Value_PAS;
+ bFound = true;
+ }
+ }
+
+ return u32Result;
+
+} /* cfg_priv_json_to_pas() */
+
+
+/* JSON PARSER */
+
+static signed int cfg_priv_json_parse_get_keys(json_object* jsobj, char const * resourceID, char** ppBuffer_out, signed int* psiBufferSize, unsigned int uiNestingCounter)
+{
+ signed int siResult = 0;
+ enum json_type type;
+ char* key = NIL;
+ struct json_object* val = NIL;
+ struct lh_entry* entry = NIL;
+
+ if( (++uiNestingCounter) >= MAX_NESTING_DEPTH )
+ {
+ /* set error */
+ siResult = PAS_FAILURE;
+ /* printf("cfg_priv_json_parse_get_keys - MAX_NESTING_DEPTH\n"); */
+ }
+
+ if( NIL != json_object_get_object(jsobj) )
+ {
+ entry = json_object_get_object(jsobj)->head;
+ key = ( NIL != entry ) ? (char*)entry->k : key;
+ val = ( NIL != entry ) ? (struct json_object*)entry->v : val;
+
+ while( (NIL != entry) && (NIL != key) && (NIL != val) && (0 <= siResult) )
+ {
+ if( 0 == strcmp(resourceID, key) )
+ {
+ type = json_object_get_type(val);
+ if( json_type_object == type )
+ {
+ siResult = cfg_priv_json_parse_get_keys_all(json_object_object_get(jsobj, key), ppBuffer_out, psiBufferSize);
+ }
+ break;
+ }
+ else
+ {
+ type = json_object_get_type(val);
+ if( json_type_object == type )
+ {
+ /* recursive */
+ signed int sTempResult = cfg_priv_json_parse_get_keys(json_object_object_get(jsobj, key), resourceID, ppBuffer_out, psiBufferSize, uiNestingCounter);
+ siResult = (sTempResult < 0) ? (sTempResult) : (siResult + sTempResult);
+ }
+ }
+
+ /* move on to the next entry */
+ entry = entry->next;
+ key = ( NIL != entry ) ? (char*)entry->k : key;
+ val = ( NIL != entry ) ? (struct json_object*)entry->v : val;
+ }
+ }
+
+ /* return size */
+ return siResult;
+
+} /* cfg_priv_json_parse_get_keys() */
+
+
+static signed int cfg_priv_json_parse_get_keys_all(json_object* jsobj, char** ppBuffer_out, signed int* psiBufferSize)
+{
+ signed int siResult = 0;
+ char* key = NIL;
+ struct lh_entry* entry = NIL;
+ /* remember starting point */
+ char* pBufferTemp = *ppBuffer_out;
+ signed int siBufferSizeTemp = *psiBufferSize;
+
+ if( NIL != json_object_get_object(jsobj) )
+ {
+ entry = json_object_get_object(jsobj)->head;
+ key = ( NIL != entry ) ? (char*)entry->k : key;
+
+ while( (NIL != entry) && (NIL != key) )
+ {
+ size_t szKey = strlen(key) + 1;
+ if( NIL != pBufferTemp )
+ {
+ if( (siResult + (signed int)szKey) <= siBufferSizeTemp )
+ {
+ /* get key */
+ (void)snprintf(*ppBuffer_out, (size_t)(*psiBufferSize), "%s%c", key, '\0');
+ *ppBuffer_out += szKey;
+ *psiBufferSize -= szKey;
+
+ /* get key length */
+ siResult += (signed int)szKey;
+ }
+ else
+ {
+ siResult = PAS_FAILURE_BUFFER_TOO_SMALL;
+ }
+ }
+ else
+ {
+ /* get key length */
+ siResult += (signed int)szKey;
+ }
+
+ /* move on to the next entry */
+ entry = entry->next;
+ key = ( NIL != entry ) ? (char*)entry->k : key;
+ }
+ }
+
+ /* return size */
+ return siResult;
+
+} /* cfg_priv_json_parse_get_keys_all() */
+
+
+static signed int cfg_priv_json_parse_get_values(json_object* jsobj, char const * resourceID, char** ppBuffer_out, signed int* psiBufferSize, unsigned int uiNestingCounter)
+{
+ signed int siResult = 0;
+ enum json_type type;
+ char* key = NIL;
+ struct json_object* val = NIL;
+ struct lh_entry* entry = NIL;
+
+ if( (++uiNestingCounter) >= MAX_NESTING_DEPTH )
+ {
+ /* set error */
+ siResult = PAS_FAILURE;
+ /* printf("cfg_priv_json_parse_get_values - MAX_NESTING_DEPTH\n"); */
+ }
+
+ if( NIL != json_object_get_object(jsobj) )
+ {
+ entry = json_object_get_object(jsobj)->head;
+ key = ( NIL != entry ) ? (char*)entry->k : key;
+ val = ( NIL != entry ) ? (struct json_object*)entry->v : val;
+
+ while( (NIL != entry) && (NIL != key) && (NIL != val) && (0 <= siResult) )
+ {
+ if( 0 == strcmp(resourceID, key) )
+ {
+ /* key found; */
+ type = json_object_get_type(val);
+ if( json_type_object == type )
+ {
+ siResult = cfg_priv_json_parse_get_values_all(json_object_object_get(jsobj, key), ppBuffer_out, psiBufferSize, uiNestingCounter);
+ }
+ else
+ {
+ /* get value */
+ siResult = cfg_priv_json_get_value(val, ppBuffer_out, psiBufferSize);
+ }
+
+ /* exit for; */
+ break;
+ }
+ else
+ {
+ type = json_object_get_type(val);
+ if( json_type_object == type )
+ {
+ /* recursive */
+ signed int sTempResult = cfg_priv_json_parse_get_values(json_object_object_get(jsobj, key), resourceID, ppBuffer_out, psiBufferSize, uiNestingCounter);
+ siResult = (sTempResult < 0) ? (sTempResult) : (siResult + sTempResult);
+ }
+ }
+
+ /* move on to the next entry */
+ entry = entry->next;
+ key = ( NIL != entry ) ? (char*)entry->k : key;
+ val = ( NIL != entry ) ? (struct json_object*)entry->v : val;
+ }
+ }
+
+ /* return size */
+ return siResult;
+
+} /* cfg_priv_json_parse_get_values() */
+
+
+static signed int cfg_priv_json_parse_get_values_all(json_object* jsobj, char** ppBuffer_out, signed int* psiBufferSize, unsigned int uiNestingCounter)
+{
+ signed int siResult = 0;
+ enum json_type type;
+ char* key = NIL;
+ struct json_object* val = NIL;
+ struct lh_entry* entry = NIL;
+ /* remember starting point */
+ char* pBufferTemp = *ppBuffer_out;
+ signed int siBufferSizeTemp = *psiBufferSize;
+
+ if( (++uiNestingCounter) >= MAX_NESTING_DEPTH )
+ {
+ /* set error */
+ siResult = PAS_FAILURE;
+ /* printf("cfg_priv_json_parse_get_values_all - MAX_NESTING_DEPTH\n"); */
+ }
+
+ if( NIL != json_object_get_object(jsobj) )
+ {
+ entry = json_object_get_object(jsobj)->head;
+ key = ( NIL != entry ) ? (char*)entry->k : key;
+ val = ( NIL != entry ) ? (struct json_object*)entry->v : val;
+
+ while( (NIL != entry) && (NIL != key) && (NIL != val) && (0 <= siResult) )
+ {
+ size_t szKey = strlen(key) + 1;
+ if( NIL != pBufferTemp )
+ {
+ if( (siResult + (signed int)szKey) <= siBufferSizeTemp )
+ {
+ /* get key */
+ (void)snprintf(*ppBuffer_out, (size_t)(*psiBufferSize), "%s%c", key, '\0');
+ *ppBuffer_out += szKey;
+ *psiBufferSize -= szKey;
+
+ /* get key length */
+ siResult += (signed int)szKey;
+ /* (void)printf("key wanted = <%s>\n", key); */
+ }
+ else
+ {
+ siResult = PAS_FAILURE_BUFFER_TOO_SMALL;
+ }
+ }
+ else
+ {
+ /* get key length */
+ siResult += (signed int)szKey;
+ /* (void)printf("key = <%s>\n", key); */
+ }
+
+ type = json_object_get_type(val);
+ if( json_type_object == type )
+ {
+ /* get value length */
+ /* recursive */
+ signed int sTempResult = cfg_priv_json_parse_get_values_all(json_object_object_get(jsobj, key), ppBuffer_out, psiBufferSize, uiNestingCounter);
+ siResult = (sTempResult < 0) ? (sTempResult) : (siResult + sTempResult);
+ }
+ else
+ {
+ /* get value length */
+ signed int sTempResult = cfg_priv_json_get_value(val, ppBuffer_out, psiBufferSize);
+ siResult = (sTempResult < 0) ? (sTempResult) : (siResult + sTempResult);
+ }
+
+ /* move on to the next entry */
+ entry = entry->next;
+ key = ( NIL != entry ) ? (char*)entry->k : key;
+ val = ( NIL != entry ) ? (struct json_object*)entry->v : val;
+ }
+ }
+
+ /* return size */
+ return siResult;
+
+} /* cfg_priv_json_parse_get_values_all() */ /*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static signed int cfg_priv_json_get_value(json_object *jsobj, char** ppBuffer_out, signed int* psiBufferSize)
+{
+ signed int siResult = 0;
+ enum json_type type;
+ /* remember starting point */
+ char* pBufferTemp = *ppBuffer_out;
+ signed int siBufferSizeTemp = *psiBufferSize;
+
+ /* get the type of the json object*/
+ type = json_object_get_type(jsobj);
+
+ switch( type )
+ {
+ case json_type_boolean:
+ {
+ siResult = PAS_FAILURE_OPERATION_NOT_SUPPORTED;
+ (void)printf("NOT IMPLEMENTED - json_type_boolean\n");
+ /*printf("value: %s \n", json_object_get_boolean(jsobj)? "true":"false");*/
+ break;
+ }
+ case json_type_double:
+ {
+ siResult = PAS_FAILURE_OPERATION_NOT_SUPPORTED;
+ (void)printf("NOT IMPLEMENTED - json_type_double\n");
+ /*printf("value: %lf\n", json_object_get_double(jsobj)); */
+ break;
+ }
+ case json_type_int:
+ {
+ siResult = PAS_FAILURE_OPERATION_NOT_SUPPORTED;
+ (void)printf("NOT IMPLEMENTED - json_type_int\n");
+ /* printf("value: %d\n", json_object_get_int(jsobj)); */
+ break;
+ }
+ case json_type_string:
+ {
+ const char* sObjVal = json_object_get_string(jsobj);
+ size_t szKey = strlen(sObjVal) + 1;
+
+ if( NIL != pBufferTemp )
+ {
+ if( (signed int)szKey <= siBufferSizeTemp )
+ {
+ /* get value */
+ (void)snprintf(*ppBuffer_out, (size_t)(*psiBufferSize), "%s%c", sObjVal, '\0');
+ *ppBuffer_out += szKey;
+ *psiBufferSize -= szKey;
+
+ /* get value length */
+ siResult = (signed int)szKey;
+ /* (void)printf("value wanted = <%s>\n", sObjVal); */
+ }
+ else
+ {
+ siResult = PAS_FAILURE_BUFFER_TOO_SMALL;
+ }
+ }
+ else
+ {
+ /* get value length */
+ siResult = (signed int)szKey;
+ /* (void)printf("value = <%s>\n", sObjVal); */
+ }
+
+ break;
+ }
+ case json_type_array:
+ {
+ siResult = PAS_FAILURE_OPERATION_NOT_SUPPORTED;
+ (void)printf("NOT IMPLEMENTED - json_type_array\n");
+ break;
+ }
+ default:
+ {
+ siResult = PAS_FAILURE_OPERATION_NOT_SUPPORTED;
+ (void)printf("NOT IMPLEMENTED\n");
+ break;
+ }
+ }
+
+ return siResult;
+
+} /* cfg_priv_json_get_value() */
+
+
+static signed int cfg_priv_json_parse_get_keys_size(json_object* jsobj, char const * resourceID)
+{
+ char* pTemp = NIL;
+ signed int siTempSize = UNDEFINED_SIZE;
+ signed int siResult = cfg_priv_json_parse_get_keys(jsobj, resourceID, &pTemp, &siTempSize, 0);
+
+ #ifdef VERBOSE_TRACE
+ /* some info */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("cfg_priv_json_parse_get_keys_size"),
+ DLT_STRING("-"),
+ DLT_INT(siResult));
+ #endif
+
+ /* return size */
+ return siResult;
+
+} /* cfg_priv_json_parse_get_keys_size() */
+
+
+static signed int cfg_priv_json_parse_get_keys_all_size(json_object* jsobj)
+{
+ char* pTemp = NIL;
+ signed int siTempSize = UNDEFINED_SIZE;
+ signed int siResult = cfg_priv_json_parse_get_keys_all(jsobj, &pTemp, &siTempSize);
+
+ #ifdef VERBOSE_TRACE
+ /* some info */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("cfg_priv_json_parse_get_keys_all_size"),
+ DLT_STRING("-"),
+ DLT_INT(siResult));
+ #endif
+
+ /* return size */
+ return siResult;
+
+} /* cfg_priv_json_parse_get_keys_all_size() */
+
+
+static signed int cfg_priv_json_parse_get_values_size(json_object* jsobj, char const * resourceID)
+{
+ char* pTemp = NIL;
+ signed int siTempSize = UNDEFINED_SIZE;
+ signed int siResult = cfg_priv_json_parse_get_values(jsobj, resourceID, &pTemp, &siTempSize, 0);
+
+ #ifdef VERBOSE_TRACE
+ /* some info */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("cfg_priv_json_parse_get_values_size"),
+ DLT_STRING("-"),
+ DLT_INT(siResult));
+ #endif
+
+ /* return size */
+ return siResult;
+
+} /* cfg_priv_json_parse_get_values_size() */
+
+
+#ifdef VERBOSE_TRACE
+static void print_buffer(char* pBuffer, unsigned int uiSize)
+{
+ char* ptemp = pBuffer;
+ /* iterate through array and print keys and values */
+ (void)printf("============================\n");
+ (void)printf("size = %d\n", uiSize);
+ while( ptemp < (pBuffer + uiSize) )
+ {
+ (void)printf("%s\n", ptemp);
+ /* move on to the next */
+ ptemp += (strlen(ptemp) + 1 /* \0 */);
+ }
+ (void)printf("============================\n");
+
+} /* print_buffer() */
+#endif
+
+
+#if 0
+void json_parse_array( json_object *jobj, char *key)
+{
+ enum json_type type;
+ int arraylen = 0;
+ int i;
+ json_object * jvalue;
+ json_object *jarray = jobj; /*Simply get the array*/
+
+ if(key)
+ {
+ jarray = json_object_object_get(jobj, key); /*Getting the array if it is a key value pair*/
+ }
+
+ arraylen = json_object_array_length(jarray); /*Getting the length of the array*/
+ printf("Array Length: %d \n",arraylen);
+
+ for( i = 0; i< arraylen; i++ )
+ {
+ jvalue = json_object_array_get_idx(jarray, i); /*Getting the array element at position i*/
+ type = json_object_get_type(jvalue);
+ if (type == json_type_array)
+ {
+ /* recursive */
+ json_parse_array(jvalue, NIL);
+ }
+ else if (type != json_type_object)
+ {
+ printf("value[%d]: ",i);
+ print_json_value(jvalue);
+ printf("\n");
+ }
+ else
+ {
+ persadmin_priv_cfg_json_parse(jvalue);
+ }
+ }
+}
+#endif
+
diff --git a/Administrator/src/ssw_pers_admin_data_export.c b/Administrator/src/ssw_pers_admin_data_export.c
new file mode 100644
index 0000000..3a488b3
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_data_export.c
@@ -0,0 +1,68 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Marian.Nestor@continental-corporation.com
+*
+* Implementation of export process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.16 uidn3565 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include <string.h>
+
+#include "persistence_admin_service.h"
+#include "ssw_pers_admin_common.h"
+#include "ssw_pers_admin_service.h"
+
+//moved to "ssw_pers_admin_common.h"
+//extern const char StringTerminator;
+
+long persadmin_data_folder_export(PersASSelectionType_e type, pconststr_t dst_folder)
+{
+ long result = 0;
+
+ if ( type == PersASSelectionType_Application )
+ {
+ int listSize = persadmin_list_application_folders_get_size( "" );
+
+ if ( listSize > 0 )
+ {
+ char appList[ listSize ];
+
+ listSize = persadmin_list_application_folders( "", appList, listSize );
+
+ if ( listSize > 0 )
+ {
+ char * crtApp = appList;
+ int totalBackupSize = 0;
+ result = 0;
+ while ( ( ( * crtApp ) != 0 ) && ( result >= 0 ) )
+ {
+ int crtAppLen = strlen( crtApp );
+ totalBackupSize += result;
+ result = persadmin_data_backup_create( type, dst_folder, crtApp, PERSIST_SELECT_ALL_USERS, PERSIST_SELECT_ALL_SEATS );
+ crtApp += crtAppLen + sizeof( StringTerminator );
+ }
+ // The size of the last backup hasn't been added to the overall counter
+ if ( result >= 0 )
+ {
+ result += totalBackupSize;
+ }
+ }
+ }
+ }
+ else
+ {
+ result = persadmin_data_backup_create( type, dst_folder, "", PERSIST_SELECT_ALL_USERS, PERSIST_SELECT_ALL_SEATS );
+ }
+
+ return result;
+
+} /* data_folder_export() */
diff --git a/Administrator/src/ssw_pers_admin_data_import.c b/Administrator/src/ssw_pers_admin_data_import.c
new file mode 100644
index 0000000..3b3bd9e
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_data_import.c
@@ -0,0 +1,133 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Liviu.Ciocanta@continental-corporation.com
+*
+* Implementation of import process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.15 uidn3504 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include <dirent.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <dlt.h>
+#include <stdlib.h>
+
+#include "ssw_pers_admin_files_helper.h"
+#include "ssw_pers_admin_common.h"
+#include "ssw_pers_admin_service.h"
+#include "persistence_admin_service.h"
+#include "persComDataOrg.h"
+
+
+#define USER_ALL PERSIST_SELECT_ALL_USERS
+#define SEAT_ALL PERSIST_SELECT_ALL_SEATS
+#define MAX_PATH (PERS_ORG_MAX_LENGTH_PATH_FILENAME + 1)//256
+#define MAX_APP_NO 256
+
+//moved to "ssw_pers_admin_common.h"
+//extern const char StringTerminator;
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+/**
+ * \brief Allow the import of data from specified folder to the system respecting different level (application, user or complete)
+ *
+ * \param type represent the quality of the data to backup: all, application, user
+ * \param src_folder name of the source folder of the data
+ *
+ * \return positive value: number of bytes imported; negative value: error code
+ */
+long persadmin_data_folder_import(PersASSelectionType_e type, pconststr_t src_folder)
+{
+ long lRetVal = 0;
+ str_t appName[MAX_PATH];
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO,
+ DLT_STRING("->persadmin_data_folder_import : type = "), DLT_INT(type),
+ DLT_STRING(" , src_folder = "), DLT_STRING(src_folder));
+
+ switch (type)
+ {
+ case PersASSelectionType_Application:
+ {
+ int appListSize = persadmin_list_application_folders_get_size(src_folder);
+ pstr_t list = NIL;
+
+ DLT_LOG_STRING_INT(persAdminSvcDLTCtx, DLT_LOG_INFO, "size of src_folder="
+ ,appListSize);
+// DLT_LOG_STRING(persAdminSvcDLTCtx, DLT_LOG_INFO, "list of apps :");
+
+ if(appListSize > 0)
+ {
+ list = (pstr_t)malloc((unsigned int)appListSize*sizeof(str_t));/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+ else
+ {
+ DLT_LOG_STRING_INT(persAdminSvcDLTCtx, DLT_LOG_ERROR, "NEGATIVE size of src_folder="
+ ,appListSize);
+ }
+
+ if(NIL != list )
+ {
+ //str_t list[ appListSize ];
+
+ appListSize = persadmin_list_application_folders(src_folder, list, appListSize);
+
+ if(appListSize > 0)
+ {
+ int totalSize = 0;
+ char * crtApp = list;
+ lRetVal = 0;
+
+ while ((*crtApp != '\0') && (lRetVal >=0))
+ {
+ totalSize += lRetVal;
+ (void)strcpy(appName, crtApp);
+ DLT_LOG_STRING(persAdminSvcDLTCtx, DLT_LOG_INFO, appName );
+ lRetVal = persadmin_data_backup_recovery(type, src_folder, appName, USER_ALL, SEAT_ALL);
+ crtApp+=strlen(appName)+sizeof(StringTerminator); //QAC - TODO: add deviation grant.
+ }
+ //add last result
+ if(lRetVal >= 0)
+ {
+ lRetVal += totalSize;
+ }
+ }
+ free(list);/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ list = NIL;
+ }
+ else
+ {
+ DLT_LOG_STRING(persAdminSvcDLTCtx, DLT_LOG_ERROR, "Could not allocate App. list!");
+ }
+ break;
+ }
+ case PersASSelectionType_All://fall-through
+ case PersASSelectionType_User:
+ {
+ DLT_LOG_STRING_INT(persAdminSvcDLTCtx, DLT_LOG_INFO,
+ "Calling persadmin_data_backup_recovery, type=%d",type);
+ lRetVal = persadmin_data_backup_recovery(type, src_folder, "", USER_ALL, SEAT_ALL);
+ break;
+ }
+ default:
+ {
+ lRetVal = PAS_FAILURE;
+ break;
+ }
+ }
+
+ return lRetVal;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
diff --git a/Administrator/src/ssw_pers_admin_database_helper.c b/Administrator/src/ssw_pers_admin_database_helper.c
new file mode 100644
index 0000000..257c1df
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_database_helper.c
@@ -0,0 +1,616 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ana.Chisca@continental-corporation.com
+*
+* Implementation of functions declared in ssw_pers_admin_database_helper.h
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.01.08 uidn3591 CSP_WZ#9979: Cleaning & fix delete and copy keys by filter to conform to requirements
+* 2013.01.03 uidl9757 CSP_WZ#2060: Common interface to be used by both PCL and PAS
+* 2012.12.04 uidn3591 CSP_WZ#1280: Bug fix
+* 2012.11.22 uidn3591 CSP_WZ#1280: Minor bug fix
+* 2012.11.19 uidn3591 CSP_WZ#1280: Creation
+*
+**********************************************************************************************************************/
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "persComTypes.h"
+#include "dlt.h" /* L&T */
+#include "ssw_pers_admin_files_helper.h" /* defined interface */
+
+#include "persComDataOrg.h"
+#include "persComDbAccess.h"
+#include "persComRct.h"
+
+#include "ssw_pers_admin_database_helper.h" /* defined interface */
+#include "ssw_pers_admin_common.h"
+#include "persistence_admin_service.h"
+
+/* L&T context */
+#define LT_HDR "DB >> "
+DLT_IMPORT_CONTEXT (persAdminSvcDLTCtx)
+
+#define PAS_USER_IDENTIFIER PERS_ORG_USER_FOLDER_NAME
+#define PAS_SEAT_IDENTIFIER PERS_ORG_SEAT_FOLDER_NAME
+#define PAS_SHARED_IDENTIFIER PERS_ORG_SHARED_FOLDER_NAME
+
+
+#define PrintDbPath( Root, DataPath, ... ) \
+ if ( bufSize > 0 ) { \
+ int toWrite = snprintf( pchDBPaths_out, bufSize, "%s", Root ); \
+ bufSize -= toWrite; \
+ pchDBPaths_out += toWrite; \
+ totalAmountWritten += toWrite; \
+ } \
+ if ( bufSize > 0 ) { \
+ int toWrite = snprintf( pchDBPaths_out, bufSize, DataPath, __VA_ARGS__ ); \
+ totalAmountWritten += toWrite += sizeof( StringTerminator ); \
+ bufSize -= toWrite; \
+ pchDBPaths_out += toWrite; \
+ }
+
+static int persadmin_priv_copy_keys_by_filter (PersASSelectionType_e type, char* pchdestDBPath, char* pchsourceDBPath, unsigned int user_no, unsigned int seat_no);
+static int persadmin_priv_delete_keys_by_filter (PersASSelectionType_e type, char* pchDBPath, unsigned int user_no, unsigned int seat_no);
+static sint_t persadmin_priv_filter_keys_in_list (PersASSelectionType_e type, unsigned int user_no, unsigned int seat_no, pstr_t pUnfilteredList, pstr_t pFilteredList_out, sint_t iListSize) ;
+
+static int persadmin_priv_get_all_local_db_names ( const char * pchRootPath, const char * pchAppName, char* pchDBPaths_out, int bufSize );
+static int persadmin_priv_get_all_shared_db_names ( const char * pchRootPath, char* pchDBPaths_out, int bufSize );
+static int persadmin_priv_get_all_shared_group_db_names ( const char * pchRootPath, const char * pchDataPathFormat, const char * dbName, const char * defaultDbName, char* pchDBPaths_out, int * bufferSize );
+
+/**
+ * @brief get the names of an application's databases based on the databases' type (local/shared)
+ * @usage:
+ *
+ * @param pchDBRootPath [in] path to the folder where to look for the databases
+ * @param pchAppName [in] application for which the databases are requested
+ * @param eStorage [in] the type of the requested databases
+ * @param pchDBPaths_out [out] pointer to a buffer where to store the databases' names [the databases' names are separated by '\0']
+ * @param bufSize [in] size of buffer
+ *
+ * @return positive value: size of data passed in pchDBPaths_out ; negative value - error
+ * TODO: define error codes
+ */
+sint_t persadmin_get_all_db_paths_with_names(pconststr_t pchDBRootPath, pconststr_t pchAppName, PersistenceStorage_e eStorage, pstr_t pchDBPaths_out, sint_t bufSize)
+{
+ sint_t result = PAS_FAILURE ;
+
+ if ( ( pchDBRootPath != NIL ) && ( ( pchAppName != NIL ) || ( eStorage != PersistenceStorage_local ) ) && ( pchDBPaths_out != NIL ) && ( bufSize >= sizeof( StringTerminator ) ) && ( eStorage < PersistenceStorage_LastEntry ) )
+ {
+ int writtenAmount = 0;
+
+ switch ( eStorage )
+ {
+ case PersistenceStorage_local :
+ {
+ result = persadmin_priv_get_all_local_db_names( pchDBRootPath, pchAppName, pchDBPaths_out, bufSize );
+ break;
+ }
+ case PersistenceStorage_shared :
+ {
+ result = persadmin_priv_get_all_shared_db_names( pchDBRootPath, pchDBPaths_out, bufSize );
+ break;
+ }
+ default :
+ {
+ result = PAS_FAILURE_INVALID_PARAMETER;
+ break;
+ }
+ }
+
+ if ( result >= 0 )
+ {
+ writtenAmount += result;
+ bufSize -= result;
+ if ( bufSize > 0 )
+ {
+ memmove( pchDBPaths_out + writtenAmount, & StringTerminator, sizeof( StringTerminator ) );
+ result = writtenAmount + sizeof( StringTerminator );
+ }
+ else
+ {
+ result = PAS_FAILURE_BUFFER_TOO_SMALL ;
+ }
+ }
+ }
+
+ return result;
+} /* persadmin_get_all_db_paths_with_names() */
+
+
+/**
+ * @brief deletes keys filtered by user name and seat number
+ *
+ * @param pchDBPath[in] path to where the DB can be located
+ * @param user_no [in] the user ID
+ * @param seat_no [in] the seat number (seat 1 to 4; 0xFF is for all seats)
+ *
+ * @return 0 for success, negative value otherwise;
+ * TODO: define error codes
+ */
+int persadmin_delete_keys_by_filter(PersASSelectionType_e type, char* pchDBPath, unsigned int user_no, unsigned int seat_no)
+{
+ sint_t s32Result = PAS_SUCCESS;
+
+ if( NIL == pchDBPath )
+ {
+ // set error;
+ s32Result = PAS_FAILURE_INVALID_PARAMETER;
+ // some info;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_delete_keys_by_filter -"), DLT_STRING("invalid input parameters"));
+ }
+
+ if( PAS_SUCCESS == s32Result )
+ {
+ // some info;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("persadmin_delete_keys_by_filter -"), DLT_INT(user_no), DLT_INT(seat_no), DLT_STRING(pchDBPath));
+
+ // select what keys to delete from the database;
+ s32Result = persadmin_priv_delete_keys_by_filter(type, pchDBPath, user_no, seat_no);
+ }
+
+ // return result;
+ return s32Result;
+
+} /* persadmin_delete_keys_by_filter() */
+
+
+/**
+ * @brief copies keys filtered by user name and seat number
+ *
+ * @param pchdestDBPath [in] destination DB path
+ * @param pchsourceDBPath[in] source DB path
+ * @param user_no [in] the user ID
+ * @param seat_no [in] the seat number (seat 1 to 4; 0xFF is for all seats)
+ *
+ * @return 0 for success, negative value otherwise;
+ * TODO: define error codes
+ */
+int persadmin_copy_keys_by_filter(PersASSelectionType_e type, char* pchdestDBPath, char* pchsourceDBPath, unsigned int user_no, unsigned int seat_no)
+{
+ sint_t s32Result = PAS_SUCCESS;
+
+ if( (NIL == pchsourceDBPath) || (NIL == pchdestDBPath) || (PersASSelectionType_All > type ) || (PersASSelectionType_LastEntry < type ))
+ {
+ // set error;
+ s32Result = PAS_FAILURE_INVALID_PARAMETER;
+ // some info;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("persadmin_copy_keys_by_filter -"),
+ DLT_STRING("invalid input parameters"));
+ }
+
+ if( PAS_SUCCESS == s32Result )
+ {
+ // some info;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("persadmin_copy_keys_by_filter -"),
+ DLT_INT(user_no), DLT_INT(seat_no),
+ DLT_STRING("from"),
+ DLT_STRING("\""), DLT_STRING(pchsourceDBPath), DLT_STRING("\" "),
+ DLT_STRING("to"),
+ DLT_STRING("\""), DLT_STRING(pchdestDBPath), DLT_STRING("\" "));
+
+ if( 0 <= persadmin_check_if_file_exists(pchsourceDBPath, false) )
+ {
+ // select what keys to copy from one database to another;
+ s32Result = persadmin_priv_copy_keys_by_filter(type, pchdestDBPath, pchsourceDBPath, user_no, seat_no);
+ }
+ }
+
+ // return result;
+ return s32Result;
+
+} /* persadmin_copy_keys_by_filter() */
+
+
+static int persadmin_priv_copy_keys_by_filter(PersASSelectionType_e type, char* pchdestDBPath, char* pchsourceDBPath, unsigned int user_no, unsigned int seat_no)
+{
+ sint_t s32Result = PAS_FAILURE ;
+
+ bool_t bEverythingOK = true ;
+ pstr_t pSrcUnfilteredList = NIL ;
+ pstr_t pSrcListFiltered = NIL ;
+ sint_t iSrcListUnfilteredSize = 0 ;
+ sint_t iSrcListFilteredSize = 0 ;
+
+ sint_t iHandlerSrcDB = -1 ;
+ sint_t iHandlerDestDB = -1 ;
+
+ /* get a list of the keys in pchsourceDBPath */
+ iHandlerSrcDB = persComDbOpen(pchsourceDBPath, false) ;
+ if(iHandlerSrcDB >= 0)
+ {
+ iSrcListUnfilteredSize = persComDbGetSizeKeysList(iHandlerSrcDB) ;
+ if(iSrcListUnfilteredSize > 0)
+ {
+ pSrcUnfilteredList = (pstr_t)malloc(iSrcListUnfilteredSize) ;
+ pSrcListFiltered = (pstr_t)malloc(iSrcListUnfilteredSize) ;
+ if((NIL != pSrcUnfilteredList) && (NIL != pSrcListFiltered))
+ {
+ if(iSrcListUnfilteredSize != persComDbGetKeysList(iHandlerSrcDB, pSrcUnfilteredList, iSrcListUnfilteredSize))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ s32Result = PAS_FAILURE_OUT_OF_MEMORY ;
+ }
+ }
+ else
+ {
+ if(iSrcListUnfilteredSize < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ s32Result = iHandlerSrcDB ;
+ }
+
+ if(bEverythingOK && (iSrcListUnfilteredSize > 0))
+ {
+ iHandlerDestDB = persComDbOpen(pchdestDBPath, true) ;
+ if(iHandlerDestDB < 0)
+ {
+ bEverythingOK = false ;
+ s32Result = iHandlerDestDB ;
+ }
+ }
+
+ if(bEverythingOK && (iSrcListUnfilteredSize > 0))
+ {
+ iSrcListFilteredSize = persadmin_priv_filter_keys_in_list(type, user_no, seat_no, pSrcUnfilteredList, pSrcListFiltered, iSrcListUnfilteredSize) ;
+ }
+
+ if(bEverythingOK && (iSrcListFilteredSize > 0))
+ {
+ sint_t iPosInList = 0 ;
+ pstr_t pCurrentKeyName = NIL ;
+
+ while(bEverythingOK && (iPosInList < iSrcListFilteredSize))
+ {
+ pCurrentKeyName = pSrcListFiltered + iPosInList ;
+
+ str_t keyData[PERS_DB_MAX_SIZE_KEY_DATA] ;
+ sint_t iDataSize = persComDbReadKey(iHandlerSrcDB, pCurrentKeyName, keyData, sizeof(keyData)) ;
+ if(iDataSize >= 0)
+ {
+ sint_t iError = persComDbWriteKey(iHandlerDestDB, pCurrentKeyName, keyData, iDataSize) ;
+ if(iError < 0)
+ {
+ bEverythingOK = false ;
+ s32Result = iError ;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_priv_copy_keys_by_filter - persComDbWriteKey"),
+ DLT_STRING(pCurrentKeyName),
+ DLT_STRING("size = "), DLT_INT(iDataSize),
+ DLT_STRING((iError >= 0) ? "OK" : "FAILED")) ;
+ }
+
+
+ iPosInList += strlen(pCurrentKeyName) + 1 ; /* 1 <=> list items separator */
+ }
+ }
+
+ if(pSrcUnfilteredList != NIL)
+ {
+ free(pSrcUnfilteredList) ;
+ }
+ if(pSrcListFiltered!= NIL)
+ {
+ free(pSrcListFiltered) ;
+ }
+ if(iHandlerSrcDB >= 0)
+ {
+ persComDbClose(iHandlerSrcDB) ;
+ }
+ if(iHandlerDestDB >= 0)
+ {
+ persComDbClose(iHandlerDestDB) ;
+ }
+
+ return bEverythingOK ? PAS_SUCCESS : s32Result ;
+} /* persadmin_priv_copy_keys_by_filter() */
+
+
+static int persadmin_priv_delete_keys_by_filter(PersASSelectionType_e type, char* pchDBPath, unsigned int user_no, unsigned int seat_no)
+{
+ sint_t s32Result = PAS_FAILURE ;
+
+ bool_t bEverythingOK = true ;
+ pstr_t pListUnfiltered = NIL ;
+ sint_t iListUnfilteredSize = 0 ;
+ pstr_t pListFiltered = NIL ;
+ sint_t iListFilteredSize = 0 ;
+
+ sint_t iHandlerDB = -1 ;
+
+ /* get a list of the keys in pchsourceDBPath */
+ iHandlerDB = persComDbOpen(pchDBPath, false) ;
+ if(iHandlerDB >= 0)
+ {
+ iListUnfilteredSize = persComDbGetSizeKeysList(iHandlerDB) ;
+ if(iListUnfilteredSize > 0)
+ {
+ pListUnfiltered = (pstr_t)malloc(iListUnfilteredSize) ;
+ pListFiltered = (pstr_t)malloc(iListUnfilteredSize) ;
+ if((NIL != pListUnfiltered) && (NIL != pListFiltered))
+ {
+ if(iListUnfilteredSize != persComDbGetKeysList(iHandlerDB, pListUnfiltered, iListUnfilteredSize))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ s32Result = PAS_FAILURE_OUT_OF_MEMORY ;
+ }
+ }
+ else
+ {
+ if(iListUnfilteredSize < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ s32Result = iHandlerDB ;
+ }
+
+ if(bEverythingOK && (iListUnfilteredSize > 0))
+ {
+ iListFilteredSize = persadmin_priv_filter_keys_in_list(type, user_no, seat_no, pListUnfiltered, pListFiltered, iListUnfilteredSize) ;
+ }
+
+ if(bEverythingOK && (iListFilteredSize > 0))
+ {
+ sint_t iPosInList = 0 ;
+ pstr_t pCurrentKeyName = NIL ;
+
+ while(bEverythingOK && (iPosInList < iListFilteredSize))
+ {
+ pCurrentKeyName = pListFiltered + iPosInList ;
+
+ sint_t iError = persComDbDeleteKey(iHandlerDB, pCurrentKeyName) ;
+ if(iError < 0)
+ {
+ bEverythingOK = false ;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_priv_delete_keys_by_filter - persComDbDeleteKey"), DLT_STRING(pCurrentKeyName), DLT_STRING((iError >= 0) ? "OK" : "FAILED")) ;
+
+ iPosInList += strlen(pCurrentKeyName) + 1 ; /* 1 <=> list items separator */
+ }
+ }
+
+
+ if(pListUnfiltered != NIL)
+ {
+ free(pListUnfiltered) ;
+ }
+ if(pListFiltered!= NIL)
+ {
+ free(pListFiltered) ;
+ }
+ if(iHandlerDB >= 0)
+ {
+ persComDbClose(iHandlerDB) ;
+ }
+
+ return bEverythingOK ? PAS_SUCCESS : s32Result ;
+
+} /* persadmin_priv_delete_keys_by_filter() */
+
+
+static sint_t persadmin_priv_filter_keys_in_list(PersASSelectionType_e type, unsigned int user_no, unsigned int seat_no, pstr_t pUnfilteredList, pstr_t pFilteredList_out, sint_t iListSize)
+{
+ str_t prefixToSearch[64] ; /* enough for something like "/user/1/seat/2/" */
+ sint_t iPrefixLength ;
+ sint_t iPosInUnfilteredList = 0 ;
+ sint_t iPosInFilteredList = 0 ;
+
+ if( PERSIST_SELECT_ALL_USERS != user_no )
+ {
+ if( PERSIST_SELECT_ALL_SEATS != seat_no )
+ {
+ // "/user/1/seat/4";
+ snprintf(prefixToSearch, sizeof(prefixToSearch), "/%s/%d/%s/%d/",
+ PERS_ORG_USER_FOLDER_NAME, user_no, PERS_ORG_SEAT_FOLDER_NAME, seat_no);
+ }
+ else
+ {
+ // "/user/1/";
+ snprintf(prefixToSearch, sizeof(prefixToSearch), "/%s/%d/",
+ PERS_ORG_USER_FOLDER_NAME, user_no);
+ }
+ }
+ else
+ {
+ switch( type )
+ {
+ case PersASSelectionType_All:
+ case PersASSelectionType_Application:
+ {
+ // let everything pass through (actually we should look for "/node/" or "/user/");
+ snprintf(prefixToSearch, sizeof(prefixToSearch), "/");
+ break;
+ }
+
+ case PersASSelectionType_User:
+ {
+ // "/user/";
+ snprintf(prefixToSearch, sizeof(prefixToSearch), "/%s/",
+ PERS_ORG_USER_FOLDER_NAME);
+ break;
+ }
+
+ default:
+ {
+ /* nothing to do */
+ break;
+ }
+ }
+
+ }
+
+ iPrefixLength = strlen(prefixToSearch);
+ while( iPosInUnfilteredList < iListSize )
+ {
+ pstr_t pCurrentKeyName = pUnfilteredList + iPosInUnfilteredList;
+ sint_t iKeyLength = strlen(pCurrentKeyName) ;
+
+ // check if pCurrentKeyName begins with the searched prefix;
+ if( 0 == strncmp(pCurrentKeyName, prefixToSearch, iPrefixLength) )
+ {
+ strcpy(pFilteredList_out + iPosInFilteredList, pCurrentKeyName);
+ iPosInFilteredList += (iKeyLength + 1); /* 1 <=> list items separator */
+ }
+
+ iPosInUnfilteredList += (iKeyLength + 1); /* 1 <=> list items separator */
+ }
+
+ return iPosInFilteredList;
+
+} /* persadmin_priv_filter_keys_in_list() */
+
+
+static int persadmin_priv_get_all_local_db_names( const char * pchRootPath, const char * pchAppName, char* pchDBPaths_out, int bufSize )
+{
+ int result = PAS_FAILURE, totalAmountWritten = 0;
+
+ PrintDbPath( pchRootPath, gLocalCachePath, pchAppName, gLocalCached );
+ PrintDbPath( pchRootPath, gLocalCachePath, pchAppName, gLocalCachedDefault );
+ PrintDbPath( pchRootPath, gLocalCachePath, pchAppName, gLocalWt );
+ PrintDbPath( pchRootPath, gLocalCachePath, pchAppName, gLocalWtDefault );
+
+ PrintDbPath( pchRootPath, gLocalWtPath, pchAppName, gLocalWt );
+ PrintDbPath( pchRootPath, gLocalWtPath, pchAppName, gLocalWtDefault );
+ PrintDbPath( pchRootPath, gLocalWtPath, pchAppName, gLocalCached );
+ PrintDbPath( pchRootPath, gLocalWtPath, pchAppName, gLocalCachedDefault );
+
+ if ( bufSize >= 0 )
+ {
+ result = totalAmountWritten;
+ }
+
+ return result;
+} /* persadmin_priv_get_all_local_db_names() */
+
+
+static int persadmin_priv_get_all_shared_db_names( const char * pchRootPath, char* pchDBPaths_out, int bufSize )
+{
+ int result = PAS_FAILURE, totalAmountWritten = 0;
+
+ PrintDbPath( pchRootPath, gSharedPublicCachePath, gSharedCached );
+ PrintDbPath( pchRootPath, gSharedPublicCachePath, gSharedCachedDefault );
+ PrintDbPath( pchRootPath, gSharedPublicCachePath, gSharedWt );
+ PrintDbPath( pchRootPath, gSharedPublicCachePath, gSharedWtDefault );
+
+ PrintDbPath( pchRootPath, gSharedPublicWtPath, gSharedWt );
+ PrintDbPath( pchRootPath, gSharedPublicWtPath, gSharedWtDefault );
+ PrintDbPath( pchRootPath, gSharedPublicWtPath, gSharedCached );
+ PrintDbPath( pchRootPath, gSharedPublicWtPath, gSharedCachedDefault );
+
+ if ( bufSize > 0 )
+ {
+ result = persadmin_priv_get_all_shared_group_db_names( pchRootPath, gSharedCachePathString, gSharedCached, gSharedCachedDefault, pchDBPaths_out, & bufSize );
+ if ( result >= 0 )
+ {
+ totalAmountWritten += result;
+ pchDBPaths_out += result;
+ }
+ }
+ if ( bufSize > 0 )
+ {
+ result = persadmin_priv_get_all_shared_group_db_names( pchRootPath, gSharedWtPathString, gSharedWt, gSharedWtDefault, pchDBPaths_out, & bufSize );
+ if ( result >= 0 )
+ {
+ totalAmountWritten += result;
+ pchDBPaths_out += result;
+ }
+ }
+ if ( bufSize > 0 )
+ {
+ result = persadmin_priv_get_all_shared_group_db_names( pchRootPath, gSharedCachePathString, gSharedWt, gSharedWtDefault, pchDBPaths_out, & bufSize );
+ if ( result >= 0 )
+ {
+ totalAmountWritten += result;
+ pchDBPaths_out += result;
+ }
+ }
+ if ( bufSize > 0 )
+ {
+ result = persadmin_priv_get_all_shared_group_db_names( pchRootPath, gSharedWtPathString, gSharedCached, gSharedCachedDefault, pchDBPaths_out, & bufSize );
+ if ( result >= 0 )
+ {
+ totalAmountWritten += result;
+ pchDBPaths_out += result;
+ }
+ }
+
+ if ( bufSize >= 0 )
+ {
+ result = totalAmountWritten;
+ }
+
+ return result;
+} /* persadmin_priv_get_all_shared_db_names() */
+
+
+static int persadmin_priv_get_all_shared_group_db_names( const char * pchRootPath, const char * pchDataPathFormat, const char * dbName, const char * defaultDbName, char* pchDBPaths_out, int * bufferSize )
+{
+ int result = PAS_FAILURE, totalAmountWritten = 0;
+
+ int rootPathLen = strlen( pchRootPath );
+ char sharedPath[ rootPathLen + sizeof( PathSeparator ) + strlen( pchDataPathFormat ) + sizeof( StringTerminator ) ];
+ snprintf( sharedPath, sizeof( sharedPath ), "%s%c", pchRootPath, PathSeparator );
+ snprintf( sharedPath + rootPathLen + sizeof( PathSeparator ), sizeof( sharedPath ) - rootPathLen - sizeof( PathSeparator ), pchDataPathFormat, "", "" );
+
+ result = persadmin_list_folder_get_size( sharedPath, PersadminFilterFolders, false );
+ if ( result > 0 )
+ {
+ char fileList[ result + sizeof( StringTerminator ) ];
+ memset( fileList, 0, sizeof( fileList ) );
+ result = persadmin_list_folder( sharedPath, fileList, result, PersadminFilterFolders, false );
+
+ if ( result > 0 )
+ {
+ char * crtPath = fileList;
+ int bufSize = ( * bufferSize );
+ while ( ( bufSize >= 0 ) && ( ( * crtPath ) != StringTerminator ) )
+ {
+ PrintDbPath( pchRootPath, pchDataPathFormat, crtPath, dbName );
+ PrintDbPath( pchRootPath, pchDataPathFormat, crtPath, defaultDbName );
+ crtPath += strlen( crtPath ) + sizeof( StringTerminator );
+ }
+ ( * bufferSize ) = bufSize;
+
+ if ( bufSize >= 0 )
+ {
+ result = totalAmountWritten;
+ }
+ }
+ }
+
+ return result;
+} /* persadmin_priv_get_all_shared_group_db_names() */
diff --git a/Administrator/src/ssw_pers_admin_dbus.c b/Administrator/src/ssw_pers_admin_dbus.c
new file mode 100644
index 0000000..0214642
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_dbus.c
@@ -0,0 +1,450 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of DBus for Persistence Administration Service
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013-09-17 uidu0250 CSP_WZ#5633: Wait for NSM to start before registration.
+* 2013-03-09 uidu0250 CSP_WZ#4480: Added persadmin_QuitDBusMainLoop function
+* 2013-04-04 uidu0250 CSP_WZ#2739: Moved PAS<->PCL communication to common part under PersCommonIPC.
+* 2013.03.26 uidu0250 CSP_WZ#3171: Update PAS registration to NSM
+* 2013.02.15 uidu0250 CSP_WZ#8849: Modified PAS<->PCL communication interface
+* 2013.02.04 uidu0250 CSP_WZ#2211: Rework for QAC compliancy
+* 2012.11.28 uidu0250 CSP_WZ#1280: Updated implementation according to the updated org.genivi.persistence.admin interface
+* 2012.11.13 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <gio/gio.h>
+#include <pthread.h>
+#include <dlt.h>
+
+#include "persComErrors.h"
+
+#include "ssw_pers_admin_dbus.h"
+#include "ssw_pers_admin_service.h"
+#include "NodeStateTypes.h"
+#include "NodeStateConsumer.h"
+#include "NodeStateLifecycleConsumer.h"
+
+
+/**********************************************************************************************************************
+*
+* Local defines, macros, constants and type definitions.
+*
+**********************************************************************************************************************/
+
+#define PAS_SHUTDOWN_TIMEOUT 60000 /* ms */
+
+/**********************************************************************************************************************
+*
+* Global variables. Initialization of global contexts.
+*
+**********************************************************************************************************************/
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+static GMainLoop *g_pMainLoop = NIL;
+static GDBusConnection *g_pBusConnection = NIL;
+static NodeStateLifeCycleConsumerSkeleton *g_pNSLCSkeleton = NIL;
+static NodeStateConsumerProxy *g_pNSCProxy = NIL;
+
+static volatile bool_t g_bDBusConnInit = false;
+static bool_t g_bRegisteredToNSM = false; /* registration to NSM status */
+
+
+/**********************************************************************************************************************
+*
+* Prototypes for local functions (see implementation for description)
+*
+**********************************************************************************************************************/
+
+static void OnBusAcquired_cb( GDBusConnection *connection, const gchar *name, gpointer user_data);
+static void OnNameAcquired_cb( GDBusConnection *connection, const gchar *name, gpointer user_data);
+static void OnNameLost_cb( GDBusConnection *connection, const gchar *name, gpointer user_data);
+static void OnNameAppeared( GDBusConnection *connection, const gchar *name, const gchar *name_owner, gpointer user_data);
+
+
+/* LifecycleRequest */
+static gboolean OnHandleLifecycleRequest ( NodeStateLifeCycleConsumer *object,
+ GDBusMethodInvocation *invocation,
+ guint arg_Request,
+ guint arg_RequestId);
+
+/* ExportNSMConsumerIF */
+static bool_t ExportNSMConsumerIF(GDBusConnection *connection);
+
+
+
+/**********************************************************************************************************************
+*
+* The function is called when a connection to the D-Bus could be established.
+* According to the documentation the objects should be exported here.
+*
+* \param connection: Connection, which was acquired
+* \param name: Bus name
+* \param user_data: Optionally user data
+*
+* \return void
+*
+**********************************************************************************************************************/
+static void OnBusAcquired_cb( GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ bool_t bRetVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Successfully connected to D-Bus."));
+
+ /* Store the connection. */
+ g_pBusConnection = connection;
+
+ /* Export the org.genivi.NodeStateManager.LifeCycleConsumer interface over DBus trough the PAS object */
+ bRetVal = ExportNSMConsumerIF(connection);
+ if(true == bRetVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Successfully connected to D-Bus and exported object."));
+ }
+}
+
+
+
+/**********************************************************************************************************************
+*
+* The function is called when the "bus name" could be acquired on the D-Bus.
+*
+* \param connection: Connection over which the bus name was acquired
+* \param name: Acquired bus name
+* \param user_data: Optionally user data
+*
+* \return void
+*
+**********************************************************************************************************************/
+
+static void OnNameAcquired_cb( GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Successfully obtained D-Bus name:");
+ DLT_STRING(name));
+
+ /* DBus connection initialized */
+ g_bDBusConnInit = true;
+}
+
+
+
+/**********************************************************************************************************************
+*
+* The function is called if either no connection to D-Bus could be established or
+* the bus name could not be acquired.
+*
+* \param connection: Connection. If it is NIL, no D-Bus connection could be established.
+* Otherwise the bus name was lost.
+* \param name: Bus name
+* \param user_data: Optionally user data
+*
+* \return void
+*
+**********************************************************************************************************************/
+static void OnNameLost_cb( GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data )
+{
+ if(connection == NIL)
+ {
+ /* Error: the connection could not be established. */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to establish D-Bus connection."));
+ }
+ else
+ {
+ /* Error: connection established, but name not obtained. This might be a second instance of the application */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to obtain bus name ");
+ DLT_STRING(name);
+ DLT_STRING("."));
+ }
+
+ /* In both cases leave the main loop. */
+ g_main_loop_quit(g_pMainLoop);
+
+ /* DBus connection lost */
+ g_bDBusConnInit = false;
+}
+
+
+/**********************************************************************************************************************
+*
+* Invoked when the name being watched is known to have an owner.
+*
+* \param connection: The GDBusConnection the name is being watched on.
+* \param name: The name being watched.
+* \param name_owner: Unique name of the owner of the name being watched.
+* \param user_data: Optionally user data
+*
+* \return void
+*
+**********************************************************************************************************************/
+static void OnNameAppeared( GDBusConnection *connection,
+ const gchar *name,
+ const gchar *name_owner,
+ gpointer user_data )
+{
+ GError *pError = NIL;
+ gboolean gbRetVal;
+ gint gErrorCode = NsmErrorStatus_NotSet;
+
+ if(false == g_bRegisteredToNSM)
+ {
+ /* Register to NSM as shutdown client */
+ g_pNSCProxy = NIL;
+ g_pNSCProxy = (NodeStateConsumerProxy *) node_state_consumer_proxy_new_sync(g_pBusConnection,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NSM_BUS_NAME,
+ NSM_CONSUMER_OBJECT,
+ NIL,
+ &pError);
+ if(NIL == g_pNSCProxy)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING("Failed to create proxy for NSC. Error :"),
+ DLT_STRING(pError->message));
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to register to NSM as shutdown client."));
+ g_error_free (pError);
+ }
+ else
+ {
+ /* Synchronous call to "RegisterShutdownClient" */
+ gbRetVal = node_state_consumer_call_register_shutdown_client_sync( (NodeStateConsumer *)g_pNSCProxy,
+ PERSISTENCE_ADMIN_SVC_BUS_NAME,
+ PERSISTENCE_ADMIN_SVC_OBJ_PATH,
+ NSM_SHUTDOWNTYPE_NORMAL|NSM_SHUTDOWNTYPE_FAST,
+ PAS_SHUTDOWN_TIMEOUT,
+ &gErrorCode,
+ NIL,
+ &pError);
+ if(FALSE == gbRetVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING("RegisterShutdownClient call failed. Error :"),
+ DLT_STRING(pError->message));
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to register to NSM as shutdown client."));
+
+ g_error_free (pError);
+ g_object_unref(g_pNSCProxy);
+ g_pNSCProxy = NIL;
+ }
+ else
+ {
+ if(NsmErrorStatus_Ok != gErrorCode)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to register to NSM as shutdown client. Error code :"),
+ DLT_INT(gErrorCode));
+ g_object_unref(g_pNSCProxy);
+ g_pNSCProxy = NIL;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Successfully registered to NSM as shutdown client."));
+
+ g_bRegisteredToNSM = true;
+ }
+ }
+ }
+ }
+}
+
+/**********************************************************************************************************************
+*
+* Handler for LifecycleRequest.
+* Signature based on generated code.
+*
+**********************************************************************************************************************/
+static gboolean OnHandleLifecycleRequest ( NodeStateLifeCycleConsumer *object,
+ GDBusMethodInvocation *invocation,
+ guint arg_Request,
+ guint arg_RequestId)
+{
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Received NSM shutdown notification."));
+
+ /* send a NsmErrorStatus_ResponsePending response and wait for PAS to
+ * finish any operation in progress */
+ node_state_life_cycle_consumer_complete_lifecycle_request( object,
+ invocation,
+ NsmErrorStatus_ResponsePending);
+
+
+ if( (0 != (NSM_SHUTDOWNTYPE_NORMAL & arg_Request)) ||
+ (0 != (NSM_SHUTDOWNTYPE_FAST & arg_Request)))
+ {
+ /* set shutdown state and wait for the current operation to finish*/
+ /* Any other PAS request is denied after this point
+ * (unless a cancel shutdown notification is received)
+ */
+ (void)persadmin_set_shutdown_state(true);
+ }
+ else
+ {
+ if(0 != (NSM_SHUTDOWNTYPE_RUNUP & arg_Request))
+ {
+ (void)persadmin_set_shutdown_state(false);
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING("Invalid NSM notification received:"),
+ DLT_UINT(arg_Request));
+ }
+ }
+
+
+ /* Notify NSM that the request was finished */
+ node_state_consumer_call_lifecycle_request_complete((NodeStateConsumer *)g_pNSCProxy,
+ arg_RequestId,
+ NsmErrorStatus_Ok,
+ NIL,
+ NIL,
+ NIL);
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Finished preparing for shutdown."));
+
+ return (TRUE);
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+
+/**********************************************************************************************************************
+*
+* Function that exports the org.genivi.NodeStateManager.LifeCycleConsumer interface over DBus trough the PAS object.
+*
+* \param connection: Connection over which the interface should be exported
+*
+* \return true if successful, false otherwise
+*
+**********************************************************************************************************************/
+static bool_t ExportNSMConsumerIF(GDBusConnection *connection)
+{
+ GError *pError = NIL;
+
+ /* Create object to offer on the DBus (for NSMConsumer) */
+ g_pNSLCSkeleton = (NodeStateLifeCycleConsumerSkeleton*) node_state_life_cycle_consumer_skeleton_new();
+
+ (void)g_signal_connect(g_pNSLCSkeleton, "handle-lifecycle-request", G_CALLBACK(&OnHandleLifecycleRequest), NIL);
+
+ /* Attach interface to the object and export it */
+ if(FALSE == g_dbus_interface_skeleton_export( G_DBUS_INTERFACE_SKELETON(g_pNSLCSkeleton),
+ g_pBusConnection,
+ PERSISTENCE_ADMIN_SVC_OBJ_PATH,
+ &pError))
+ {
+ /* Error: NSM Consumer object could not be exported. */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to export LifeCycleConsumer interface. Error :"),
+ DLT_STRING(pError->message));
+ g_error_free(pError);
+ return false;
+ }
+
+ return true;
+}
+
+
+/**
+ * \brief Starts the main DBus loop. Returns when the DBus connection is closed
+ *
+ * \return void
+ */
+void persadmin_RunDBusMainLoop(void)
+{
+ uint32_t u32ConnectionId;
+ guint watcherId;
+ GBusNameWatcherFlags flags = G_BUS_NAME_WATCHER_FLAGS_NONE;
+
+ /* Initialize GLib */
+ g_type_init(); /* deprecated. Since GLib 2.36, the type system is initialized automatically and this function does nothing.*/
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Creating a new DBus connection..."));
+
+ /* Connect to the D-Bus. Obtain a bus name to offer PAS objects */
+ u32ConnectionId = g_bus_own_name( PERSISTENCE_ADMIN_SVC_BUS_TYPE
+ , PERSISTENCE_ADMIN_SVC_BUS_NAME
+ , G_BUS_NAME_OWNER_FLAGS_NONE
+ , &OnBusAcquired_cb
+ , &OnNameAcquired_cb
+ , &OnNameLost_cb
+ , NIL
+ , NIL);
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("D-Bus connection Id: "), DLT_UINT32(u32ConnectionId));
+
+ /* Watch the NSM bus name */
+ watcherId = g_bus_watch_name ( PERSISTENCE_ADMIN_SVC_BUS_TYPE, /* NSM uses the same bus type as PAS */
+ NSM_BUS_NAME,
+ flags,
+ &OnNameAppeared,
+ NIL,
+ NIL,
+ NIL);
+
+ /* Create the main loop */
+ g_pMainLoop = g_main_loop_new(NIL, FALSE);
+
+ /* The main loop is only canceled if the Node is completely shut down or the D-Bus connection fails */
+ g_main_loop_run(g_pMainLoop);
+
+ g_bus_unwatch_name (watcherId);
+
+ /* If the main loop returned, clean up. Release bus name and main loop */
+ g_bus_unown_name(u32ConnectionId);
+
+ g_main_loop_unref(g_pMainLoop);
+ g_pMainLoop = NIL;
+
+ /* Release the (created) skeleton object */
+ if(NIL != g_pNSLCSkeleton)
+ {
+ g_object_unref(g_pNSLCSkeleton);
+ g_pNSLCSkeleton = NIL;
+ }
+
+ /* Release the (created) proxy object */
+ if(NIL != g_pNSCProxy)
+ {
+ g_object_unref(g_pNSCProxy);
+ g_pNSCProxy = NIL;
+ }
+}
+
+
+/**
+ * \brief Quits the main DBus loop
+ *
+ * \return void
+ */
+void persadmin_QuitDBusMainLoop(void)
+{
+ if(true == g_bDBusConnInit)
+ {
+ if(NIL != g_pMainLoop)
+ {
+ g_main_loop_quit(g_pMainLoop);
+ g_bDBusConnInit = false;
+ }
+ }
+}
+
+
+/**
+ * \brief Check if the registration to NSM was performed successfully.
+ *
+ * \return true if registered to NSM, false otherwise
+ */
+bool_t persadmin_IsRegisteredToNSM(void)
+{
+ return g_bRegisteredToNSM;
+}
+
diff --git a/Administrator/src/ssw_pers_admin_files_helper.c b/Administrator/src/ssw_pers_admin_files_helper.c
new file mode 100644
index 0000000..8744c02
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_files_helper.c
@@ -0,0 +1,1596 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Implementation of functions declared in ssw_pers_admin_files_helper.h
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.05.30 uidl9757 CSP_WZ#12188: Rework persadmin_get_folder_size()
+* 2013.02.07 uidu0250 CSP_WZ#2220: Added persadmin_check_for_same_file_content to check for identical file content
+* 2012.11.16 uidv2833 CSP_WZ#1280: persadmin_delete_folder and persadmin_delete_file return the number of bytes deleted
+* 2012.11.15 uidl9757 CSP_WZ#1280: Some extensions:
+ - persadmin_copy_folder and persadmin_copy_file return the number of bytes copied
+ - added persadmin_check_if_file_exist and persadmin_check_if_file_exist
+ - fixed some bugs
+* 2012.11.12 uidl9757 CSP_WZ#1280: Created
+*
+**********************************************************************************************************************/
+
+/* ---------------------- include files --------------------------------- */
+#include "persComTypes.h"
+#include <stddef.h>
+#include <stdio.h> //TODO: use correct grant
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#include "persistence_admin_service.h"
+#include "ssw_pers_admin_files_helper.h"
+#include "ssw_pers_admin_common.h"
+
+#include "dlt/dlt.h"
+
+#define LT_HDR "CONF >> "
+DLT_IMPORT_CONTEXT (persAdminSvcDLTCtx)
+
+
+#define GetApplicationRootPath( RootPath, FullPath ) \
+ int pathLength = strlen( RootPath ); \
+ char FullPath[ strlen( gLocalCachePath ) + pathLength + sizeof( StringTerminator ) ]; \
+ (void)snprintf( FullPath, sizeof( FullPath ), "%s", RootPath ); \
+ (void)snprintf( FullPath + pathLength, sizeof( FullPath ) - pathLength, gLocalCachePath, "", "" )
+
+const char PathSeparator = '/';
+const char StringTerminator = '\0';
+
+/* ---------------------- local types -------------------------------------- */
+typedef struct
+{
+ pstr_t rootPath ;
+ pstr_t absPath ;
+ sint_t startOfRelativePath ;
+}folder_path_s ;
+
+/* ---------------------- local functions ---------------------------------- */
+static bool_t persadmin_check_dir_entry_against_filter(struct stat *psb, PersadminFilterMode_e eFilter) ;
+static sint_t persadmin_list_subfolder(folder_path_s* psFolderPath, pstr_t buffer_out, sint_t bufSize, sint_t * posInBuffer, PersadminFilterMode_e eFilter, bool_t bRecursive, sint_t posInCompletePath, sint_t nestingLevel) ;
+static sint_t persadmin_copy_subfolders(pstr_t absPathSource, sint_t posInSourcePath, pstr_t absPathDestination, sint_t posInDestPath, sint_t nestingCounter, PersadminFilterMode_e eFilter, bool_t bRecursive) ;
+static sint_t persadmin_delete_subfolders(pstr_t folderPath, sint_t posInFolderPath, sint_t nestingLevel) ;
+static sint_t persadmin_priv_get_file_size( pconststr_t absPathFileName );
+
+/* ---------------------- local variables ---------------------------------- */
+static str_t g_msg[512] ;
+
+static bool_t persadmin_check_dir_entry_against_filter(struct stat *psb, PersadminFilterMode_e eFilter)
+{
+ bool_t bFileMatchesFilter = false ;
+
+ switch(eFilter)
+ {
+ case PersadminFilterAll:
+ {
+ bFileMatchesFilter = ( (S_ISREG(psb->st_mode)) || (S_ISDIR(psb->st_mode)) || (S_ISLNK(psb->st_mode)) ) ;
+ break ;
+ }
+ case PersadminFilterFilesAll:
+ {
+ bFileMatchesFilter = ( (S_ISREG(psb->st_mode)) || (S_ISLNK(psb->st_mode)) ) ;
+ break ;
+ }
+ case PersadminFilterFilesRegular:
+ {
+ bFileMatchesFilter = (S_ISREG(psb->st_mode)) ;
+ break ;
+ }
+ case PersadminFilterFilesLink:
+ {
+ bFileMatchesFilter = (S_ISLNK(psb->st_mode)) ;
+ break ;
+ }
+ case PersadminFilterFoldersAndRegularFiles:
+ {
+ bFileMatchesFilter = ( (S_ISREG(psb->st_mode)) || (S_ISDIR(psb->st_mode)) ) ;
+ break ;
+ }
+ case PersadminFilterFoldersAndLinkFiles:
+ {
+ bFileMatchesFilter = ( (S_ISLNK(psb->st_mode)) || (S_ISDIR(psb->st_mode)) ) ;
+ break ;
+ }
+ case PersadminFilterFolders:
+ {
+ bFileMatchesFilter = (S_ISDIR(psb->st_mode)) ;
+ break ;
+ }
+ default:
+ {
+ break ;
+ }
+ }
+
+ return bFileMatchesFilter ;
+}
+
+
+/*
+* filePath can be absolute or relative
+* it is not checked if the file indicated by filePath actually exist
+* returns in fileName_out the part of filePath after the last '/' (or the complete filePath if there is no '/')
+*/
+sint_t persadmin_get_filename(pstr_t filePath, pstr_t fileName_out, sint_t size)
+{
+ bool_t bEverythingOK = true ;
+ bool_t bFilenameFound = false ;
+ sint_t filePathSize = 0 ;
+
+ if( (NIL == filePath) || (NIL == fileName_out))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_filename: invalid params") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ else
+ {
+ filePathSize = (sint_t)strlen(filePath) ;
+ }
+
+ if(bEverythingOK)
+ {
+ /* filename is the part after the last '/' in the path (but path must not end with '/') */
+ sint_t posInFilePath = filePathSize-1 ;
+ if('/' != filePath[posInFilePath])
+ {
+ while((posInFilePath >= 0) && bEverythingOK && (! bFilenameFound))
+ {
+ if('/' == filePath[posInFilePath])
+ {
+ if((filePathSize - (posInFilePath+1)) < size)
+ {
+ (void)strcpy(fileName_out, filePath+posInFilePath+1) ;
+ bFilenameFound = true ;
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_filename: size too large (%d, available %d)", (filePathSize - (posInFilePath+1)), size) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ }
+ posInFilePath-- ;
+ }
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_filename: filePath ends with '/'") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ }
+
+ if(bEverythingOK && (! bFilenameFound))
+ {
+ /* no '/' found in the path, so return the complete path */
+ if((filePathSize < size) && (bEverythingOK))
+ {
+ (void)strcpy(fileName_out, filePath) ;
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_filename: size too large (%d, available %d)", (filePathSize+1), size) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ }
+
+ return (bEverythingOK ? 0 : PAS_FAILURE) ;
+}
+
+/*
+* filePath can be absolute or relative
+* it is not checked if the file indicated by filePath actually exist
+* returns the part of filePath after the last '.' (but must be after the last '/')
+*/
+sint_t persadmin_get_file_extension(pstr_t filePath, pstr_t fileExtension_out, sint_t size)
+{
+ bool_t bEverythingOK = true ;
+ bool_t bExtensionFound = false ;
+
+ if( (NIL == filePath) || (NIL == fileExtension_out))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_file_extension: invalid params") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ else
+ {
+ sint_t filePathSize = (sint_t)strlen(filePath) ;
+ sint_t posInFilePath = filePathSize-1 ;
+ if(('/' != filePath[posInFilePath]) && ('.' != filePath[posInFilePath]))
+ {
+ while((posInFilePath >= 0) && bEverythingOK && (! bExtensionFound))
+ {
+ if(('/' == filePath[posInFilePath]) || ('.' == filePath[posInFilePath]))
+ {
+ if('.' == filePath[posInFilePath])
+ {
+ if((filePathSize - (posInFilePath+1)) < size)
+ {
+ (void)strcpy(fileExtension_out, filePath+posInFilePath+1) ;
+ bExtensionFound = true ;
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_file_extension: size too large (%d, available %d)", (filePathSize - (posInFilePath+1)), size) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_file_extension: no extension found") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ }
+ posInFilePath-- ;
+ }
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_file_extension: filePath ends with '%c'", filePath[posInFilePath]) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ }
+
+
+ return (bEverythingOK ? 0 : PAS_FAILURE) ;
+}
+
+
+/*
+* filePath can be absolute or relative
+* it is not checked if the file indicated by filePath actually exist
+* returns the part of filePath before (and including) the last '/'
+*/
+sint_t persadmin_get_folder_path(pstr_t filePath, pstr_t folderPath_out, sint_t size)
+{
+ bool_t bEverythingOK = true ;
+ bool_t bFolderPathFound = false ;
+
+ if( (NIL == filePath) || (NIL == folderPath_out))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_folder_path: invalid params") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ else
+ {
+ sint_t filePathSize = (sint_t)strlen(filePath) ;
+ sint_t posInFilePath = filePathSize-1 ;
+ if('/' != filePath[posInFilePath])
+ {
+ while((posInFilePath >= 0) && bEverythingOK && (! bFolderPathFound))
+ {
+ if('/' == filePath[posInFilePath])
+ {
+ if((filePathSize - (posInFilePath+1)) < size)
+ {
+ (void)strncpy(folderPath_out, filePath, (uint_t)posInFilePath) ;
+ folderPath_out[posInFilePath] = '\0' ;
+ bFolderPathFound = true ;
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_folder_path: size too large (%d, available %d)", posInFilePath+1, size) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ }
+ posInFilePath-- ;
+ }
+ if(posInFilePath < 0)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_folder_path: <%s> is not a valid path", filePath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_get_filename: filePath ends with '/'") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ }
+
+ return (bEverythingOK ? 0 : PAS_FAILURE) ;
+}
+
+/*
+* check if file/folder indicated by pathname exist
+* if (bIsFolder==true) it is checked the existence of the folder, otherway the existence of the file
+* returns 0 if the file/folder exist, a negative value other way
+*/
+sint_t persadmin_check_if_file_exists(pstr_t pathname, bool_t bIsFolder)
+{
+ bool_t bEverythingOK = true ;
+ if(NIL == pathname)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_check_if_file_exist: NIL pathname") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ if('/' != pathname[0])
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_check_if_file_exist: not an absolute path(%s)", pathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ struct stat sb;
+
+ if (0 == lstat(pathname, &sb))
+ {
+ /* pathname exist*/
+ if(bIsFolder)
+ {
+ /* check if it is a foler */
+ if( ! S_ISDIR(sb.st_mode))
+ {
+ /* not a folder */
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ /* check if it is a file */
+ if(S_ISDIR(sb.st_mode))
+ {
+ /* it is a folder */
+ bEverythingOK = false ;
+ }
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ return bEverythingOK ? 0 : PAS_FAILURE ;
+}
+
+/*
+* create a link in the path indicated by pathLink which points to path indeicated by pathTarget
+* there is no check if pathTarget actually exist (or is valid)
+* the intermediate folders in pathLink are created if they do not exist
+* returns 0 in case of success, a negative value other way
+*/
+sint_t persadmin_create_symbolic_link(pstr_t pathLink, pstr_t pathTarget)
+{
+ bool_t bEverythingOK = true ;
+
+ if((NIL == pathLink) || (NIL == pathTarget))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_create_symbolic_link: NIL pathLink or pathTarget ") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ /* check if paths are absolute */
+ if(('/' != pathLink[0]) || ('/' != pathTarget[0]))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_create_symbolic_link: not absolute paths (<%s>, <%s>) ", pathLink, pathTarget) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ /* create the intermediary folders in pathLink */
+ str_t folderPathLink[PERSADMIN_MAX_PATH_LENGHT] ;
+
+ if(0 == persadmin_get_folder_path(pathLink, folderPathLink, sizeof(folderPathLink)))
+ {
+ if(0 != persadmin_create_folder(folderPathLink))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_create_symbolic_link: persadmin_create_folder(<%s>) failed ", folderPathLink) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_create_symbolic_link: persadmin_get_folder_path(<%s>) failed ", pathLink) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ if(0 != symlink(pathTarget, pathLink))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_create_symbolic_link: symlink(<%s>, <%s>) errno=<%s> ", pathTarget, pathLink, strerror(errno)) ; /*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ return bEverythingOK ? 0 : PAS_FAILURE ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+static sint_t persadmin_copy_subfolders(pstr_t absPathSource, sint_t posInSourcePath, pstr_t absPathDestination, sint_t posInDestPath, sint_t nestingCounter, PersadminFilterMode_e eFilter, bool_t bRecursive)
+{
+ bool_t bEverythingOK = true ;
+ DIR *dp;
+ struct dirent *ep;
+ sint_t bytesCopied = 0 ;
+
+ if((++nestingCounter) < PERSADMIN_MAX_NESTING_DEPTH)
+ {
+ if(absPathSource[posInSourcePath-1] != '/')
+ {
+ absPathSource[posInSourcePath] = '/' ;
+ posInSourcePath++ ;
+ absPathSource[posInSourcePath] = '\0' ;
+ }
+
+ if(absPathDestination[posInDestPath-1] != '/')
+ {
+ absPathDestination[posInDestPath] = '/' ;
+ posInDestPath++ ;
+ absPathDestination[posInDestPath] = '\0' ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_subfolders(<<%s>>, <<%s>>) too much nesting !!! ", absPathSource, absPathDestination) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ dp = opendir (absPathSource);
+ if(NIL == dp)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_subfolders: opendir(%s) errno=<%s>", absPathSource, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if (bEverythingOK)
+ {
+ ep = readdir (dp);
+ while ((ep != NIL) && (bEverythingOK))
+ {
+ int cmp = strcmp(ep->d_name, "..");
+ if( (0 != strcmp(ep->d_name, ".")) && (0 != cmp))
+ {
+ sint_t err ;
+ struct stat sb;
+ sint_t len = (sint_t)strlen(ep->d_name) ;
+
+ if((posInSourcePath + len > PERSADMIN_MAX_PATH_LENGHT) || (posInDestPath + len > PERSADMIN_MAX_PATH_LENGHT))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_subfolders: path too long(%s%s)", absPathSource, ep->d_name) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ break ;
+ }
+ else
+ {
+ (void)strcpy(absPathSource+posInSourcePath, ep->d_name) ;
+ (void)strcpy(absPathDestination+posInDestPath, ep->d_name) ;
+ }
+
+ err = lstat(absPathSource, &sb) ;
+ if(err >= 0)
+ {
+ bool_t bFilterPassed = persadmin_check_dir_entry_against_filter(&sb, eFilter) ;
+ if(S_ISDIR(sb.st_mode))
+ {
+ if(bFilterPassed)
+ {
+ if(0 != persadmin_create_folder(absPathDestination))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_subfolders: persadmin_copy_subfolders(%s, %s) failed", absPathSource, absPathDestination) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ break ;
+ }
+ }
+ if(bRecursive)
+ {
+ sint_t bytesCopiedLocal = persadmin_copy_subfolders(absPathSource, posInSourcePath+len, absPathDestination, posInDestPath+len, nestingCounter, eFilter, bRecursive) ;
+ if(bytesCopiedLocal >= 0)
+ {
+ bytesCopied += bytesCopiedLocal ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_subfolders: persadmin_copy_subfolders(%s, %s) failed", absPathSource, absPathDestination) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+ else
+ {
+ if(bFilterPassed)
+ {
+ sint_t bytesCopiedLocal = persadmin_copy_file(absPathSource, absPathDestination) ;
+ if(bytesCopiedLocal >= 0)
+ {
+ bytesCopied += bytesCopiedLocal ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_subfolders: persadmin_copy_file(%s, %s) failed", absPathSource, absPathDestination) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+ }
+ }
+ ep = readdir (dp);
+ }
+ (void)closedir (dp);
+ }
+
+ return (bEverythingOK ? bytesCopied : PAS_FAILURE) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*//*DG C8ISQP-ISQP Metric 7-SSW_Administrator_0004*/
+
+
+/**
+ * \brief copy the folder indicated by absPathSource into the folder indicated by absPathDestination
+ * \usage : persadmin_copy_folder("/Data/mnt-c/App-1/", "/var/Pers/bkup/App_1_bkup/")
+ * : copy the content of /Data/mnt-c/App-1/ into /var/Pers/bkup/App_1_bkup/
+ *
+ * \param absPathSource [in] absolute path of source folder
+ * \param absPathDestination [in] absolute path of destination folder
+ * \return number of bytes copied, negative value for error
+ * TODO: define error codes
+ */
+sint_t persadmin_copy_folder(pstr_t absPathSource, pstr_t absPathDestination, PersadminFilterMode_e eFilter, bool_t bRecursive)
+{
+ bool_t bEverythingOK = true ;
+ str_t sourcePath[PERSADMIN_MAX_PATH_LENGHT+1] ;
+ str_t destPath[PERSADMIN_MAX_PATH_LENGHT+1] ;
+ sint_t bytesCopied = 0 ;
+
+ if( (NIL != absPathSource) && (NIL != absPathDestination))
+ {
+ if((absPathSource[0] != '/') || (absPathDestination[0]!= '/'))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_folder: invalid params <<%s>> , <<%s>>", absPathSource, absPathDestination) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_folder: invalid params") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ sint_t lenghtSourcePath = (sint_t)strlen(absPathSource) ;
+ sint_t lenghtDestPath = (sint_t)strlen(absPathDestination) ;
+ if((lenghtSourcePath < PERSADMIN_MAX_PATH_LENGHT) && (lenghtDestPath < PERSADMIN_MAX_PATH_LENGHT))
+ {
+ if(0 == persadmin_create_folder(absPathDestination))
+ {
+ (void)strcpy(sourcePath, absPathSource) ;
+ (void)strcpy(destPath, absPathDestination) ;
+ bytesCopied = persadmin_copy_subfolders(sourcePath, lenghtSourcePath, destPath, lenghtDestPath, 0, eFilter, bRecursive) ;
+ if(bytesCopied < 0)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_folder: persadmin_copy_subfolders(<%s>, <%s>) failed", absPathSource, absPathDestination) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_folder: persadmin_create_folder(%s) failed", absPathDestination) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_folder: too long paths") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ return (bEverythingOK ? bytesCopied : PAS_FAILURE) ;
+}/*DG C8ISQP-ISQP Metric 7-SSW_Administrator_0004*//*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/**
+ * \brief create a folder as indicated by absPath
+ * \usage : persadmin_create_folder("/var/Pers/bkup/App_1_bkup/")
+ * \note : all the missing folders in the path are created (i.e. /var/Pers/, /var/Pers/bkup/)
+ *
+ * \param absPath [in] absolute path to folder to be created
+ * \return 0 for success, negative value otherwise;
+ * TODO: define error codes
+ */
+sint_t persadmin_create_folder(pstr_t absPath)
+{
+ bool_t bEverythingOK = true ;
+ const mode_t mode = S_IRWXU|S_IRWXG|S_IRWXO ;
+ char opath[PERSADMIN_MAX_PATH_LENGHT+1];
+ pstr_t p;
+ size_t len;
+
+ if(NIL == absPath)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_create_folder: NIL path") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ if('/' == *absPath)
+ {
+
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_create_folder: not an absolute path (%s)!!!", absPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ len = strlen(absPath) ;
+ if(len >= sizeof(opath))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_create_folder: path too long (%s)", absPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ (void)strcpy(opath, absPath); /* the lenght is check above */
+ if(opath[len - 1] == '/')
+ {
+ opath[len - 1] = '\0';
+ }
+
+ /* create intermediate folders (if not alreade created) */
+ for(p = opath+1; *p; p++)
+ {
+ if(*p == '/')
+ {
+ *p = '\0';
+ if(access(opath, F_OK))
+ {
+ sint_t err = mkdir(opath, mode);
+ if((err < 0) && (err != EEXIST ))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_create_folder: mkdir(%s) errcode = <%s>", opath, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ break ;
+ }
+ }
+ *p = '/';
+ }
+ }
+
+ /* create the actual folder (if not already created) */
+ if(access(opath, F_OK)) /* if path is not terminated with '/' */
+ {
+ sint_t err = mkdir(opath, mode);
+ if((err < 0) && (err != EEXIST ))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_create_folder: mkdir(%s) errcode = <%s>", opath, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+ return (bEverythingOK ? 0 : PAS_FAILURE) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static sint_t persadmin_delete_subfolders(pstr_t folderPath, sint_t posInFolderPath, sint_t nestingLevel)
+{
+ bool_t bEverythingOK = true ;
+ DIR *dp;
+ struct dirent *ep;
+ sint_t lLenBytes;
+ sint_t lBytesDeleted = 0;
+
+ if((nestingLevel++) < PERSADMIN_MAX_NESTING_DEPTH)
+ {
+ if(folderPath[posInFolderPath-1] != '/')
+ {
+ folderPath[posInFolderPath] = '/' ;
+ posInFolderPath += 1 ;
+ folderPath[posInFolderPath] = '\0' ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_delete_subfolders(%s) too deep hierarchy", folderPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ dp = opendir(folderPath);
+ if (NIL == dp)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_delete_subfolders: opendir(%s) errno=<%s>", folderPath, strerror(errno));/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ ep = readdir (dp);
+ while ((ep != NIL) && (bEverythingOK))
+ {
+ int cmp = strcmp(ep->d_name, "..");//for QAC
+ if( (0 != strcmp(ep->d_name, ".")) && (0 != cmp))
+ {
+ sint_t err ;
+ struct stat sb;
+ sint_t len = (sint_t)strlen(ep->d_name) ;
+
+ if(posInFolderPath + len < PERSADMIN_MAX_PATH_LENGHT)
+ {
+ (void)strcpy(folderPath+posInFolderPath, ep->d_name) ;
+
+ err = lstat(folderPath, &sb) ;
+ if(err >= 0)
+ {
+ if(S_ISDIR(sb.st_mode))
+ {
+ lLenBytes = persadmin_delete_subfolders(folderPath, posInFolderPath+len, nestingLevel);
+ if(0 <= lLenBytes)
+ {
+ lBytesDeleted += lLenBytes;
+ folderPath[posInFolderPath+len] = '\0' ;
+ if(0 != remove(folderPath))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_delete_subfolders: remove(%s) errno=<%s>", folderPath, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ /* (void)snprintf(g_msg, sizeof(g_msg), "deleted >>%s<<", folderPath) ; */
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_delete_subfolders: persadmin_delete_subfolders(%s) failed", folderPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ if( (S_ISREG(sb.st_mode)) || (S_ISLNK(sb.st_mode)) )
+ {
+ lLenBytes = sb.st_size;
+ if(0 != remove(folderPath))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_delete_subfolders: remove(%s) errno=<%s>", folderPath, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ lBytesDeleted += lLenBytes;
+ /* (void)snprintf(g_msg, sizeof(g_msg), "deleted >>%s<<", folderPath) ; */
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_delete_subfolders: unexpected mode for <%s> st_mode=0x%X", folderPath, sb.st_mode) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_delete_subfolders: path too long (%s)", folderPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ ep = readdir (dp);
+ }
+ (void)closedir (dp);
+ }
+
+ return (bEverythingOK ? lBytesDeleted : PAS_FAILURE) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+/**
+ * \brief delete a folder
+ * \usage : persadmin_delete_folder("/var/Pers/bkup/App_1_bkup/")
+ *
+ * \param absPath [in] absolute path to folder to be deleted
+ * \return positive value: number of bytes deleted; negative value: error
+ * TODO: define error codes
+ */
+sint_t persadmin_delete_folder(pstr_t absPath)
+{
+ bool_t bEverythingOK = true ;
+ str_t absFolderPath[PERSADMIN_MAX_PATH_LENGHT+1] ;
+ sint_t lBytesDeleted = 0;
+
+ if(NIL == absPath)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_delete_folder: invalid params") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ sint_t len = (sint_t)strlen(absPath) ;
+ if(len < PERSADMIN_MAX_PATH_LENGHT)
+ {
+ (void)strcpy(absFolderPath, absPath) ;
+ lBytesDeleted = persadmin_delete_subfolders(absFolderPath, len, 0);
+ if(0 <= lBytesDeleted)
+ {
+ if(0 == remove(absPath))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "deleted >>%s<<", absPath) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_delete_folder: remove(%s) errno=<%s>", absPath, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_delete_folder: persadmin_delete_subfolders(%s) failed", absPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ lBytesDeleted = 0;
+ }
+ }
+ }
+
+ return (bEverythingOK ? lBytesDeleted : PAS_FAILURE) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/**
+ * \brief copy a file (with posibility to rename the copy)
+ * \usage : persadmin_copy_file("/Data/mnt-c/shared/public/cached.itz", "/var/Pers/bkup/CACHED.itz")
+ * : content of /Data/mnt-c/shared/public/cached.itz is copied into /var/Pers/bkup/CACHED.itz
+ *
+ * \param absPathSource [in] absolute path to the source file
+ * \param absPathDestination [in] absolute path to the destination file
+ * \return number of bytes copied, negative value for error
+ * TODO: define error codes
+ */
+sint_t persadmin_copy_file(pstr_t absPathSource, pstr_t absPathDestination)
+{
+ bool_t bEverythingOK = true ;
+ FILE *fileSource = NIL ;
+ FILE *fileDest = NIL ;
+ str_t destFolderPath[256] ;
+ sint_t bytesCopied = 0 ;
+
+ if((NIL == absPathSource) || (NIL == absPathDestination))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_file: Invalid params ") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ fileSource = fopen(absPathSource, "r") ;
+ if(NIL == fileSource)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_file: fopen(%s, r) errno=<%s>", absPathSource, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ if(0 == persadmin_get_folder_path(absPathDestination, destFolderPath, sizeof(destFolderPath)))
+ {
+ if(0 != persadmin_create_folder(destFolderPath))
+ {
+ bEverythingOK = false;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_file: persadmin_create_folder(%s) failed", destFolderPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_file: persadmin_get_folder_path(%s) faield", destFolderPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ fileDest = fopen(absPathDestination, "w+") ;
+ if(NIL == fileDest)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_file: fopen(%s, w+) errno=<%s>", absPathDestination, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ str_t buffer[1024] ;
+ int readSize = 0 ;
+
+ do
+ {
+ readSize = (int)fread(buffer, 1, sizeof(buffer), fileSource) ;
+ if(readSize > 0)
+ {
+ if(readSize != (int)fwrite(buffer, 1, (size_t)readSize, fileDest))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_file: fwrite(%s) errno=<%s>", absPathDestination, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bytesCopied += readSize ;
+ }
+ }
+ else
+ {
+ if(0 == feof(fileSource))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_copy_file: fread(%s) errno=<%s>", absPathSource, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }while(bEverythingOK && (readSize > 0)) ;
+ }
+
+ if(fileSource)
+ {
+ (void)fclose(fileSource) ;
+ }
+
+ if(fileDest)
+ {
+ //fsync(fileDest) ;
+ (void)fclose(fileDest) ;
+ }
+
+ return (bEverythingOK ? bytesCopied : PAS_FAILURE) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+/**
+ * \brief delete a file
+ * \usage : persadmin_delete_file("/Data/mnt-c/shared/public/cached.itz")
+ *
+ * \param absPath [in] absolute path to the file to be deleted
+ * \return positive value: number of bytes deleted; negative value: error
+ * TODO: define error codes
+ */
+sint_t persadmin_delete_file(pstr_t absPath)
+{
+ bool_t bEverythingOK = true ;
+ struct stat sb;
+ sint_t lBytesDeleted = 0;
+
+ if ( 0 == lstat(absPath, &sb) )
+ {
+ lBytesDeleted = sb.st_size;
+ if ( 0 != remove(absPath) )
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "remove(%s) errno=<%s>", absPath, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ lBytesDeleted = 0;
+ }
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "remove(%s) errno=<%s>", absPath, strerror(errno)) ;/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false;
+ }
+
+ return (bEverythingOK ? lBytesDeleted : PAS_FAILURE) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/* if (0 == bufSize) then listing is not done, only the size needed to accomodate the listing is reported */
+static sint_t persadmin_list_subfolder(folder_path_s* psFolderPath, pstr_t buffer_out, sint_t bufSize, sint_t * posInBuffer, PersadminFilterMode_e eFilter, bool_t bRecursive, sint_t posInCompletePath, sint_t nestingLevel)
+{
+ bool_t bEverythingOK = true ;
+ DIR *dp;
+ struct dirent *ep;
+
+ if(nestingLevel++ > PERSADMIN_MAX_NESTING_DEPTH)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_subfolder(%s) too much nesting !!! ", psFolderPath->absPath + psFolderPath->startOfRelativePath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ if(psFolderPath->absPath[posInCompletePath-1] != '/')
+ {
+ psFolderPath->absPath[posInCompletePath] = '/' ;
+ posInCompletePath += 1 ;
+ psFolderPath->absPath[posInCompletePath] = '\0' ;
+ }
+ }
+
+
+ if(bEverythingOK)
+ {
+ dp = opendir(psFolderPath->absPath);
+ if(NIL == dp)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_subfolder: opendir(%s) errno=<%s>", psFolderPath->absPath, strerror(errno));/*DG C8ISQP-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ ep = readdir (dp);
+ while ((ep != NIL) && (bEverythingOK))
+ {
+ int cmp = strcmp(ep->d_name, "..");//for QAC
+ if( (0 != strcmp(ep->d_name, ".")) && (0 != cmp))
+ {
+ sint_t err ;
+ struct stat sb;
+ sint_t len = (sint_t)strlen(ep->d_name) ;
+ if(posInCompletePath + len < PERSADMIN_MAX_PATH_LENGHT)
+ {
+ (void)strcpy(psFolderPath->absPath + posInCompletePath, ep->d_name) ;
+ err = lstat(psFolderPath->absPath, &sb) ;
+ if(err >= 0)
+ {
+ bool_t bListFile = persadmin_check_dir_entry_against_filter(&sb, eFilter) ;
+
+ if(bListFile)
+ {
+ //printf("\n%s", psFolderPath->absPath + psFolderPath->startOfRelativePath);
+
+ /* list the files */
+ if(0 != bufSize)
+ {
+ /* other way, we are interested only about the size needed to accomodate the listing */
+
+ /* hardcoded value '1' is used below because paths are separated by '\0' */
+ if( ((posInCompletePath + len - psFolderPath->startOfRelativePath) + *posInBuffer) <= bufSize)
+ {
+ (void)strcpy((buffer_out + (*posInBuffer)), psFolderPath->absPath + psFolderPath->startOfRelativePath + 1) ;
+ *posInBuffer += (posInCompletePath + len - psFolderPath->startOfRelativePath) ;
+ }
+ else
+ {
+ bEverythingOK = false;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_subfolder: buffer too small (already reached %d, available %d)!!", (*posInBuffer + len + 1), bufSize) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ *posInBuffer += (posInCompletePath + len - psFolderPath->startOfRelativePath) ;
+ }
+ }
+
+ if(bEverythingOK && (bRecursive && S_ISDIR(sb.st_mode)))
+ {
+ if(0 == persadmin_list_subfolder(psFolderPath, buffer_out, bufSize, posInBuffer, eFilter, bRecursive, posInCompletePath+len, nestingLevel))
+ {
+ psFolderPath->absPath[posInCompletePath] = '\0' ;
+ }
+ else
+ {
+ bEverythingOK = false;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_subfolder: failed for (%s)", psFolderPath->absPath + psFolderPath->startOfRelativePath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ psFolderPath->absPath[posInCompletePath] = '\0' ;
+ }
+ }
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_subfolder: path too long (%s)", psFolderPath->absPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ ep = readdir (dp);
+ }
+ (void)closedir (dp);
+ }
+
+ return (bEverythingOK ? 0 : PAS_FAILURE) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*//*DG C8ISQP-ISQP Metric 7-SSW_Administrator_0004*/
+
+
+sint_t persadmin_list_folder_get_size(pconststr_t folderPath, PersadminFilterMode_e eListingMode, bool_t bRecursive)
+{
+ bool_t bEverythingOK = true ;
+ str_t rootPath[PERSADMIN_MAX_PATH_LENGHT+1] ;
+ str_t absPath[PERSADMIN_MAX_PATH_LENGHT+1] ;
+ str_t folderPathLocal[PERSADMIN_MAX_PATH_LENGHT+1] ;
+ sint_t listingSize = -1 ;
+
+ folder_path_s sFolderPath;
+
+ sFolderPath.rootPath = rootPath;
+ sFolderPath.absPath = absPath;
+ sFolderPath.startOfRelativePath = 0;
+
+ if(NIL == folderPath)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_folder_get_size: invalid params") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ if(folderPath[0] != '/')
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_folder_get_size: not an absolute path (%s)", folderPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ /* make sure path ends with '/' */
+ sint_t len = (sint_t)strlen(folderPath) ;
+ if(len < (PERSADMIN_MAX_PATH_LENGHT-1)) /* to allow adding of ending '/' */
+ {
+ (void)strcpy(folderPathLocal, folderPath) ;
+ if('/' != folderPathLocal[len-1])
+ {
+ (void)strcat(folderPathLocal, "/") ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_folder_get_size: path too long (%s)", folderPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sint_t len = (sint_t)strlen(folderPathLocal) ;
+ if(len < PERSADMIN_MAX_PATH_LENGHT)
+ {
+ sint_t posInBuffer = 0 ;
+
+ (void)strcpy(sFolderPath.rootPath, folderPathLocal) ;
+ (void)strcpy(sFolderPath.absPath, folderPathLocal) ;
+ sFolderPath.startOfRelativePath = len-1 ;
+
+ if(0 == persadmin_list_subfolder(&sFolderPath, NIL, 0, &posInBuffer, eListingMode, bRecursive, len-1, 0))
+ {
+ listingSize = posInBuffer ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_folder_get_size: persadmin_list_subfolder(%s) failed", sFolderPath.rootPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_folder_get_size: path too long (%s)", folderPathLocal) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ return (bEverythingOK ? listingSize : PAS_FAILURE) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+sint_t persadmin_list_folder(pconststr_t folderPath, pstr_t buffer_out, sint_t bufSize, PersadminFilterMode_e eFilter, bool_t bRecursive)
+{
+ bool_t bEverythingOK = true ;
+ str_t rootPath[PERSADMIN_MAX_PATH_LENGHT+1] ;
+ str_t absPath[PERSADMIN_MAX_PATH_LENGHT+1] ;
+ str_t folderPathLocal[PERSADMIN_MAX_PATH_LENGHT+1] ;
+ sint_t listingSize = -1 ;
+
+ folder_path_s sFolderPath;
+
+ sFolderPath.rootPath = rootPath;
+ sFolderPath.absPath = absPath;
+ sFolderPath.startOfRelativePath = 0;
+
+
+ if( (NIL == folderPath) || (NIL == buffer_out) || (bufSize < 1))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_folder: invalid params") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ if(folderPath[0] != '/')
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_folder: not an absolute path (%s)", folderPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ /* make sure path ends with '/' */
+ sint_t len = (sint_t)strlen(folderPath) ;
+ if(len < (PERSADMIN_MAX_PATH_LENGHT-1)) /* to allow adding of ending '/' */
+ {
+ (void)strcpy(folderPathLocal, folderPath) ;
+ if('/' != folderPathLocal[len-1])
+ {
+ (void)strcat(folderPathLocal, "/") ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_folder: path too long (%s)", folderPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sint_t len = (sint_t)strlen(folderPathLocal) ;
+ if(len < PERSADMIN_MAX_PATH_LENGHT)
+ {
+ sint_t posInBuffer = 0 ;
+
+ (void)strcpy(sFolderPath.rootPath, folderPathLocal) ;
+ (void)strcpy(sFolderPath.absPath, folderPathLocal) ;
+ sFolderPath.startOfRelativePath = len-1 ;
+
+ if(0 == persadmin_list_subfolder(&sFolderPath, buffer_out, bufSize, &posInBuffer, eFilter, bRecursive, len-1, 0))
+ {
+ listingSize = posInBuffer ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_folder: persadmin_list_subfolder(%s) failed", sFolderPath.rootPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_list_folder: path too long (%s)", folderPathLocal) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ return (bEverythingOK ? listingSize : PAS_FAILURE) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+sint_t persadmin_get_folder_size( pconststr_t folderPath )
+{
+ sint_t iFolderSize = 0 ;
+ bool_t bEverythingOK = true ;
+ str_t completePathFilename[PERSADMIN_MAX_PATH_LENGHT+1] ;
+ pstr_t pFilesList = NIL ;
+ sint_t iSizeOfFilesList = 0 ;
+
+ /* check param */
+ if(NIL == folderPath)
+ {
+ iFolderSize = PAS_FAILURE_INVALID_PARAMETER ;
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s: invalid params", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ /* check that folder path is valid */
+ if(0 > persadmin_check_if_file_exists((pstr_t)folderPath, true))
+ {
+ iFolderSize = PAS_FAILURE_INVALID_PARAMETER ;
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s: Folder <<%s>> not found", __FUNCTION__, folderPath) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ /* get the size of the buffer needed to accommodate the list with all the files in the folder (recursive)
+ * the list contains the (relative path + filename) for each file */
+ iSizeOfFilesList = persadmin_list_folder_get_size(folderPath, PersadminFilterFilesRegular, true) ;
+ if(iSizeOfFilesList > 0)
+ {
+ /* allocate the buffer where the list will be created */
+ pFilesList = (pstr_t)malloc(iSizeOfFilesList);
+ if(NIL == pFilesList)
+ {
+ bEverythingOK = false ;
+ iFolderSize = PAS_FAILURE_OUT_OF_MEMORY ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s: malloc(%d) failed", __FUNCTION__, iSizeOfFilesList) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ if(iSizeOfFilesList < 0)
+ {
+ bEverythingOK = false ;
+ iFolderSize = iSizeOfFilesList ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s: persadmin_list_folder_get_size(%s) failed err=(%X)", __FUNCTION__, folderPath, iFolderSize) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ /* for iSizeOfFilesList==0, nothing to do;
+ * iFolderSize = 0 will be returned */
+ }
+ }
+
+ if(bEverythingOK && (iSizeOfFilesList > 0))
+ {
+ /* we have the buffer needed to accommodate the list with all the files in the folder (recursive)
+ * now fill the buffer with the list contains the (relative path + filename) for each file */
+ sint_t iSizeTemp = persadmin_list_folder(folderPath, pFilesList, iSizeOfFilesList, PersadminFilterFilesRegular, true) ;
+ if(iSizeTemp != iSizeOfFilesList)
+ {
+ bEverythingOK = false ;
+ iFolderSize = (iSizeTemp < 0) ? iSizeTemp : PAS_FAILURE ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s: persadmin_list_folder(%s) returned=(%d) - expected (%d)", __FUNCTION__, folderPath, iSizeTemp, iSizeOfFilesList) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK && (iSizeOfFilesList > 0))
+ {
+ /* pFilesList contains the relative paths of all the files
+ * for each file:
+ * - build the complete(absolute) path
+ * - get size and add it to cumulative size
+ */
+ sint_t iPosInList = 0 ;
+ sint_t iOffsetRelativePath ;
+
+ (void)strncpy(completePathFilename, folderPath, sizeof(completePathFilename)-1);
+ iOffsetRelativePath = strlen(completePathFilename) ;
+ if('/' != completePathFilename[iOffsetRelativePath-1])
+ {
+ completePathFilename[iOffsetRelativePath] = '/' ;
+ iOffsetRelativePath++ ;
+ }
+
+ while(bEverythingOK && (iPosInList < iSizeOfFilesList))
+ {
+ pstr_t pCurrentRelativePathFilename = pFilesList + iPosInList ;
+ sint_t iSizeOfCurrentRelativePathFilename = strlen(pCurrentRelativePathFilename) ;
+ sint_t iSizeOfCurrentFile ;
+
+ (void)strncpy(&completePathFilename[iOffsetRelativePath], pCurrentRelativePathFilename, (sizeof(completePathFilename) - iOffsetRelativePath)) ;
+ iSizeOfCurrentFile = persadmin_priv_get_file_size(completePathFilename) ;
+ if(iSizeOfCurrentFile >= 0)
+ {
+ iFolderSize += iSizeOfCurrentFile ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ iFolderSize = PAS_FAILURE ;
+ break ;
+ }
+
+ iPosInList += (iSizeOfCurrentRelativePathFilename + 1) ; /* 1 <=> '\0' */
+ }
+ }
+
+ if(NIL != pFilesList)
+ {
+ free(pFilesList);
+ }
+
+ return iFolderSize ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+static sint_t persadmin_priv_get_file_size( pconststr_t absPathFileName )
+{
+ sint_t iFileSize = 0;
+
+ struct stat fileInfo;
+
+ if ( stat( absPathFileName, & fileInfo ) == 0 )
+ {
+ iFileSize = (sint_t)fileInfo.st_size;//TODO: see if uint_t is enough ->st_size is long
+ }
+ else
+ {
+ iFileSize = PAS_FAILURE ;
+ }
+
+ return iFileSize;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+bool_t persadmin_check_for_same_file_content(pstr_t file1Path, pstr_t file2Path)
+{
+ uint64_t file1Size = 0;
+ uint64_t file2Size = 0;
+ uint8_t *file1Buff = NULL;
+ uint8_t *file2Buff = NULL;
+ struct stat fileInfo;
+
+ int handleFile1 = -1; // invalid file handle
+ int handleFile2 = -1; // invalid file handle
+
+ if((NIL == file1Path) && (NIL == file2Path))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("Invalid parameters in persadmin_check_for_same_file_content call."));
+ return false;
+ }
+
+ /* check if the files have the same sizes */
+ (void)memset(&fileInfo, 0, sizeof(fileInfo));
+ if ( stat( file1Path, & fileInfo ) == 0 )
+ {
+ file1Size = (uint64_t)fileInfo.st_size;
+
+ (void)memset(&fileInfo, 0, sizeof(fileInfo));
+ if ( stat( file2Path, & fileInfo ) == 0 )
+ {
+ file2Size = (uint64_t)fileInfo.st_size;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("Failed getting file1 size in persadmin_check_for_same_file_content call."));
+ return false;
+ }
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("Failed getting file2 size in persadmin_check_for_same_file_content call."));
+ return false;
+ }
+
+ if(file1Size != file2Size)
+ {
+ return false;
+ }
+
+ /* check if the file content matches */
+ handleFile1 = open (file1Path, O_RDONLY);
+ if(handleFile1 < 0) // invalid file handle
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("Failed opening file "),
+ DLT_STRING(file1Path));
+ return false;
+ }
+ else
+ {
+ handleFile2 = open (file2Path, O_RDONLY);
+ if(handleFile2 < 0) // invalid file handle
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("Failed opening file "),
+ DLT_STRING(file2Path));
+ (void)close (handleFile1);
+ return false;
+ }
+ }
+
+ /* map file1 to memory */
+ file1Buff = mmap( NIL,
+ (size_t)file1Size,
+ PROT_READ,
+ MAP_PRIVATE,
+ handleFile1,
+ 0);
+
+ if(MAP_FAILED == file1Buff)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("Failed mapping file "),
+ DLT_STRING(file1Path));
+ (void)close (handleFile1);
+ (void)close (handleFile2);
+ return false;
+ }
+ else
+ {
+ /* map file2 to memory */
+ file2Buff = mmap( NIL,
+ (size_t)file2Size,
+ PROT_READ,
+ MAP_PRIVATE,
+ handleFile2,
+ 0);
+
+ if(MAP_FAILED == file2Buff)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("Failed mapping file "),
+ DLT_STRING(file2Path));
+ (void)munmap (file1Buff, (size_t)file1Size);
+ (void)close (handleFile1);
+ (void)close (handleFile2);
+ return false;
+ }
+ }
+
+ /* compare file contents in memory */
+ if(0 != memcmp(file1Buff, file2Buff, (size_t)file1Size))
+ {
+ (void)munmap (file1Buff, (size_t)file1Size);
+ (void)munmap (file2Buff, (size_t)file2Size);
+
+ (void)close (handleFile1);
+ (void)close (handleFile2);
+ return false;
+ }
+
+ (void)munmap (file1Buff, (size_t)file1Size);
+ (void)munmap (file2Buff, (size_t)file2Size);
+
+ (void)close (handleFile1);
+ (void)close (handleFile2);
+
+ return true;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
diff --git a/Administrator/src/ssw_pers_admin_pcl.c b/Administrator/src/ssw_pers_admin_pcl.c
new file mode 100644
index 0000000..9b1de19
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_pcl.c
@@ -0,0 +1,827 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of PCL communication gate for Persistence Administration Service
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.10.24 uidu0250 CSP_WZ#6327: Change error handling for missing PCL clients
+* 2013.10.02 uidu0250 CSP_WZ#5927: Update values for IPC request flags to match PCL v7
+* 2013.04.04 uidu0250 CSP_WZ#2739: Using PersCommonIPC for requests to PCL
+* 2013.02.18 uidu0250 CSP_WZ#8849: Block DBus client registration during Sync&Lock
+* 2013.02.05 uidu0250 CSP_WZ#2211: Fixed QAC deviations
+* 2013.02.05 uidu0250 CSP_WZ#2211: Perform rollback in case of lock&sync failed
+* 2012.11.28 uidu0250 CSP_WZ#1280: Added an additional param. to persadmin_ChangePersistenceMode to specify the need for request confirmations
+* 2012.11.13 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <gio/gio.h>
+#include <pthread.h>
+#include <dlt.h>
+
+#include "persComErrors.h"
+#include "persComIpc.h"
+#include "ssw_pers_admin_pcl.h"
+
+
+/* ---------- local defines, macros, constants and type definitions ------------ */
+
+//#define TEST_MODE_ENABLED
+
+#ifdef TEST_MODE_ENABLED
+#define REG_FLAG_SET 1
+#endif // TEST_MODE_ENABLED
+
+#define PAS_NOTIF_CONF_WAIT_STEP 5 // ms
+
+/* Override persComIpc.h flags to mach the PCL v.7 implementation */
+#define PERSISTENCE_MODE_LOCK_PCL (0x0001U) /* as defined by PCL */
+#define PERSISTENCE_MODE_UNLOCK_PCL (0x0002U) /* as defined by PCL */
+#define PERSISTENCE_MODE_SYNC_PCL (0x0010U) /* as defined by PCL */
+#define PERSISTENCE_PCL_RESPONSE_PENDING (0x0001U) /* as defined by PCL */
+#define PERSISTENCE_PCL_STATUS_OK (0x0002U) /* as defined by PCL */
+
+typedef struct PAS_NOTIF_CLIENT_INFO_
+{
+ sint32_t clientId;
+ uint32_t notificationFlag;
+ uint32_t timeoutMs;
+ bool_t bClientNotified;
+ bool_t bRequestConfirmed;
+ struct PAS_NOTIF_CLIENT_INFO_ * pNextClient;
+
+}PAS_NOTIF_CLIENT_INFO, *PPAS_NOTIF_CLIENT_INFO;
+
+
+/* ----------global variables. initialization of global contexts ------------ */
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+static PPAS_NOTIF_CLIENT_INFO pPersRegClients = NIL; /* list of clients registered for notifications */
+static pthread_mutex_t persRegClientsListMtx; /* mutex for the access to the list of registered clients */
+
+static volatile bool_t g_bBlockClientReg = false; /* flag indicating if the DBus client registration is blocked */
+static volatile bool_t g_bWaitForNotifConf = false; /* flag indicating there is a notification sent and confirmations are waited */
+static volatile int32_t g_s32RequestId = 0; /* used to identify requests */
+static uint32_t g_ReqAdminPersMode = 0; /* currently requested persistence admin mode */
+
+static uint32_t persistenceMode = 0; /* current state of the persistence from PAS p.o.v. */
+
+
+#ifdef TEST_MODE_ENABLED
+static pthread_t g_hThread = 0;
+static int notifThreadFlag;
+static pthread_cond_t notifThreadFlagCV;
+static pthread_mutex_t notifThreadFlagMtx;
+#endif // TEST_MODE_ENABLED
+
+
+/* ---------------------- local functions ---------------------------------- */
+
+/* Register callback */
+static int persIpcRegisterCB( int clientID,
+ unsigned int flags,
+ unsigned int timeout);
+
+/* Un-register callback */
+static int persIpcUnRegisterCB(int clientID,
+ unsigned int flags);
+
+/* PersAdminRequestCompleted callback */
+static int persIpcRequestCompletedCB( int clientID,
+ int requestID,
+ unsigned int status);
+
+/* Change persistence mode */
+static sint_t persadmin_ChangePersistenceMode( uint32_t u32PersMode, bool_t bWaitForConfirmation);
+
+/* Notify all PCL clients */
+static sint_t NotifyRegisteredClients( uint32_t u32PersMode );
+
+/* Wait for confirmations from all notified clients */
+static sint_t WaitForNotificationConfirmations(void);
+
+//static void ReleaseClientInfoList(PPAS_NOTIF_CLIENT_INFO * ppClientInfoList);
+
+#ifdef TEST_MODE_ENABLED
+static void* ClientNotificationThread(void *lpParam);
+#endif // TEST_MODE_ENABLED
+
+
+/**
+ * \brief Init the PAS IPC module
+ *
+ * \return 0 for success, negative value for error (see persComErrors.h)
+ */
+sint_t persadmin_InitIpc(void)
+{
+ sint_t retVal = PERS_COM_SUCCESS;
+ PersAdminPASInitInfo_s pInitInfo;
+
+ /* Init synchronization objects */
+ if(0 != pthread_mutex_init (&persRegClientsListMtx, NIL))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to initialize mutex."));
+ return PERS_COM_FAILURE;
+ }
+
+ #ifdef TEST_MODE_ENABLED
+ /* Create the notification thread*/
+ pthread_create(&g_hThread, NIL, ClientNotificationThread, NIL);
+ #endif // TEST_MODE_ENABLED
+
+ pInitInfo.pRegCB = persIpcRegisterCB;
+ pInitInfo.pUnRegCB = persIpcUnRegisterCB;
+ pInitInfo.pReqCompleteCB = persIpcRequestCompletedCB;
+
+ retVal = persIpcInitPAS(&pInitInfo);
+ if(PERS_COM_SUCCESS != retVal)
+ {
+ /* Error: the connection could not be established. */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to establish IPC protocol for PAS with error code"),
+ DLT_INT(retVal));
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Successfully established IPC protocol for PAS."));
+ }
+
+ #ifdef TEST_MODE_ENABLED
+ /* Wait the client notification thread */
+ //pthread_join(g_hThread, NIL);
+ #endif // TEST_MODE_ENABLED
+
+ return retVal;
+}
+
+
+/**
+ * \brief PCL client registration callback
+ *
+ * \param clientID [in] unique identifier assigned to the registered client
+ * \param flags [in] flags specifying the notifications to register for (bitfield using any of the flags : ::PERSISTENCE_MODE_LOCK, ::PERSISTENCE_MODE_SYNC and ::PERSISTENCE_MODE_UNLOCK)
+ * \param timeout [in] maximum time needed to process any supported request (in milliseconds)
+ *
+ * \return 0 for success, negative value for error (see \ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+static int persIpcRegisterCB( int clientID,
+ unsigned int flags,
+ unsigned int timeout)
+{
+ sint_t retVal = PERS_COM_SUCCESS;
+ PPAS_NOTIF_CLIENT_INFO pClientInfo = NIL;
+ PPAS_NOTIF_CLIENT_INFO pNewClientInfo = NIL;
+
+ if(true == g_bBlockClientReg)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Client registration failed for client with ID :"),
+ DLT_INT(clientID));
+ return PERS_COM_FAILURE;
+ }
+
+ /* Acquire mutex on the list of registered clients */
+ if(0 != pthread_mutex_lock (&persRegClientsListMtx))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to lock mutex."));
+ return PERS_COM_FAILURE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Registering client with ID :"),
+ DLT_INT(clientID));
+
+ pClientInfo = pPersRegClients;
+
+ while((NIL != pClientInfo) && (NIL != pClientInfo->pNextClient))
+ {
+ pClientInfo = pClientInfo->pNextClient;
+ }
+
+
+ pNewClientInfo = NIL;
+ pNewClientInfo = (PPAS_NOTIF_CLIENT_INFO)malloc(sizeof(*pNewClientInfo)); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pNewClientInfo)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Error allocating memory for client info data."));
+ (void)pthread_mutex_unlock (&persRegClientsListMtx);
+ return PERS_COM_ERR_MALLOC;
+ }
+ else
+ {
+ (void)memset(pNewClientInfo, 0, sizeof(*pNewClientInfo));
+ }
+
+
+ if(NIL == pPersRegClients)
+ {
+ pPersRegClients = pNewClientInfo;
+ }
+ else
+ {
+ pClientInfo->pNextClient = pNewClientInfo;
+ }
+
+ pNewClientInfo->clientId = clientID;
+
+ /* each registered application is notified according to the registration mask */
+ pNewClientInfo->notificationFlag = flags;
+
+ /* each application will register using a specified timeout (associated to the max duration of the requested operation) */
+ pNewClientInfo->timeoutMs = timeout;
+
+ pNewClientInfo->bClientNotified = false;
+ pNewClientInfo->bRequestConfirmed = false;
+
+ /* Release list mutex */
+ (void)pthread_mutex_unlock (&persRegClientsListMtx);
+
+ #ifdef TEST_MODE_ENABLED
+ /* Notify the client notification thread */
+ pthread_mutex_lock (&notifThreadFlagMtx);
+ notifThreadFlag = REG_FLAG_SET;
+ pthread_cond_signal (&notifThreadFlagCV);
+ pthread_mutex_unlock (&notifThreadFlagMtx);
+ #endif // TEST_MODE_ENABLED
+
+ return retVal;
+}
+
+
+/**
+ * \brief PCL client un-registration callback
+ *
+ * \param clientID [in] unique identifier assigned to the registered client
+ * \param flags [in] flags specifying the notifications to un-register from (bitfield using any of the flags : ::PERSISTENCE_MODE_LOCK, ::PERSISTENCE_MODE_SYNC and ::PERSISTENCE_MODE_UNLOCK)
+ *
+ * \return 0 for success, negative value for error (see \ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+static int persIpcUnRegisterCB(int clientID,
+ unsigned int flags)
+{
+ sint_t retVal = PERS_COM_SUCCESS;
+ PPAS_NOTIF_CLIENT_INFO pClientInfo = NIL;
+ PPAS_NOTIF_CLIENT_INFO pPrevClientInfo = NIL;
+
+ // Acquire mutex on list
+ if(0 != pthread_mutex_lock (&persRegClientsListMtx))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to lock mutex."));
+ return PERS_COM_FAILURE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Un-registering client with ID :"),
+ DLT_INT(clientID));
+
+ pClientInfo = pPersRegClients;
+
+ while(NIL != pClientInfo)
+ {
+ if(clientID == pClientInfo->clientId)
+ {
+ break;
+ }
+
+ pPrevClientInfo = pClientInfo;
+ pClientInfo = pClientInfo->pNextClient;
+ }
+
+ if(NIL != pClientInfo)
+ {
+ /* remove specified client info */
+ if(NIL == pPrevClientInfo)
+ {
+ pPersRegClients = NIL;
+ }
+ else
+ {
+ pPrevClientInfo->pNextClient = pClientInfo->pNextClient;
+ }
+
+ free(pClientInfo);/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+
+ /* Release list mutex */
+ (void)pthread_mutex_unlock (&persRegClientsListMtx);
+
+ return retVal;
+}
+
+
+/**
+ * \brief PCL request confirmation callback
+ *
+ * \param clientID [in] unique identifier assigned to the registered client
+ * \param requestID [in] unique identifier of the request sent by PAS. Should have the same value
+ * as the parameter requestID specified by PAS when calling
+ \ref persIpcSendRequestToPCL
+ * \param status [in] the status of the request processed by PCL
+ * - In case of success: bitfield using any of the flags, depending on the request : ::PERSISTENCE_STATUS_LOCKED.
+ * - In case of error: the sum of ::PERSISTENCE_STATUS_ERROR and an error code \ref PERS_COM_IPC_DEFINES_ERROR is returned.
+ *
+ * \return 0 for success, negative value for error (see \ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+static int persIpcRequestCompletedCB( int clientID,
+ int requestID,
+ unsigned int status)
+{
+ sint_t retVal = PERS_COM_SUCCESS;
+ bool_t bFailed = false;
+ PPAS_NOTIF_CLIENT_INFO pClientInfo = NIL;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("PersistenceAdminRequestCompleted called by client with ID :"),
+ DLT_INT(clientID));
+
+ /* Check if the requestId is still valid */
+ if(requestID != g_s32RequestId)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING("PersistenceAdminRequestCompleted ignored notification with different RequestId."));
+
+ /* ignore notification */
+ return PERS_COM_ERR_INVALID_PARAM;
+ }
+
+
+ /* Acquire mutex on the list of registered clients */
+ if(0 != pthread_mutex_lock (&persRegClientsListMtx))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to lock mutex."));
+ return PERS_COM_FAILURE;
+ }
+
+ /* Check if the sender is in the current list of notified clients */
+ pClientInfo = pPersRegClients;
+
+ while(NIL != pClientInfo)
+ {
+ if(clientID == pClientInfo->clientId)
+ {
+ break;
+ }
+
+ pClientInfo = pClientInfo->pNextClient;
+ }
+
+ if(NIL == pClientInfo)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Invalid client confirmed the request. ID :"),
+ DLT_INT(pClientInfo->clientId));
+ (void)pthread_mutex_unlock (&persRegClientsListMtx);
+ return PERS_COM_FAILURE;
+ }
+
+ /* Check if this client should confirm the persistence mode change (by the registered notification mask) */
+ if(0 == ((pClientInfo->notificationFlag) & g_ReqAdminPersMode))
+ {
+ /* Ignore client if a different state than the one specified by his mask was confirmed */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Invalid client confirmed the request. ID :"),
+ DLT_INT(clientID));
+ }else
+ {
+ if(PERSISTENCE_STATUS_ERROR == (PERSISTENCE_STATUS_ERROR & status))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("PersAdminRequestCompleted called by client with ID :"),
+ DLT_INT(pClientInfo->clientId),
+ DLT_STRING("reported the error code:"),
+ DLT_UINT8((uint8_t)status));
+ /* Stop waiting for notification confirmations */
+ /* Mark the failed notification */
+ /* The persAdminMode should be switched back to the previous value */
+ /* Stop the thread checking the list of notified clients */
+ g_bWaitForNotifConf = false;
+
+ (void)pthread_mutex_unlock (&persRegClientsListMtx);
+ return PERS_COM_FAILURE;
+ }
+ else
+ {
+ /* Check if the client status reflects the performed request */
+
+ bFailed = false;
+
+ /* Check request-status associations */
+
+ if((PERSISTENCE_MODE_LOCK_PCL == (PERSISTENCE_MODE_LOCK_PCL & g_ReqAdminPersMode)) &&
+ (PERSISTENCE_MODE_LOCK_PCL == (PERSISTENCE_MODE_LOCK_PCL & pClientInfo->notificationFlag)) &&
+ (PERSISTENCE_STATUS_LOCKED != (PERSISTENCE_STATUS_LOCKED & status)))
+ {
+ bFailed = true;
+ }
+
+ /* additional checks should be added here if new persistence mode values/status values are added */
+
+ if(true == bFailed)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("PersAdminRequestCompleted called by client with ID :"),
+ DLT_INT(pClientInfo->clientId),
+ DLT_STRING("reported an invalid status."));
+
+ /* Stop waiting for notification confirmations */
+ /* Mark the failed notification */
+ /* The persAdminMode should be switched back to the previous value */
+ /* Stop the thread checking the list of notified clients */
+ g_bWaitForNotifConf = false;
+
+ (void)pthread_mutex_unlock (&persRegClientsListMtx);
+ return PERS_COM_FAILURE;
+
+ }
+ else
+ {
+ pClientInfo->bRequestConfirmed = true;
+ }
+ }
+ }
+
+ /* Release mutex on the list of clients notified */
+ (void)pthread_mutex_unlock (&persRegClientsListMtx);
+
+ return retVal;
+}
+
+
+/**
+ * \brief Change persistence mode
+ *
+ * \param u32PersMode [in] flags specifying the new persistence mode (bitfield using any of the flags : ::PERSISTENCE_MODE_LOCK, ::PERSISTENCE_MODE_SYNC and ::PERSISTENCE_MODE_UNLOCK)
+ * \param bWaitForConfirmation [in] if true the call will return after waiting for confirmations from all the notified clients, if false it will return after notifying
+ *
+ * \return 0 for success, negative value for error (see \ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+static sint_t persadmin_ChangePersistenceMode(uint32_t u32PersMode, bool_t bWaitForConfirmation)
+{
+ sint_t retVal = PERS_COM_SUCCESS;
+ uint32_t tmpReqAdminPersMode = g_ReqAdminPersMode;
+
+ g_ReqAdminPersMode = u32PersMode;
+
+ /* Notify the registered clients */
+ retVal = NotifyRegisteredClients(u32PersMode);
+ if(PERS_COM_SUCCESS != retVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed notifying registered clients with error code : "),
+ DLT_INT(retVal));
+ }
+
+ if((PERS_COM_SUCCESS == retVal) && (true == bWaitForConfirmation))
+ {
+ /* Wait for confirmations from the notified clients */
+ retVal = WaitForNotificationConfirmations();
+ if(PERS_COM_SUCCESS != retVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed waiting for notified clients with error code : "),
+ DLT_INT(retVal));
+ }
+ }
+
+ if(PERS_COM_SUCCESS != retVal)
+ {
+ g_ReqAdminPersMode = tmpReqAdminPersMode;
+ }
+
+ return retVal;
+}
+
+
+/**
+ * \brief Notify all clients registered for the u32PersMode change
+ *
+ * \param u32PersMode [in] flags specifying the new persistence mode (bitfield using any of the flags : ::PERSISTENCE_MODE_LOCK, ::PERSISTENCE_MODE_SYNC and ::PERSISTENCE_MODE_UNLOCK)
+ *
+ * \return 0 for success, negative value for error (see \ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+static sint_t NotifyRegisteredClients( uint32_t u32PersMode )
+{
+ sint_t retVal = PERS_COM_SUCCESS;
+ sint_t commRetVal = PERS_COM_SUCCESS;
+ PPAS_NOTIF_CLIENT_INFO pClientInfo = NIL;
+
+ /* Generate a new request id */
+ ++g_s32RequestId;
+
+
+ if(0 != pthread_mutex_lock (&persRegClientsListMtx))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to lock mutex."));
+ return PERS_COM_FAILURE;
+ }
+
+ /* Notify asynchronously every registered client */
+ pClientInfo = pPersRegClients;
+
+ while(NIL != pClientInfo)
+ {
+ pClientInfo->bClientNotified = false;
+ pClientInfo->bRequestConfirmed = false;
+
+ /* Skip client registered for other notifications */
+ if(0 != (((uint32_t)pClientInfo->notificationFlag) & u32PersMode))
+ {
+ /* Synchronous call to "PersistenceAdminRequest" */
+ commRetVal = persIpcSendRequestToPCL( pClientInfo->clientId,
+ g_s32RequestId,
+ u32PersMode);
+ if((PERS_COM_SUCCESS != commRetVal) &&
+ (PERSISTENCE_PCL_RESPONSE_PENDING != commRetVal) &&
+ (PERSISTENCE_PCL_STATUS_OK != commRetVal))
+ {
+ if(PERS_COM_IPC_ERR_PCL_NOT_AVAILABLE == commRetVal)
+ {
+ /* Considered that any missing client was notified and confirmed (to avoid triggering a timeout) */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING("Failed to notify client with ID :"),
+ DLT_INT(pClientInfo->clientId),
+ DLT_STRING(".Client not available."));
+ pClientInfo->bRequestConfirmed = true;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("PersistenceAdminRequest call failed for client with ID :"),
+ DLT_INT(pClientInfo->clientId),
+ DLT_STRING("Flags="),
+ DLT_INT(u32PersMode),
+ DLT_STRING("RequestId="),
+ DLT_INT(g_s32RequestId));
+ (void)pthread_mutex_unlock (&persRegClientsListMtx);
+ return commRetVal;
+ }
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING("Notified client with ID :"),
+ DLT_INT(pClientInfo->clientId),
+ DLT_STRING("Flags="),
+ DLT_INT(u32PersMode),
+ DLT_STRING("RequestId="),
+ DLT_INT(g_s32RequestId));
+ }
+
+ pClientInfo->bClientNotified = true;
+ }
+
+ pClientInfo = pClientInfo->pNextClient;
+ }
+
+ /* Release mutex on the list of clients notified */
+ (void)pthread_mutex_unlock (&persRegClientsListMtx);
+
+ return retVal;
+}
+
+
+/**
+ * \brief Wait for confirmations from all the notified clients
+ *
+ * \return 0 for success, negative value for error (see \ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+static sint_t WaitForNotificationConfirmations(void)
+{
+ sint_t retVal = PERS_COM_SUCCESS;
+ uint32_t currentTimeout = 0;
+ bool_t bAllClientsConfirmed= true;
+ PPAS_NOTIF_CLIENT_INFO pClientInfo = NIL;
+ bool_t bContinue = false;
+
+ struct timespec ts;
+
+
+ ts.tv_sec = 0;
+ ts.tv_nsec = (PAS_NOTIF_CONF_WAIT_STEP * 1000000); /* PAS_NOTIF_CONF_WAIT_STEP ms */
+
+
+ /* Wait for notification confirmations */
+ currentTimeout = 0;
+ g_bWaitForNotifConf = true;
+
+ while(true == g_bWaitForNotifConf)
+ {
+ /* Acquire mutex on the current list of registered clients */
+ if(0 != pthread_mutex_lock (&persRegClientsListMtx))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to lock mutex."));
+ return PERS_COM_FAILURE;
+ }
+
+ /* Check the status of every registered client notified */
+ bAllClientsConfirmed = true;
+ pClientInfo = pPersRegClients;
+ while(NIL != pClientInfo)
+ {
+ bContinue = false;
+
+ /* ignore clients not notified */
+ if(false == pClientInfo->bClientNotified)
+ {
+ pClientInfo = pClientInfo->pNextClient;
+ bContinue = true; // used instead of continue
+ }
+
+ /* skip clients that confirmed the request */
+ if(false == bContinue)
+ {
+ if(true == pClientInfo->bRequestConfirmed)
+ {
+ pClientInfo = pClientInfo->pNextClient;
+ bContinue = true; // used instead of continue
+ }
+ }
+
+ if(false == bContinue)
+ {
+ /* consider that the client did not manage to handle the notification if the timeout was exceeded */
+ if(currentTimeout > pClientInfo->timeoutMs)
+ {
+ g_bWaitForNotifConf = false;
+ }
+
+ bAllClientsConfirmed = false;
+ break;
+ }
+ }
+
+ if(false == g_bWaitForNotifConf)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Timeout when trying to notify client with ID :"),
+ DLT_INT(pClientInfo->clientId),
+ DLT_STRING(" and timeout = "),
+ DLT_UINT(pClientInfo->timeoutMs));
+ retVal = PERS_COM_FAILURE;
+ }
+
+ /* Release mutex on the list of clients notified */
+ (void)pthread_mutex_unlock (&persRegClientsListMtx);
+
+ if(true == bAllClientsConfirmed)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING("Notified all registered clients."));
+ break;
+ }
+
+ /* Wait only when not in timeout for any of the clients */
+ if(true == g_bWaitForNotifConf)
+ {
+ /* sleep */
+ (void)nanosleep(&ts, NIL);
+
+ currentTimeout += PAS_NOTIF_CONF_WAIT_STEP;
+ }
+ }
+
+ return retVal;
+}
+
+//static void ReleaseClientInfoList(PPAS_NOTIF_CLIENT_INFO * ppClientInfoList)
+//{
+// PPAS_NOTIF_CLIENT_INFO pClientInfo = NIL;
+// PPAS_NOTIF_CLIENT_INFO pClientInfoList = NIL;
+//
+// if((NIL != ppClientInfoList) && (NIL != *ppClientInfoList))
+// {
+// pClientInfoList = *ppClientInfoList;
+// pClientInfo = pClientInfoList;
+//
+// while(NIL != pClientInfo)
+// {
+// pClientInfoList = pClientInfo->pNextClient;
+// free(pClientInfo);/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+// pClientInfo = pClientInfoList;
+// }
+//
+// *ppClientInfoList = NIL;
+// }
+//}
+
+
+/* Client notification thread (test purposes only) */
+#ifdef TEST_MODE_ENABLED
+static void* ClientNotificationThread(void *lpParam)
+{
+ /* Wait for a DBus client registration */
+ pthread_mutex_lock (&notifThreadFlagMtx);
+ while (!notifThreadFlag)
+ {
+ pthread_cond_wait (&notifThreadFlagCV, &notifThreadFlagMtx);
+ }
+ pthread_mutex_unlock (&notifThreadFlagMtx);
+
+
+ /* TEST NOTIFY REGISTERED CLIENTS */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Notifying all registered clients of lock&sync persistence request."));
+ persadmin_SendLockAndSyncRequestToPCL();
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Notifying all registered clients of unlock persistence request."));
+ persadmin_SendUnlockRequestToPCL();
+
+ return NIL;
+}
+#endif // TEST_MODE_ENABLED
+
+
+/**
+ * \brief Checks if the memory access is currently locked
+ *
+ * \return true if memory access is locked, false otherwise
+ */
+bool_t persadmin_IsPCLAccessLocked(void)
+{
+ return (PERSISTENCE_MODE_LOCK_PCL == (PERSISTENCE_MODE_LOCK_PCL & persistenceMode)) ? true : false;
+}
+
+
+/**
+ * \brief Locks the memory access and synchronizes the cache for all clients registered to PAS.
+ *
+ * \return 0 for success, negative value for error (see \ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+sint_t persadmin_SendLockAndSyncRequestToPCL(void)
+{
+ sint_t retVal = PERS_COM_SUCCESS;
+
+ /* Check if access is already locked */
+ if( true == persadmin_IsPCLAccessLocked())
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("PCL access already locked."));
+
+ /* Access already locked, return error */
+ retVal = PERS_COM_ERR_ACCESS_DENIED;
+ }
+
+ /* Block DBus client registration */
+ g_bBlockClientReg = true;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING("DBus client registration blocked."));
+
+ persistenceMode = (PERSISTENCE_MODE_LOCK_PCL | PERSISTENCE_MODE_SYNC_PCL);
+
+ /* Sync & Lock */
+ retVal = persadmin_ChangePersistenceMode(persistenceMode, true);
+ if(PERS_COM_SUCCESS != retVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Sync & Lock request failed with error code : "),
+ DLT_INT(retVal));
+
+ /* Rollback - unlock access for all notified clients in case of failure */
+ persistenceMode = PERSISTENCE_MODE_UNLOCK_PCL;
+
+ (void)persadmin_ChangePersistenceMode(persistenceMode, false);
+
+ /* Unblock DBus client registration */
+ g_bBlockClientReg = false;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING("Client registration unblocked."));
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING("Sync & Lock performed."));
+ }
+
+ return retVal;
+}
+
+
+/**
+ * \brief Unlocks the memory access for all clients registered to PAS.
+ *
+ * \return 0 for success, negative value for error (see \ref PERS_COM_ERROR_CODES_DEFINES)
+ */
+sint_t persadmin_SendUnlockRequestToPCL(void)
+{
+ sint_t retVal = PERS_COM_SUCCESS;
+
+ /* Check if access is already unlocked */
+ if( false == persadmin_IsPCLAccessLocked())
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("PCL access already unlocked."));
+
+ /* Access already unlocked, return error */
+ retVal = PERS_COM_ERR_ACCESS_DENIED;
+ }
+
+ persistenceMode = PERSISTENCE_MODE_UNLOCK_PCL;
+
+ /* Unlock */
+ retVal = persadmin_ChangePersistenceMode(persistenceMode, false);
+ if(PERS_COM_SUCCESS != retVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Unlock request failed with error code : "),
+ DLT_INT(retVal));
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING("Unlock performed."));
+ }
+
+ /* Unblock client registration */
+ g_bBlockClientReg = false;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING("Client registration unblocked."));
+
+ return retVal;
+}
diff --git a/Administrator/src/ssw_pers_admin_recovery.c b/Administrator/src/ssw_pers_admin_recovery.c
new file mode 100644
index 0000000..3a74544
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_recovery.c
@@ -0,0 +1,2012 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of recovery process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.03.20 uidu0250 CSP_WZ#2250: Provide compress/uncompress functionality
+* 2013.02.15 uidu0250 CSP_WZ#8849: Fix persadmin_restore_all_data issue for restoring inexistent apps
+* 2013.02.07 uidu0250 CSP_WZ#2220: Changed implementation of persadmin_restore_check_RCT_compatibility to remove Helplibs usage
+* 2013.02.04 uidu0250 CSP_WZ#2211: Modified the implementation to be QAC compliant
+* 2013.01.10 uidu0250 CSP_WZ#2060: Adapted last database_helper modifications
+* 2013.01.10 uidu0250 CSP_WZ#2060: Switched to common defines from pers_data_organization_if.h
+* 2013.01.04 uidu0250 CSP_WZ#2060: Switched from using CRC32 to using CRC16 provided by HelpLibs
+* 2012.12.11 uidu0250 CSP_WZ#1925: Added RCT compatibility check
+* 2012.12.11 uidu0250 CSP_WZ#1925: Fixed data_backup_restore issues.
+* 2012.12.05 uidu0250 CSP_WZ#1925: Ignore the new applications from the backup content for PersASSelectionType_All.
+* 2012.11.16 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+/* ---------------------- include files --------------------------------- */
+#include "persComTypes.h"
+#include "string.h"
+#include "stdlib.h"
+#include <dlt/dlt.h>
+
+#include "persComDataOrg.h"
+#include "persistence_admin_service.h"
+#include "ssw_pers_admin_files_helper.h"
+#include "ssw_pers_admin_database_helper.h"
+#include "ssw_pers_admin_common.h"
+#include "ssw_pers_admin_service.h"
+
+
+/* ---------- local defines, macros, constants and type definitions ------------ */
+#define PAS_ITEM_LIST_DELIMITER '\0'
+
+
+/* path prefix for destination local cached database/folder: backup_path/Data/mnt-c/<appId>/<database_name or folder_name> */
+#define PAS_SRC_LOCAL_CACHE_PATH_FORMAT "%s"PERS_ORG_LOCAL_CACHE_PATH_FORMAT
+
+/* path prefix for destination shared group cached database/folder: backup_path/Data/mnt-c/shared/group/<group_no>/<database_name or folder_name> */
+#define PAS_SRC_SHARED_GROUP_CACHE_PATH_STRING_FORMAT "%s"PERS_ORG_SHARED_CACHE_PATH_STRING_FORMAT
+
+#define PAS_SHARED_PUBLIC_PATH PERS_ORG_SHARED_FOLDER_NAME"/"PERS_ORG_PUBLIC_FOLDER_NAME
+
+#define PAS_SHARED_GROUP_PATH PERS_ORG_SHARED_FOLDER_NAME"/"PERS_ORG_GROUP_FOLDER_NAME
+
+#define PAS_MAX_LIST_DB_SIZE (32 * 1024)
+
+#define SUCCESS_CODE (0)
+#define GENERIC_ERROR_CODE PAS_FAILURE;
+
+#define LT_HDR "RESTORE >>"
+
+/* ----------global variables. initialization of global contexts ------------ */
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+
+/* ---------------------- local functions ---------------------------------- */
+/**
+ * \brief Allow recovery of data from backup on application level -> (node+user).(application)
+ *
+ * \param backup_data_path full path of the data to be restored (above /Data folder)
+ * \param appId the application identifier
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_appl_data( pstr_t backup_data_path,
+ pstr_t appId );
+
+
+/**
+ * \brief Allow recovery of data from backup on user level -> (user).(application+shared)
+ *
+ * \param backup_data_path full path of the data to be restored (above /Data folder)
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_user_data(pstr_t backup_data_path,
+ uint32_t user_no,
+ uint32_t seat_no );
+
+
+/**
+ * \brief Allow recovery of all data from backup -> (node+user).(application+shared)
+ *
+ * \param backup_data_path full path of the data to be restored (above /data folder)
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_all_data( pstr_t backup_data_path );
+
+
+/**
+ * \brief Allow recovery of data backup on application level for the node section
+ *
+ * \param backupDataPath backup root location
+ * \param appId the application identifier
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_appl_node(pstr_t backupDataPath,
+ pstr_t appId );
+
+/**
+ * \brief Allow recovery of data backup on application level for the user section (all or a specific user)
+ *
+ * \param backupDataPath backup root location
+ * \param appId the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_appl_user( pstr_t backupDataPath,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+/**
+ * \brief Allow recovery of local user data for the selected user_no (all or a specific user)
+ *
+ * \param backupDataPath backup root location
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_user_local_data( pstr_t backupDataPath,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+/**
+ * \brief Allow recovery of shared user data for the selected user_no (all or a specific user)
+ *
+ * \param type restore type
+ * \param backupDataPath backup root location
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_user_shared_data( PersASSelectionType_e type,
+ pstr_t backupDataPath,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+/**
+ * \brief Allow recovery of user public files for the selected user_no (all or a specific user)
+ *
+ * \param backupDataPath backup root location
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_user_public_files(pstr_t backupDataPath,
+ uint32_t user_no,
+ uint32_t seat_no);
+/**
+ * \brief Allow recovery of user group files for the selected user_no (all or a specific user)
+ *
+ * \param backupDataPath backup root location
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_user_group_files( pstr_t backupDataPath,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+/**
+ * \brief Allow recovery of shared data not related to user
+ *
+ * \param backupDataPath backup root location
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_non_user_shared_data( pstr_t backupDataPath);
+
+
+/**
+ * \brief Allow recovery of local keys for the selected applicationId and/or user_no (all or a specific user)
+ *
+ * \param type recovery type
+ * \param backupDataPath backup root location
+ * \param appId the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_local_keys( PersASSelectionType_e type,
+ pstr_t backupDataPath,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+
+/**
+ * \brief Allow recovery of shared keys for the selected applicationId and/or user_no (all or a specific user)
+ *
+ * \param type recovery type
+ * \param backupDataPath backup root location
+ * \param appId the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+static long persadmin_restore_shared_keys( PersASSelectionType_e type,
+ pstr_t backupDataPath,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+
+/**
+ * \brief Checks if the RCT in the source path has the same content as the RCT in the destination path
+ *
+ * \param sourceRCTPath path of the source RCT file parent folder
+ * \param destRCTPath path of the destination RCT file parent folder
+ *
+ * \return true if the two RCT files have the same content, false otherwise
+ */
+static bool_t persadmin_restore_check_RCT_compatibility(pstr_t sourceRCTPath,
+ pstr_t destRCTPath );
+
+
+/**
+ * \brief Allow recovery of keys for the selected applicationId and/or user_no (all or a specific user)
+ *
+ * \param sourceRootPath root location
+ * \param applicationId the application identifier
+ *
+ * \return true if the application exists in the specified sourceRootPath, false otherwise
+ */
+static bool_t persadmin_restore_check_if_app_exists( pstr_t sourceRootPath,
+ pstr_t appId );
+
+/**
+ * \brief Forms the path (by appending) according to the provided user_no and seat_no
+ *
+ * \param parentUserPath an application/group/public path
+ * \param parentUserPathLength the size of the parentUserPath in characters. Should be able to accommodate the additional user/seat info
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return void
+ */
+static void persadmin_restore_set_user_path(pstr_t parentUserPath,
+ uint_t parentUserPathLength,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+/**
+ * \brief Allow recovery of data from backup on different level (application, user or complete)
+ *
+ * \param type represent the quality of the data to backup: all, application, user
+ * \param backup_name name of the backup to allow identification
+ * \param applicationID the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat number (seat 0 to 3)
+ *
+ * \return positive value: number of bytes restored; negative value: error code
+ */
+long persadmin_data_backup_recovery(PersASSelectionType_e type,
+ char* backup_name,
+ char* applicationID,
+ unsigned int user_no,
+ unsigned int seat_no)
+{
+ sint_t retVal = SUCCESS_CODE;
+ str_t pUncompressFromPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pUncompressToPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pDataRootPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+ if((NIL == backup_name) || (NIL == applicationID))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_data_backup_recovery call."));
+ return GENERIC_ERROR_CODE;
+ }
+ else
+ {
+ (void)memset(pUncompressFromPath, 0, sizeof(pUncompressFromPath));
+ (void)snprintf(pUncompressFromPath, sizeof(pUncompressFromPath), "%s%s", BACKUP_LOCATION, backup_name);
+
+ (void)memset(pUncompressToPath, 0, sizeof(pUncompressToPath));
+ (void)snprintf(pUncompressToPath, sizeof(pUncompressToPath), "%s", BACKUP_LOCATION);
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Backup file path:"),
+ DLT_STRING(pUncompressFromPath));
+
+ /* Check if the specified backup file exists */
+ if( persadmin_check_if_file_exists(pUncompressFromPath, false) < 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Backup file does not exist:"),
+ DLT_STRING(pUncompressFromPath));
+ return GENERIC_ERROR_CODE;
+ }
+
+ /* Extract backup data in the same location as the backup file */
+ retVal = persadmin_uncompress(pUncompressFromPath, pUncompressToPath);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Failed to extract backup content from:"),
+ DLT_STRING(pUncompressFromPath),
+ DLT_STRING("to"),
+ DLT_STRING(pUncompressToPath));
+ return retVal;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Successfully extracted backup content to:"),
+ DLT_STRING(pUncompressToPath));
+ }
+
+ /* remove trailing '/' */
+ (void)memset(pUncompressToPath, 0, sizeof(pUncompressToPath));
+ (void)snprintf(pUncompressToPath, strlen(BACKUP_LOCATION) * sizeof(*pUncompressToPath), "%s", BACKUP_LOCATION);
+
+ switch(type)
+ {
+
+ case PersASSelectionType_All:
+ {
+ retVal = persadmin_restore_all_data( pUncompressToPath );
+ }
+ break;
+
+ case PersASSelectionType_User:
+ {
+ retVal = persadmin_restore_user_data( pUncompressToPath,
+ user_no,
+ seat_no);
+ }
+ break;
+
+ case PersASSelectionType_Application:
+ {
+ retVal = persadmin_restore_appl_data( pUncompressToPath,
+ applicationID );
+ }
+ break;
+
+ default:
+ retVal = GENERIC_ERROR_CODE;
+ break; // redundant
+ }
+
+ if(SUCCESS_CODE <= retVal)
+ {
+ /* <backupDataPath>/Data */
+ (void)snprintf(pDataRootPath, sizeof(pDataRootPath), "%s", BACKUP_LOCATION);
+ (void)snprintf(pDataRootPath + strlen(BACKUP_LOCATION) - 1, (sizeof(pDataRootPath) - strlen(BACKUP_LOCATION) + 1) * sizeof(*pDataRootPath), "%s", PERS_ORG_ROOT_PATH);
+ if( 0 > persadmin_delete_folder(pDataRootPath))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR),
+ DLT_STRING("Failed to delete folder :"),
+ DLT_STRING(pDataRootPath));
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Successfully deleted folder:"),
+ DLT_STRING(pDataRootPath));
+ }
+ }
+ }
+
+ return retVal;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//---------------------------------------------------------------
+static void persadmin_restore_set_user_path(pstr_t parentUserPath,
+ uint_t parentUserPathLength,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ pstr_t pTempSrcUserPath = NIL;
+
+ pTempSrcUserPath = (pstr_t)malloc(parentUserPathLength * sizeof(*parentUserPath));/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pTempSrcUserPath)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Failed to allocate memory for user path."));
+ }
+ else
+ {
+ if(NIL != parentUserPath)
+ {
+ // all users & all seats;
+ if( (PERSIST_SELECT_ALL_USERS == user_no) && (PERSIST_SELECT_ALL_SEATS == seat_no) )
+ {
+ /* <parentUserPath>/user */
+ (void)snprintf(pTempSrcUserPath, parentUserPathLength, "%s%s", parentUserPath, gUser);
+ }
+ // only one user & all seats;
+ if( (PERSIST_SELECT_ALL_USERS != user_no) && (PERSIST_SELECT_ALL_SEATS == seat_no) )
+ {
+ /* <parentUserPath>/user/<user> */
+ (void)snprintf(pTempSrcUserPath, parentUserPathLength, "%s%s%d", parentUserPath, gUser, user_no);
+ }
+ // only one user & one seat;
+ if( (PERSIST_SELECT_ALL_USERS != user_no) && (PERSIST_SELECT_ALL_SEATS != seat_no) )
+ {
+ /* <parentUserPath>/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pTempSrcUserPath, parentUserPathLength, "%s%s%d%s%d", parentUserPath, gUser, user_no, gSeat, seat_no);
+ }
+
+ (void)snprintf(parentUserPath, parentUserPathLength, "%s", pTempSrcUserPath);
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_set_user_path call."));
+ }
+
+ free(pTempSrcUserPath);/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+}
+
+
+//---------------------------------------------------------------
+static long persadmin_restore_appl_node(pstr_t backupDataPath,
+ pstr_t appId ) // could use an 'extended' app path
+{
+ sint_t retVal;
+ long bytesRestored = 0;
+ str_t pNodeSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pNodeDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+ if((NIL == backupDataPath) || (NIL == appId))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_appl_node call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore node content for:"),
+ DLT_STRING(appId),
+ DLT_STRING("from"),
+ DLT_STRING(backupDataPath));
+
+ /* app node source path */
+
+ /* <backupDataPath>/Data/mnt-c/<appId>/node */
+ (void)snprintf(pNodeSourcePath, sizeof(pNodeSourcePath), PAS_SRC_LOCAL_CACHE_PATH_FORMAT, backupDataPath, appId, gNode);
+
+
+ /* app node dest path */
+
+ /* /Data/mnt-c/<appId>/node */
+ (void)snprintf(pNodeDestPath, sizeof(pNodeDestPath), gLocalCachePath, appId, gNode);
+
+ /* erase node content */
+ retVal = persadmin_delete_folder(pNodeDestPath);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_folder call failed with error code:"),
+ DLT_INT(retVal),
+ DLT_STRING("for"),
+ DLT_STRING(pNodeDestPath));
+ }
+
+ /* copy node content */
+ retVal = persadmin_copy_folder( pNodeSourcePath,
+ pNodeDestPath,
+ PersadminFilterAll,
+ true);
+
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_copy_folder call failed with error code:"),
+ DLT_INT(retVal),
+ DLT_STRING("for source:"),
+ DLT_STRING(pNodeSourcePath),
+ DLT_STRING("and destination:"),
+ DLT_STRING(pNodeDestPath));
+ return GENERIC_ERROR_CODE;
+ }
+
+ bytesRestored += retVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully node content for:"),
+ DLT_STRING(appId),
+ DLT_STRING("from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored."));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+
+//-----------------------------------------------------------------------
+static long persadmin_restore_appl_user( pstr_t backupDataPath,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+ long bytesRestored = 0;
+ str_t pUserSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pUserDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+
+ if((NIL == backupDataPath) || (NIL == appId))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_appl_user call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore user content for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("from"),
+ DLT_STRING(backupDataPath));
+
+ /* user source path */
+
+ /* <backupDataPath>/Data/mnt-c/<appId>/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pUserSourcePath, sizeof(pUserSourcePath), PAS_SRC_LOCAL_CACHE_PATH_FORMAT, backupDataPath, appId, "");
+ persadmin_restore_set_user_path( pUserSourcePath,
+ sizeof(pUserSourcePath)/sizeof(str_t),
+ user_no,
+ seat_no);
+
+ /* user dest path */
+
+ /* /Data/mnt-c/<appId>/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pUserDestPath, sizeof(pUserDestPath), gLocalCachePath, appId, "");
+ persadmin_restore_set_user_path(pUserDestPath,
+ sizeof(pUserDestPath)/sizeof(str_t),
+ user_no,
+ seat_no);
+
+ /* erase user content */
+ retVal = persadmin_delete_folder(pUserDestPath);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_folder call failed with error code:"),
+ DLT_INT(retVal),
+ DLT_STRING("for"),
+ DLT_STRING(pUserDestPath));
+ }
+
+ /* copy user content */
+ retVal = persadmin_copy_folder( pUserSourcePath,
+ pUserDestPath,
+ PersadminFilterAll,
+ true);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_copy_folder call failed with error code:"),
+ DLT_INT(retVal),
+ DLT_STRING("from"),
+ DLT_STRING(pUserSourcePath),
+ DLT_STRING("to"),
+ DLT_STRING(pUserDestPath));
+ return GENERIC_ERROR_CODE;
+ }
+
+ bytesRestored += retVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully user content for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored."));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//-------------------------------------------------------------------------------------
+static long persadmin_restore_non_user_shared_data( pstr_t backupDataPath)
+{
+ sint_t retVal;
+ long bytesRestored = 0;
+ str_t pGroupRootSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pExtendedAppId [PERS_ORG_MAX_LENGTH_PATH_FILENAME]; // group path
+ sint_t listBuffSize = 0;
+ pstr_t pStrList = NIL;
+ pstr_t pItemName = NIL;
+ sint_t outBuffSize = 0;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore non-user shared data from"),
+ DLT_STRING(backupDataPath));
+
+
+ /* --- public file/folder restore --- */
+ retVal = persadmin_restore_appl_node( backupDataPath,
+ PAS_SHARED_PUBLIC_PATH );
+ if(retVal < 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_appl_node call failed with error code:"),
+ DLT_INT(retVal));
+ return GENERIC_ERROR_CODE;
+ }
+ bytesRestored += retVal;
+
+
+ /* --- group file/folder restore --- */
+
+ /* <backupDataPath>/Data/mnt-c/shared/group */
+ (void)snprintf(pGroupRootSourcePath, sizeof(pGroupRootSourcePath), "%s%s", backupDataPath, PERS_ORG_SHARED_GROUP_CACHE_PATH);
+
+
+ /* Check all groups */
+ listBuffSize = persadmin_list_folder_get_size( pGroupRootSourcePath,
+ PersadminFilterFolders,
+ false );
+ if(listBuffSize < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_folder_get_size call failed with error code:"),
+ DLT_INT(listBuffSize));
+ return GENERIC_ERROR_CODE;
+ }
+ if(listBuffSize > 0)
+ {
+ pStrList = NIL;
+ pStrList = (pstr_t)malloc((uint_t)listBuffSize); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pStrList)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error allocating memory for list of folders."));
+ return GENERIC_ERROR_CODE;
+ }
+ (void)memset(pStrList, 0, (uint_t)listBuffSize);
+
+ outBuffSize = persadmin_list_folder( pGroupRootSourcePath,
+ pStrList,
+ listBuffSize,
+ PersadminFilterFolders,
+ false);
+ if(outBuffSize < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error obtaining the list of folders."));
+ free(pStrList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ pItemName = pStrList;
+ while(listBuffSize > 0)
+ {
+ if(0 == strlen(pItemName))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid folder item found."));
+ break;
+ }
+
+ /* Restore the node content for every group */
+
+ /* shared/group/<group_id> */
+ (void)snprintf(pExtendedAppId, sizeof(pExtendedAppId), "%s/%s/%s", PERS_ORG_SHARED_FOLDER_NAME, PERS_ORG_GROUP_FOLDER_NAME, pItemName);
+
+ retVal = persadmin_restore_appl_node( backupDataPath,
+ pExtendedAppId);
+ if(retVal < 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_appl_node call failed with error code:"),
+ DLT_INT(retVal));
+ free(pStrList);/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ bytesRestored += retVal;
+
+ listBuffSize -= ((sint_t)strlen(pItemName) + 1) * (sint_t)sizeof(*pItemName);
+ pItemName += (strlen(pItemName) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+
+ free(pStrList);/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore non-user shared data from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored"));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//--------------------------------------------------------------------------
+static long persadmin_restore_user_public_files(pstr_t backupDataPath,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+ long bytesRestored = 0;
+ str_t pPublicSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pPublicDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pUserSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pUserDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+
+ if(NIL == backupDataPath)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_user_public_files call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore user public files from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+
+ /* --- public RCT compatibility check --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("public RCT compatibility check..."));
+
+ /* <backupDataPath>/Data/mnt-c/shared/public */
+ (void)snprintf(pPublicSourcePath, sizeof(pPublicSourcePath), "%s%s", backupDataPath, PERS_ORG_SHARED_PUBLIC_CACHE_PATH);
+
+ /* /Data/mnt-c/shared/public */
+ (void)snprintf(pPublicDestPath, sizeof(pPublicDestPath), "%s", PERS_ORG_SHARED_PUBLIC_CACHE_PATH);
+
+
+ if(false == persadmin_restore_check_RCT_compatibility(pPublicSourcePath, pPublicDestPath))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Incompatible public RCT files:"),
+ DLT_STRING(pPublicSourcePath),
+ DLT_STRING("<->"),
+ DLT_STRING(pPublicDestPath));
+ return GENERIC_ERROR_CODE;
+ }
+
+ /* --- public file/folder restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("public file/folder restore..."));
+
+ /* <backupDataPath>/Data/mnt-c/shared/public/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pUserSourcePath, sizeof(pUserSourcePath), "%s%s", backupDataPath, PERS_ORG_SHARED_PUBLIC_CACHE_PATH);
+ persadmin_restore_set_user_path(pUserSourcePath,
+ sizeof(pUserSourcePath)/sizeof(str_t),
+ user_no,
+ seat_no);
+
+ /* /Data/mnt-c/shared/public/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pUserDestPath, sizeof(pUserDestPath), "%s", PERS_ORG_SHARED_PUBLIC_CACHE_PATH);
+ persadmin_restore_set_user_path(pUserDestPath,
+ sizeof(pUserDestPath)/sizeof(str_t),
+ user_no,
+ seat_no);
+
+ /* erase user content */
+ retVal = persadmin_delete_folder(pUserDestPath);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_folder call failed with error code:"),
+ DLT_INT(retVal));
+ }
+
+ /* copy user content */
+ retVal = persadmin_copy_folder( pUserSourcePath,
+ pUserDestPath,
+ PersadminFilterAll,
+ true);
+ if(retVal < 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_copy_folder call failed with error code:"),
+ DLT_INT(retVal));
+ return GENERIC_ERROR_CODE;
+ }
+
+ bytesRestored += retVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully user public files from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored"));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+//--------------------------------------------------------------------------
+static long persadmin_restore_user_group_files( pstr_t backupDataPath,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+ long bytesRestored = 0;
+ str_t pGroupRootSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pGroupSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pGroupDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pUserSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pUserDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ pstr_t pStrList = NIL;
+ pstr_t pItemName = NIL;
+ sint_t listBuffSize = 0;
+ sint_t outBuffSize = 0;
+
+ if(NIL == backupDataPath)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_user_group_files call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore user group files from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+ /* <backupDataPath>/Data/mnt-c/shared/group */
+ (void)snprintf(pGroupRootSourcePath, sizeof(pGroupRootSourcePath), "%s%s", backupDataPath, PERS_ORG_SHARED_GROUP_CACHE_PATH);
+
+ /* Check all groups */
+ listBuffSize = persadmin_list_folder_get_size( pGroupRootSourcePath,
+ PersadminFilterFolders,
+ false );
+ if(listBuffSize < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_folder_get_size call failed with error code:"),
+ DLT_INT(listBuffSize));
+ return GENERIC_ERROR_CODE;
+ }
+ if(listBuffSize > 0)
+ {
+ pStrList = NIL;
+ pStrList = (pstr_t)malloc((uint_t)listBuffSize); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pStrList)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error allocating memory for list of folders."));
+ return GENERIC_ERROR_CODE;
+ }
+ (void)memset(pStrList, 0, (uint_t)listBuffSize);
+
+ outBuffSize = persadmin_list_folder( pGroupRootSourcePath,
+ pStrList,
+ listBuffSize,
+ PersadminFilterFolders,
+ false);
+ if(outBuffSize < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error obtaining the list of folders."));
+ free(pStrList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ pItemName = pStrList;
+ while(listBuffSize > 0)
+ {
+ if(0 == strlen(pItemName))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid group name found."));
+ break;
+ }
+
+ /* Restore the user content for every group */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("restore user content for group"),
+ DLT_STRING(pItemName),
+ DLT_STRING(" ..."));
+
+ /* --- group RCT compatibility check --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("RCT compatibility check for group"),
+ DLT_STRING(pItemName),
+ DLT_STRING("..."));
+
+ /* <backupDataPath>/Data/mnt-c/shared/group/<group_id> */
+ (void)snprintf(pGroupSourcePath, sizeof(pGroupSourcePath), PAS_SRC_SHARED_GROUP_CACHE_PATH_STRING_FORMAT, backupDataPath, pItemName, "");
+
+ /*/Data/mnt-c/shared/group/<group_id> */
+ (void)snprintf(pGroupDestPath, sizeof(pGroupDestPath), PERS_ORG_SHARED_CACHE_PATH_STRING_FORMAT, pItemName, "");
+
+ if(false == persadmin_restore_check_RCT_compatibility(pGroupSourcePath, pGroupDestPath))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Incompatible group RCT files:"),
+ DLT_STRING(pGroupSourcePath),
+ DLT_STRING("<->"),
+ DLT_STRING(pGroupDestPath));
+ free(pStrList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ /* <backupDataPath>/Data/mnt-c/shared/group/<group_id>/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pUserSourcePath, sizeof(pUserSourcePath), PAS_SRC_SHARED_GROUP_CACHE_PATH_STRING_FORMAT, backupDataPath, pItemName, "");
+ persadmin_restore_set_user_path(pUserSourcePath,
+ sizeof(pUserSourcePath) / sizeof(str_t),
+ user_no,
+ seat_no);
+
+ /* /Data/mnt-c/shared/group/<group_id>/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pUserDestPath, sizeof(pUserDestPath), PERS_ORG_SHARED_CACHE_PATH_STRING_FORMAT, pItemName, "");
+ persadmin_restore_set_user_path(pUserDestPath,
+ sizeof(pUserDestPath) / sizeof(str_t),
+ user_no,
+ seat_no);
+
+ /* erase user content */
+ retVal = persadmin_delete_folder(pUserDestPath);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_folder call failed with error code:"),
+ DLT_INT(retVal));
+ }
+
+ /* copy user content */
+ retVal = persadmin_copy_folder( pUserSourcePath,
+ pUserDestPath,
+ PersadminFilterAll,
+ true);
+
+ if(retVal < 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_copy_folder call failed with error code:"),
+ DLT_INT(retVal));
+ free(pStrList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ bytesRestored += retVal;
+
+ listBuffSize -= ((sint_t)strlen(pItemName) + 1) * (sint_t)sizeof(*pItemName);
+ pItemName += (strlen(pItemName) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+
+ free(pStrList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully user group files from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored"));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//--------------------------------------------------------------------------
+static long persadmin_restore_user_local_data( pstr_t backupDataPath,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t siRetVal = 0;
+ sint_t listBuffSize = 0;
+ long retVal = 0;
+ long bytesRestored = 0;
+ pstr_t pAppNameList = NIL;
+ pstr_t pAppName = NIL;
+ str_t pAppSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pAppDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+
+ if(NIL == backupDataPath)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_user_local_data call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore user local data from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+ /* Get list of application names */
+ siRetVal = persadmin_list_application_folders_get_size(backupDataPath);
+ if(siRetVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_application_folders_get_size call failed with error code:"),
+ DLT_INT(siRetVal));
+ return GENERIC_ERROR_CODE;
+ }
+
+ if(0 == siRetVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR),
+ DLT_STRING("No application found."));
+ return siRetVal;
+ }
+
+ listBuffSize = siRetVal;
+
+ pAppNameList = NIL;
+ pAppNameList = (pstr_t) malloc((uint_t)listBuffSize); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pAppNameList)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error allocating memory for App name list."));
+ return GENERIC_ERROR_CODE;
+ }
+ (void)memset(pAppNameList, 0, (uint_t)listBuffSize);
+
+ siRetVal = persadmin_list_application_folders(backupDataPath,
+ pAppNameList,
+ listBuffSize );
+
+ if((siRetVal <= SUCCESS_CODE) || (siRetVal > listBuffSize))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_application_folders call failed with error code:"),
+ DLT_INT(siRetVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ listBuffSize = siRetVal;
+ pAppName = pAppNameList;
+ while(listBuffSize > 0)
+ {
+ if(0 == strlen(pAppName))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid app name found."));
+ break;
+ }
+
+ /* <backupDataPath>/Data/mnt-c/<appId> */
+ (void)snprintf(pAppSourcePath, sizeof(pAppSourcePath), PAS_SRC_LOCAL_CACHE_PATH_FORMAT, backupDataPath, pAppName, "");
+
+ /* /Data/mnt-c/<appId> */
+ (void)snprintf(pAppDestPath, sizeof(pAppDestPath), PERS_ORG_LOCAL_CACHE_PATH_FORMAT, pAppName, "");
+
+ /* --- RCT compatibility check --- */
+ if(false == persadmin_restore_check_RCT_compatibility(pAppSourcePath, pAppDestPath))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Incompatible App RCT files:"),
+ DLT_STRING(pAppSourcePath),
+ DLT_STRING("<->"),
+ DLT_STRING(pAppDestPath));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+
+ /* user_no for every app */
+ retVal = persadmin_restore_appl_user( backupDataPath,
+ pAppName,
+ user_no,
+ seat_no);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_appl_user call failed with error code:"),
+ DLT_INT(retVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+ bytesRestored += retVal;
+
+
+ /* user_no for local keys */
+ retVal = persadmin_restore_local_keys( PersASSelectionType_User,
+ backupDataPath,
+ pAppName,
+ user_no,
+ seat_no);
+
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_local_keys call failed with error code:"),
+ DLT_INT(retVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+ bytesRestored += retVal;
+
+
+ /* links to groups and public */
+ siRetVal = persadmin_import_links(pAppSourcePath,
+ pAppDestPath );
+
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_import_links call failed with error code:"),
+ DLT_INT(retVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+ bytesRestored += siRetVal;
+
+ listBuffSize -= ((sint_t)strlen(pAppName) + 1) * (sint_t)sizeof(*pAppName);
+ pAppName += (strlen(pAppName) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully user local data from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored"));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+//--------------------------------------------------------------------------
+static long persadmin_restore_user_shared_data( PersASSelectionType_e type,
+ pstr_t backupDataPath,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+ long bytesRestored = 0;
+
+
+ if(NIL == backupDataPath)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_user_shared_data call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore (of type"),
+ DLT_INT(type),
+ DLT_STRING(") user shared data from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+
+ /* --- public user files restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("public file/folder restore..."));
+
+ retVal = persadmin_restore_user_public_files( backupDataPath,
+ user_no,
+ seat_no);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_user_public_files call failed with error code:"),
+ DLT_INT(retVal));
+ }
+
+ bytesRestored += retVal;
+
+
+ /* --- group user files restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("group file/folder restore..."));
+
+ retVal = persadmin_restore_user_group_files(backupDataPath,
+ user_no,
+ seat_no);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_user_group_files call failed with error code:"),
+ DLT_INT(retVal));
+ }
+
+ bytesRestored += retVal;
+
+
+ /* --- shared key-value restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("restore shared keys for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("..."));
+
+ retVal = persadmin_restore_shared_keys( type,
+ backupDataPath,
+ "",
+ user_no,
+ seat_no);
+
+ if(retVal < 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_shared_keys call failed with error code:"),
+ DLT_INT(retVal));
+ return GENERIC_ERROR_CODE;
+ }
+
+ bytesRestored += retVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully user shared data from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored"));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//-------------------------------------------------------------------------
+static long persadmin_restore_local_keys( PersASSelectionType_e type,
+ pstr_t backupDataPath,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t siRetVal;
+ long bytesRestored = 0;
+ str_t pDBFileName [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pDBFileName_ [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pDestDBPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ pstr_t pSourceDBPath = NIL;
+ pstr_t pDBList = NIL;
+
+ if((NIL == backupDataPath) || (NIL == appId))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_local_keys call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore local keys from "),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+ // alloc. a fixed size for DB list
+ pDBList = NIL;
+ pDBList = (pstr_t) malloc(PAS_MAX_LIST_DB_SIZE); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pDBList)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error allocating memory for DB list."));
+ return GENERIC_ERROR_CODE;
+ }
+ (void)memset(pDBList, 0, PAS_MAX_LIST_DB_SIZE);
+
+
+ siRetVal = persadmin_get_all_db_paths_with_names( backupDataPath,
+ appId,
+ PersistenceStorage_local,
+ pDBList,
+ PAS_MAX_LIST_DB_SIZE);
+
+ if(siRetVal <= 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_get_all_db_paths_with_names call failed with error code:"),
+ DLT_INT(siRetVal));
+ free(pDBList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pDBList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ pSourceDBPath = pDBList;
+ while(PAS_ITEM_LIST_DELIMITER != (*pSourceDBPath))
+ {
+ (void)memset(pDBFileName, 0, sizeof(pDBFileName));
+
+ siRetVal = persadmin_get_filename(pSourceDBPath,
+ pDBFileName,
+ sizeof(pDBFileName));
+
+ if(siRetVal < 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_get_filename call failed with error code:"),
+ DLT_INT(siRetVal));
+ free(pDBList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pDBList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ (void)snprintf(pDBFileName_, sizeof(pDBFileName_), "/%s", pDBFileName);
+
+ /* Form a local path */
+ (void)snprintf(pDestDBPath, sizeof(pDestDBPath), PERS_ORG_LOCAL_CACHE_PATH_FORMAT, appId, pDBFileName_);
+
+ // delete the keys in the destination DB only if the source DB exists
+ if(SUCCESS_CODE == persadmin_check_if_file_exists( pSourceDBPath, false))
+ {
+ // remove current keys before transferring keys from backup content
+ siRetVal = persadmin_delete_keys_by_filter( type,
+ pDestDBPath,
+ user_no,
+ seat_no);
+ if(siRetVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_keys_by_filter call failed with error code:"),
+ DLT_INT(siRetVal));
+ }
+ }
+
+ // transfer the keys from the backup content
+ if(SUCCESS_CODE == persadmin_check_if_file_exists( pSourceDBPath, false))
+ {
+ siRetVal = persadmin_copy_keys_by_filter( type,
+ pDestDBPath,
+ pSourceDBPath,
+ user_no,
+ seat_no );
+ if(siRetVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_copy_keys_by_filter call failed with error code:"),
+ DLT_INT(siRetVal));
+ free(pDBList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pDBList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ bytesRestored += siRetVal;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR),
+ DLT_STRING("Source database does not exist (ignore):"),
+ DLT_STRING(pSourceDBPath));
+ }
+
+ pSourceDBPath += (strlen(pSourceDBPath) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+
+ free(pDBList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pDBList=NIL;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully local keys from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored"));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+//-------------------------------------------------------------------------
+static long persadmin_restore_shared_keys( PersASSelectionType_e type,
+ pstr_t backupDataPath,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t siRetVal;
+ long bytesRestored = 0;
+ str_t pDBFileName [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pDBFileName_ [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pDestDBPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ pstr_t pSourceDBPath = NIL;
+ pstr_t pDBList = NIL;
+ pstr_t pSharedSubstr = NIL;
+
+ if((NIL == backupDataPath) || (NIL == appId))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_shared_keys call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore shared keys from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+ // alloc. a fixed size for DB list
+ pDBList = NIL;
+ pDBList = (pstr_t) malloc(PAS_MAX_LIST_DB_SIZE); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pDBList)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error allocating memory for DB list."));
+ return GENERIC_ERROR_CODE;
+ }
+ (void)memset(pDBList, 0, PAS_MAX_LIST_DB_SIZE);
+
+
+ siRetVal = persadmin_get_all_db_paths_with_names( backupDataPath,
+ appId,
+ PersistenceStorage_shared,
+ pDBList,
+ PAS_MAX_LIST_DB_SIZE);
+
+ if(siRetVal <= 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_get_all_db_paths_with_names call failed with error code:"),
+ DLT_INT(siRetVal));
+ free(pDBList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pDBList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ pSourceDBPath = pDBList;
+ while(PAS_ITEM_LIST_DELIMITER != (*pSourceDBPath))
+ {
+ (void)memset(pDBFileName, 0, sizeof(pDBFileName));
+
+ siRetVal = persadmin_get_filename(pSourceDBPath,
+ pDBFileName,
+ sizeof(pDBFileName));
+
+ if(siRetVal < 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_get_filename call failed with error code:"),
+ DLT_INT(siRetVal));
+ free(pDBList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pDBList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ (void)snprintf(pDBFileName_, sizeof(pDBFileName_), "/%s", pDBFileName);
+
+ /* Form a shared path */
+ pSharedSubstr = NIL;
+ /* public DB */
+ pSharedSubstr = strstr(pSourceDBPath, PAS_SHARED_PUBLIC_PATH);
+ if(NIL == pSharedSubstr)
+ {
+ /* group DB */
+ pSharedSubstr = strstr(pSourceDBPath, PAS_SHARED_GROUP_PATH);
+ }
+
+ if(NIL != pSharedSubstr)
+ {
+ (void)snprintf(pDestDBPath, sizeof(pDestDBPath), "%s%s", PERS_ORG_LOCAL_APP_CACHE_PATH_, pSharedSubstr);
+ }
+
+ // transfer the keys from the backup content
+ if(SUCCESS_CODE == persadmin_check_if_file_exists( pSourceDBPath, false))
+ {
+ siRetVal = persadmin_copy_keys_by_filter( type,
+ pDestDBPath,
+ pSourceDBPath,
+ user_no,
+ seat_no );
+ if(siRetVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_copy_keys_by_filter call failed with error code:"),
+ DLT_INT(siRetVal));
+ free(pDBList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pDBList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ bytesRestored += siRetVal;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR),
+ DLT_STRING("Source database does not exist (ignore):"),
+ DLT_STRING(pSourceDBPath));
+ }
+
+ pSourceDBPath += (strlen(pSourceDBPath) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+
+ free(pDBList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pDBList=NIL;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully shared keys from"),
+ DLT_STRING(backupDataPath),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored"));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+
+//-------------------------------------------------------------------------------
+static bool_t persadmin_restore_check_if_app_exists(pstr_t sourceRootPath,
+ pstr_t appId )
+{
+ str_t pAppPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+ if((NIL == sourceRootPath) || (NIL == appId))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_check_if_app_exists call."));
+ return false;
+ }
+
+ /* <sourceRootPath>/Data/mnt-c/<appId> */
+ (void)snprintf(pAppPath, sizeof(pAppPath), PAS_SRC_LOCAL_CACHE_PATH_FORMAT, sourceRootPath, appId, "");
+
+ if(SUCCESS_CODE == persadmin_check_if_file_exists( pAppPath, true))
+ {
+ return true;
+ }
+
+ return false;
+}
+
+//---------------------------------------------------------------------------------
+static bool_t persadmin_restore_check_RCT_compatibility(pstr_t sourceRCTPath,
+ pstr_t destRCTPath )
+{
+ str_t pSrcRCTPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pDestRCTPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+ if((NIL == sourceRCTPath) || (NIL == destRCTPath))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_check_RCT_compatibility call."));
+ return false;
+ }
+
+
+ /* path to source RCT file */
+ (void)snprintf(pSrcRCTPath, sizeof(pSrcRCTPath), "%s%s", sourceRCTPath, gResTableCfg);
+
+ /* path to dest RCT file */
+ (void)snprintf(pDestRCTPath, sizeof(pDestRCTPath), "%s%s", destRCTPath, gResTableCfg);
+
+ return persadmin_check_for_same_file_content(pSrcRCTPath, pDestRCTPath);
+}
+
+
+//---------------------------------------------------------------------------
+static long persadmin_restore_appl_data( pstr_t backup_data_path,
+ pstr_t appId )
+{
+ long retVal = SUCCESS_CODE;
+ long bytesRestored = 0;
+ str_t pAppSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pAppDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+ if((NIL == backup_data_path) || (NIL == appId))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_appl_data call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore app data from"),
+ DLT_STRING(backup_data_path),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId));
+
+
+ /* <backupDataPath>/Data/mnt-c/<appId> */
+ (void)snprintf(pAppSourcePath, sizeof(pAppSourcePath), PAS_SRC_LOCAL_CACHE_PATH_FORMAT, backup_data_path, appId, "");
+
+ /* /Data/mnt-c/<appId> */
+ (void)snprintf(pAppDestPath, sizeof(pAppDestPath), PERS_ORG_LOCAL_CACHE_PATH_FORMAT, appId, "");
+
+
+ /* --- RCT compatibility check --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("RCT compatibility check for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("..."));
+
+ if(false == persadmin_restore_check_RCT_compatibility(pAppSourcePath, pAppDestPath))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Incompatible App RCT files."));
+ return GENERIC_ERROR_CODE;
+ }
+
+
+ /* --- local file/folder restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("local file/folder restore..."));
+
+
+ /* Check if the specified application data exists */
+ if(true == persadmin_restore_check_if_app_exists( (pstr_t)backup_data_path,
+ (pstr_t)appId) )
+ {
+ /* restore node content */
+ retVal = persadmin_restore_appl_node( backup_data_path,
+ (pstr_t)appId);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_appl_node call failed with error code:"),
+ DLT_INT(retVal));
+ return GENERIC_ERROR_CODE;
+ }
+ else
+ {
+ bytesRestored += retVal;
+ }
+
+ /* restore user content (for all users) */
+ retVal = persadmin_restore_appl_user( backup_data_path,
+ (pstr_t)appId,
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_appl_user call failed with error code:"),
+ DLT_INT(retVal));
+ return GENERIC_ERROR_CODE;
+ }
+ else
+ {
+ bytesRestored += retVal;
+ }
+ }
+
+
+ /* --- local key-value restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("local key/value restore..."));
+
+ retVal = persadmin_restore_local_keys( PersASSelectionType_Application,
+ backup_data_path,
+ appId,
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_local_keys call failed with error code:"),
+ DLT_INT(retVal));
+ return GENERIC_ERROR_CODE;
+ }
+ else
+ {
+ bytesRestored += retVal;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully app data from"),
+ DLT_STRING(backup_data_path),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored"));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+
+//---------------------------------------------------------------------------
+static long persadmin_restore_user_data(pstr_t backup_data_path,
+ uint32_t user_no,
+ uint32_t seat_no )
+{
+ long retVal = 0;
+ long bytesRestored = 0;
+
+
+ if(NIL == backup_data_path)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_user_data call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore user data from"),
+ DLT_STRING(backup_data_path),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+ /* --- local user data restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("local user data restore..."));
+
+ retVal = persadmin_restore_user_local_data( backup_data_path,
+ user_no,
+ seat_no);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_user_local_data call failed with error code:"),
+ DLT_INT(retVal));
+ return GENERIC_ERROR_CODE;
+ }
+
+ bytesRestored += retVal;
+
+
+ /* --- shared user data restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("shared user data restore..."));
+
+ retVal = persadmin_restore_user_shared_data(PersASSelectionType_User,
+ backup_data_path,
+ user_no,
+ seat_no);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_user_shared_data call failed with error code:"),
+ DLT_INT(retVal));
+ return GENERIC_ERROR_CODE;
+ }
+
+ bytesRestored += retVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully user data from"),
+ DLT_STRING(backup_data_path),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored"));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+
+//---------------------------------------------------------------------------
+static long persadmin_restore_all_data( pstr_t backup_data_path )
+{
+ sint_t siRetVal = 0;
+ sint_t listBuffSize = 0;
+ long retVal = 0;
+ long bytesRestored = 0;
+ pstr_t pAppNameList = NIL;
+ pstr_t pAppName = NIL;
+ str_t pAppSourcePath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pAppDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+
+ if(NIL == backup_data_path)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_all_data call."));
+ return GENERIC_ERROR_CODE;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore all data from"),
+ DLT_STRING(backup_data_path));
+
+
+ /* --- local data restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("local data restore..."));
+
+ /* Get list of backup application names */
+ /* Only the existing applications will be restored, no new applications will be added from the backup content */
+ siRetVal = persadmin_list_application_folders_get_size(backup_data_path);
+ if(siRetVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_application_folders_get_size call failed with error code:"),
+ DLT_INT(siRetVal));
+ return GENERIC_ERROR_CODE;
+ }
+
+ if(0 == siRetVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR),
+ DLT_STRING("No application found."));
+ return siRetVal;
+ }
+
+ listBuffSize = siRetVal;
+
+ pAppNameList = (pstr_t) malloc((uint_t)listBuffSize); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pAppNameList)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error allocating memory for App name list."));
+ return GENERIC_ERROR_CODE;
+ }
+ (void)memset(pAppNameList, 0, (uint_t)listBuffSize);
+
+ siRetVal = persadmin_list_application_folders(backup_data_path,
+ pAppNameList,
+ listBuffSize );
+
+ if((siRetVal < SUCCESS_CODE) || (siRetVal > listBuffSize))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_application_folders call failed with error code:"),
+ DLT_INT(siRetVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+
+ listBuffSize = siRetVal;
+ pAppName = pAppNameList;
+ while(listBuffSize > 0)
+ {
+ if(0 == strlen(pAppName))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid app name found."));
+ break;
+ }
+
+ /* Check if the application exists. Skip the application otherwise */
+ /* /Data/mnt-c/<appId> */
+ (void)snprintf(pAppDestPath, sizeof(pAppDestPath), PERS_ORG_LOCAL_CACHE_PATH_FORMAT, pAppName, "");
+
+ if(true == persadmin_restore_check_if_app_exists("", pAppName))
+ {
+ /* local app data */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("local app data restore..."));
+
+ retVal = persadmin_restore_appl_data( backup_data_path,
+ pAppName );
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_appl_data call failed with error code:"),
+ DLT_INT(retVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+ bytesRestored += retVal;
+
+
+ /* links to groups and public */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("restore links to groups and public..."));
+
+ /* <backupDataPath>/Data/mnt-c/<appId> */
+ (void)snprintf(pAppSourcePath, sizeof(pAppSourcePath), PAS_SRC_LOCAL_CACHE_PATH_FORMAT, backup_data_path, pAppName, "");
+
+ siRetVal = persadmin_import_links( pAppSourcePath,
+ pAppDestPath );
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_import_links call failed with error code:"),
+ DLT_INT(retVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return GENERIC_ERROR_CODE;
+ }
+ bytesRestored += retVal;
+ }
+
+ listBuffSize -= ((sint_t)strlen(pAppName) + 1) * (sint_t)sizeof(*pAppName);
+ pAppName += (strlen(pAppName) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+
+
+ /* non-user shared data */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("restore non-user shared data..."));
+
+ retVal = persadmin_restore_non_user_shared_data(backup_data_path);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_non_user_shared_data call failed with error code:"),
+ DLT_INT(retVal));
+ return GENERIC_ERROR_CODE;
+ }
+ bytesRestored += retVal;
+
+
+ /* user shared data */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("restore user shared data..."));
+
+ retVal = persadmin_restore_user_shared_data( PersASSelectionType_All,
+ backup_data_path,
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ if(retVal < SUCCESS_CODE)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_user_shared_data call failed with error code:"),
+ DLT_INT(retVal));
+ return GENERIC_ERROR_CODE;
+ }
+ bytesRestored += retVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully all data from"),
+ DLT_STRING(backup_data_path),
+ DLT_STRING("."),
+ DLT_INT64(bytesRestored),
+ DLT_STRING("bytes restored"));
+
+ return bytesRestored;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
diff --git a/Administrator/src/ssw_pers_admin_resource_config_add.c b/Administrator/src/ssw_pers_admin_resource_config_add.c
new file mode 100644
index 0000000..c49efa6
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_resource_config_add.c
@@ -0,0 +1,3905 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Implementation of resource_cong_add funtionality
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.10.23 uidl9757 CSP_WZ#6300: Installation of the default values in context of the custom keys not working
+* 2013.09.27 uidl9757 CSP_WZ#5781: Fix memory leakage
+* 2013.09.23 uidl9757 CSP_WZ#5781: Watchdog timeout of pas-daemon
+* 2013.06.07 uidl9757 CSP_WZ#4260: Variable sContext of type pas_cfg_instFoldCtx_s is not initialized.
+* 2013.04.12 uidl9757 CSP_WZ#3450: Fix SCC warnings
+* 2013.04.02 uidl9757 CSP_WZ#2798: Fix some of review findings
+* 2013.03.21 uidl9757 CSP_WZ#2798: Complete rework to allow configuration based on json files
+* 2012.12.13 uidl9757 CSP_WZ#1280: Update according to new detailed description:
+ https://workspace1.conti.de/content/00002483/Team%20Documents/01%20Technical%20Documentation
+ /04%20OIP/20_SW_Packages/03_Persistence/Administration_Service
+ /Configure%20and%20initialize%20data%20and%20policy%20for%20new%20application%20-%20questions.doc
+* 2012.11.29 uidl9757 CSP_WZ#1280: Created
+*
+**********************************************************************************************************************/
+
+/* ---------------------- include files --------------------------------- */
+#include "persComTypes.h"
+#include "stdio.h" /*DG C8MR2R-MISRA-C:2004 Rule 20.9-SSW_Administrator_0007*/
+#include "string.h"
+#include "stdlib.h"
+#include <stddef.h>
+#include <unistd.h>
+#include <sys/file.h>
+#include "fcntl.h"
+#include <errno.h>
+#include <sys/stat.h>
+#include "dlt.h"
+
+
+#include "ssw_pers_admin_service.h"
+
+#include "persComErrors.h"
+#include "persComDataOrg.h"
+#include "persComDbAccess.h"
+#include "persComRct.h"
+
+#include "ssw_pers_admin_files_helper.h"
+#include "ssw_pers_admin_common.h"
+#include "persistence_admin_service.h"
+
+#include "ssw_pers_admin_config.h"
+
+
+/******************************************************************************************************
+******************************** Local defines *****************************************************
+******************************************************************************************************/
+/* !!!!!! TO BE EXPOSED IN A INTERFACE !!!! */
+#define PERSADMIN_MIN_USER_NO 1
+#define PERSADMIN_NO_OF_USERS 4
+#define PERSADMIN_MAX_USER_NO ((PERSADMIN_MIN_USER_NO)+(PERSADMIN_NO_OF_USERS)-1)
+#define PERSADMIN_MIN_SEAT_NO 1
+#define PERSADMIN_NO_OF_SEATS 4
+#define PERSADMIN_MAX_SEAT_NO ((PERSADMIN_MIN_SEAT_NO)+(PERSADMIN_NO_OF_SEATS)-1)
+
+/* folder where the input resource is un-compressed */
+#define PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME "/tmp/PAS/cfg/"
+/* the root folder of the un-compressed input */
+#define PERSADM_CFG_SOURCE_ROOT_FOLDER_PATH PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME PERSADM_CFG_RESOURCE_ROOT_FOLDER_NAME
+
+/* root folder - configuration data for shared public */
+#define PERSADM_CFG_SOURCE_PUBLIC_FOLDER_PATH PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME PERSADM_CFG_RESOURCE_PUBLIC_FOLDER_PATHNAME
+/* root folder - configuration data for shared group */
+#define PERSADM_CFG_SOURCE_GROUPS_FOLDER_PATH PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME PERSADM_CFG_RESOURCE_GROUPS_FOLDER_PATHNAME
+/* root folder - configuration data for applications */
+#define PERSADM_CFG_SOURCE_APPS_FOLDER_PATH PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME PERSADM_CFG_RESOURCE_APPS_FOLDER_PATHNAME
+
+/* root folder - configurations for key type resources */
+#define PERSADM_CFG_SOURCE_KEY_TYPE_DATA_FOLDER_RELATIVE_PATH "/"PERSADM_CFG_RESOURCE_ROOT_KEYDATA_FOLDER_NAME
+/* root folder - configurations for file type resources */
+#define PERSADM_CFG_SOURCE_FILE_TYPE_DATA_FOLDER_RELATIVE_PATH "/"PERSADM_CFG_RESOURCE_ROOT_FILEDATA_FOLDER_NAME
+
+/******************************************************************************************************
+******************************** Local macros ******************************************************
+******************************************************************************************************/
+
+
+/******************************************************************************************************
+******************************** Local structures and enums ****************************************
+******************************************************************************************************/
+
+/*-----------------------------------------------------------------------------------------------------
+Install folder related (common for public/group/app)
+-----------------------------------------------------------------------------------------------------*/
+/* to handle information about availablity of files */
+typedef struct pas_conf_fileInfo_s_
+{
+ bool_t bIsAvailable ; /* the file indicated by pathname exists */
+ str_t pathname[PERSADMIN_MAX_PATH_LENGHT]; /* pathname */
+ sint_t handler ; /* open handler to file (only if needed) */
+}pas_conf_fileInfo_s ;
+
+/* structure to make easier to obtain the context for destination install folder
+* allows to use a loop instead of individual calls */
+typedef struct pas_conf_helpDestContextEntry_s_
+{
+ bool_t bIsFolder ; /* specify if we deal with a file or a folder */
+ pas_conf_fileInfo_s* psFileAvailability ; /* availability (in the install folder) of file/folder specified by filename */
+ pstr_t filename ; /* file or folder name (not the complete path) */
+}pas_conf_helpDestContextEntry_s ;
+
+/* structure to make easier to obtain the context for source install folder
+* allows to use a loop instead of individual calls */
+typedef struct pas_conf_helpSrcContextEntry_s_
+{
+ bool_t bIsFolder ; /* specify if we deal with a file or a folder */
+ pas_conf_fileInfo_s* psFileAvailability ; /* availability (in the install folder) of file/folder specified by filename */
+ pstr_t filename ; /* file or folder name (not the complete path) */
+ PersAdminCfgFileTypes_e eCfgFileType ; /* file type */
+ bool_t bPresenceIsMandatory ; /* true if presence of the file is mandatory */
+}pas_conf_helpSrcContextEntry_s ;
+
+/* the context for destination(public/group/app) install folder */
+typedef struct pas_cfg_destInstallFolderContext_s_
+{
+ pas_conf_fileInfo_s sInstallFolder ; /* destination install folder */
+ pas_conf_fileInfo_s sRctDB ; /* destination RCT DB */
+ pas_conf_fileInfo_s sCachedDB ; /* destination cached DB */
+ pas_conf_fileInfo_s sWtDB ; /* destination un-cached DB */
+ pas_conf_fileInfo_s sFactoryDefaultDB ; /* destination factory-default DB */
+ pas_conf_fileInfo_s sConfigurableDefaultDB ; /* destination configurable-default DB */
+}pas_cfg_destInstallFolderContext_s ;
+
+
+/* the context for source(public/group/app) install folder */
+typedef struct pas_cfg_srcInstallFolderContext_s_
+{
+ pas_conf_fileInfo_s sInstallFolder ; /* source install folder */
+ pas_conf_fileInfo_s sFiledataFolder ; /* source filedata folder */
+ pas_conf_fileInfo_s sKeydataFolder ; /* source keydata folder */
+ pas_conf_fileInfo_s sRctFile ; /* source RCT configuration file */
+ pas_conf_fileInfo_s sFactoryDefaultDataFile ; /* source factory-default data configuration file */
+ pas_conf_fileInfo_s sConfigurableDefaultDataFile ; /* source configurable-default data configuration file */
+ pas_conf_fileInfo_s sInitialDataFile ; /* source initial non-default data configuration file */
+ pas_conf_fileInfo_s sExceptionsFile ; /* source install exceptions file */
+}pas_cfg_srcInstallFolderContext_s ;
+
+/* info about list (items in list are '\0' separated) */
+typedef struct pas_conf_listOfItems_s_
+{
+ sint_t sizeOfList ; /* size of list in bytes */
+ pstr_t pList ; /* pointer to the list */
+}pas_conf_listOfItems_s;
+
+/* handle together the lists for an install folder (public/group/app) */
+typedef struct pas_conf_listsForInstallFolder_s_
+{
+ pas_conf_listOfItems_s sSrcRCT ; /* list of resources in source RCT */
+ pas_conf_listOfItems_s sDestRCT ; /* list of resources in destination RCT */
+ pas_conf_listOfItems_s sObsoleteResources ; /* list of resources no longer present in source RCT */
+}pas_conf_listsForInstallFolder_s;
+
+/* top structure for an install folder (public/group/app) */
+typedef struct pas_cfg_instFoldCtx_s_
+{
+ PersAdminCfgInstallRules_e eInstallRule ; /* install rule for the public/grup/app */
+ pas_cfg_destInstallFolderContext_s sDestContext ; /* context for destination folder */
+ pas_cfg_srcInstallFolderContext_s sSrcContext ; /* context for source folder */
+ pas_conf_listsForInstallFolder_s sLists ; /* lists for install folder (source and destination) */
+}pas_cfg_instFoldCtx_s ;
+
+/*-----------------------------------------------------------------------------------------------------
+Resource related
+-----------------------------------------------------------------------------------------------------*/
+/* the types of configuration possible for a resource */
+typedef enum
+{
+ pas_cfg_configType_update = 0, /* (over)write configuration for the resource */
+ pas_cfg_configType_dontTouch, /* don't touch the configuration for the resource */
+ pas_cfg_configType_delete /* remove the configuration for the resource */
+}pas_cfg_configTypes_e ;
+
+/* context for key's policy change */
+typedef struct pas_conf_keyPolicyChangeCtx_s_
+{
+ PersistenceConfigurationKey_s* psSrcConfig ; /* new(source)configuration for resource */
+ PersistenceConfigurationKey_s* psDestConfig ; /* old(destination)configuration for resource */
+ sint_t hDestCachedDB ; /* handler to local cached DB */
+ sint_t hDestWtDB ; /* handler to local un-cached DB */
+}pas_conf_keyPolicyChangeCtx_s ;
+
+/*-----------------------------------------------------------------------------------------------------
+Default-data related
+-----------------------------------------------------------------------------------------------------*/
+/* for an easier management of file handlers for default data */
+typedef struct pas_conf_handlersForDefault_s_
+{
+ sint_t hDestRctDB ; /* handler to destination RCT DB */
+ sint_t hDestDefaultDataDB ; /* handler to destination default-data DB */
+ sint_t hSrcRctFile ; /* handler to source RCT configuration file */
+ sint_t hSrcDefaultDataFile ; /* handler to source default-data configuration file */
+ sint_t hSrcExceptions ; /* handler to source install-exceptions configuration file */
+}pas_conf_handlersForDefault_s ;
+
+/*-----------------------------------------------------------------------------------------------------
+Non-default-data related
+-----------------------------------------------------------------------------------------------------*/
+/* for an easier management of file handlers for non-default data */
+typedef struct pas_conf_handlersForNonDefault_s_
+{
+ sint_t hDestRctDB ; /* handler to destination RCT DB */
+ sint_t hDestCachedDataDB ; /* handler to destination cached-data DB */
+ sint_t hDestWtDataDB ; /* handler to destination writethrough-data DB */
+ sint_t hSrcRctFile ; /* handler to source RCT configuration file */
+ sint_t hSrcExceptions ; /* handler to source install-exceptions configuration file */
+}pas_conf_handlersForNonDefault_s ;
+
+/*-----------------------------------------------------------------------------------------------------
+Look-Up table related
+-----------------------------------------------------------------------------------------------------*/
+/* types of data in regards to origin (default, runtime) */
+typedef enum pas_cfg_dataTypes_e
+{
+ pas_cfg_dataTypes_DefaultFactory = 0, /* factory-default */
+ pas_cfg_dataTypes_DefaultConfigurable, /* configurable-default */
+ pas_cfg_dataTypes_NonDefault, /* non-default (initial or runtime)*/
+ /* add new entries here */
+ pas_cfg_dataTypes_LastEntry
+}pas_cfg_dataTypes_e ;
+
+/* entry in Look-Up table for install rules/exceptions */
+typedef struct pas_cfg_lookUpEntry_s_
+{
+ pas_cfg_configTypes_e eDefaultConfigType ; /* default rule to be applied on resources */
+ bool_t affectedDataLookUp[pas_cfg_dataTypes_LastEntry] ; /* look-up table for data affected by install rule */
+ bool_t exceptionsLookUp[PersAdminCfgInstallExceptions_LastEntry] ; /* look-up table for exceptions allowed for an install rule */
+}pas_cfg_lookUpEntry_s ;
+
+
+
+/******************************************************************************************************
+******************************** Local variables ***************************************************
+******************************************************************************************************/
+
+/* Look-Up table for relations between install rules, affected data and install exceptions */
+static pas_cfg_lookUpEntry_s g_LookUpRules[PersAdminCfgInstallRules_LastEntry] =
+{
+ /* ********************** ************************** ********************************** *********************************
+ **** install rule **** *** default config type ** ******** affected data ********** ******* allowed exceptions *****
+ ********************** ************************** ********************************** *********************************
+ factory config non-default update dontTouch delete
+ default default */
+
+ /* NewInstall */ {pas_cfg_configType_update, {true, true, true}, {false, false, false} },
+ /* Uninstall */ {pas_cfg_configType_delete, {true, true, true}, {false, false, false} },
+ /* DontTouch */ {pas_cfg_configType_dontTouch,{false, false, false}, {false, false, false} },
+ /* UpdateAll */ {pas_cfg_configType_update, {true, true, true}, {false, true, false} },
+/* UpdateAllSkipDefaultFactory */ {pas_cfg_configType_update, {false, true, true}, {false, true, false} },
+/* UpdateAllSkipDefaultConfig */ {pas_cfg_configType_update, {true, false, true}, {false, true, false} },
+ /* UpdateAllSkipDefaultAll */ {pas_cfg_configType_update, {false, false, true}, {false, true, false} },
+ /* UpdateDefaultFactory */ {pas_cfg_configType_update, {true, false, false}, {false, true, false} },
+ /* UpdateDefaultConfig */ {pas_cfg_configType_update, {false, true, false}, {false, true, false} },
+ /* UpdateDefaultAll */ {pas_cfg_configType_update, {true, true, false}, {false, true, false} },
+ /* UpdateSetOfResources */ {pas_cfg_configType_dontTouch,{true, true, true}, {true, false, true} },
+ /* UninstallNonDefault */ {pas_cfg_configType_delete, {false, false, true}, {false, true, false} }
+} ;
+
+
+/******************************************************************************************************
+******************************** DLT related *******************************************************
+******************************************************************************************************/
+/* L&T context */
+#define LT_HDR "CONF >> "
+DLT_IMPORT_CONTEXT (persAdminSvcDLTCtx)
+
+static str_t g_msg[512] ; /* 512 bytes should be enough ; any way snprintf is used */
+
+/******************************************************************************************************
+******************************** Local functions ***************************************************
+******************************************************************************************************/
+
+/*-----------------------------------------------------------------------------------------------------
+Top level
+-----------------------------------------------------------------------------------------------------*/
+static bool_t pas_conf_checkSource(void) ;
+
+/*-----------------------------------------------------------------------------------------------------
+Public-data related
+-----------------------------------------------------------------------------------------------------*/
+static sint_t pas_conf_configureDataForPublic(void) ;
+static bool_t pas_conf_removeDataForPublic(bool_t bPrepareForNewInstall) ;
+
+/*-----------------------------------------------------------------------------------------------------
+Group-data related
+-----------------------------------------------------------------------------------------------------*/
+static sint_t pas_conf_configureDataForGroups(void) ;
+static sint_t pas_conf_configureDataForGroup(constpstr_t groupID, PersAdminCfgInstallRules_e eInstallRule) ;
+static bool_t pas_conf_configureGroupMembers(constpstr_t groupID, pas_cfg_instFoldCtx_s* const psInstallFolderCtx) ;
+static bool_t pas_conf_addMemberToGroup(constpstr_t groupID, constpstr_t appName) ;
+static bool_t pas_conf_identifyAndAddNewMembersToGroup(constpstr_t groupID, constpstr_t pBufNewMembersList, sint_t iSizeNewList, constpstr_t pBufOldMembersList, sint_t iSizeOldList) ;
+static bool_t pas_conf_removeGroupMembers(constpstr_t groupID) ;
+static bool_t pas_conf_removeMemberFromGroup(constpstr_t groupID, constpstr_t appID) ;
+static bool_t pas_conf_identifyAndRemoveObsoleteGroupMembers(constpstr_t groupID, constpstr_t pBufNewMembersList, sint_t iSizeNewList, constpstr_t pBufOldMembersList, sint_t iSizeOldList) ;
+static bool_t pas_conf_removeDataForGroup(constpstr_t groupID, bool_t bPrepareForNewInstall) ;
+static bool_t pas_conf_isGroupIdValid(constpstr_t groupID);
+
+/*-----------------------------------------------------------------------------------------------------
+Application-data related
+-----------------------------------------------------------------------------------------------------*/
+static sint_t pas_conf_configureDataForApplications(void) ;
+static sint_t pas_conf_configureDataForApp(constpstr_t appID, PersAdminCfgInstallRules_e eInstallRule) ;
+static bool_t pas_conf_removeDataForApp(constpstr_t appID, bool_t bPrepareForNewInstall) ;
+
+/*-----------------------------------------------------------------------------------------------------
+Install folder related
+-----------------------------------------------------------------------------------------------------*/
+static bool_t pas_conf_getContextInstallFolder(constpstr_t destInstallFolder, constpstr_t srcInstallFolder, pas_cfg_instFoldCtx_s* psInstallFolderCtx_inout) ;
+static bool_t pas_conf_destroyContextInstallFolder(pas_cfg_instFoldCtx_s* psInstallFolderCtx_inout) ;
+static sint_t pas_conf_configureDataForInstallFolder(pas_cfg_instFoldCtx_s* const psInstallFolderCtx) ;
+static bool_t pas_conf_createListsForInstallFolder( pas_cfg_instFoldCtx_s* psInstallFolderCtx_inout) ;
+static bool_t pas_conf_destroyListsForInstallFolder(pas_cfg_instFoldCtx_s* psInstallFolderCtx_inout) ;
+static sint_t pas_conf_processPolicyChangesForInstallFolder(pas_cfg_instFoldCtx_s* const psInstallFolderCtx) ;
+static bool_t pas_conf_processPolicyChangesForKey(pstr_t resourceID, pas_cfg_instFoldCtx_s* const psInstallFolderCtx, pas_conf_keyPolicyChangeCtx_s* const psKeyPolicyChangeCtx); /*DG C8MR2R-MISRA-C:2004 Rule 5.1-SSW_Administrator_0005*/
+static sint_t pas_conf_uninstallObsoleteDataForInstallFolder(pas_cfg_instFoldCtx_s* const psInstallFolderCtx) ;
+static bool_t pas_conf_uninstallObsoleteResource(constpstr_t resourceID, PersistenceConfigurationKey_s* const psConfig, pas_cfg_instFoldCtx_s* const psInstallFolderCtx) ;
+static bool_t pas_conf_uninstallObsoleteKey(pstr_t resourceID, PersistenceConfigurationKey_s* const psConfig, pas_cfg_instFoldCtx_s* const psInstallFolderCtx) ;
+static bool_t pas_conf_uninstallObsoleteFile(pstr_t resourceID, PersistenceConfigurationKey_s* const psConfig, pas_cfg_instFoldCtx_s* const psInstallFolderCtx) ;
+static sint_t pas_conf_updateRctForInstallFolder(pas_cfg_instFoldCtx_s* const psInstallFolderCtx) ;
+static sint_t pas_conf_configureForDefault(pas_cfg_instFoldCtx_s* const psInstallFolderCtx, bool_t bForFactoryDefault) ;
+static bool_t pas_conf_setupHandlersForDefault(pas_cfg_instFoldCtx_s* const psInstallFolderCtx, bool_t bForFactoryDefault, pas_conf_handlersForDefault_s* psHandlers_out) ;
+static sint_t pas_conf_configureForNonDefault(pas_cfg_instFoldCtx_s* const psInstallFolderCtx) ;
+static bool_t pas_conf_setupHandlersForNonDefault(pas_cfg_instFoldCtx_s* const psInstallFolderCtx, pas_conf_handlersForNonDefault_s* psHandlers_out) ;
+static bool_t pas_conf_getConfigurationNeededForResource(constpstr_t resourceID, PersAdminCfgInstallRules_e eRule, sint_t hExceptions, pas_cfg_configTypes_e* peConfigType_out);
+static bool_t pas_conf_updateDefaultDataForResource(constpstr_t resourceID, pas_cfg_instFoldCtx_s* const psInstallFolderCtx, pas_conf_handlersForDefault_s* psHandlers, bool_t bForFactoryDefault) ;
+static bool_t pas_conf_deleteDefaultDataForResource(constpstr_t resourceID, pas_cfg_instFoldCtx_s* const psInstallFolderCtx, pas_conf_handlersForDefault_s* psHandlers, bool_t bForFactoryDefault) ;
+static bool_t pas_conf_deleteNonDefaultDataForResource(constpstr_t resourceID, pas_cfg_instFoldCtx_s* const psInstallFolderCtx, pas_conf_handlersForNonDefault_s* psHandlers) ;
+static bool_t pas_conf_deleteNonDefaultDataForKeyTypeResource(constpstr_t resourceID, sint_t hNonDefaultDB) ; /*DG C8MR2R-MISRA-C:2004 Rule 5.1-SSW_Administrator_0005*/
+static bool_t pas_conf_deleteNonDefaultDataForFileTypeResource(constpstr_t resourceID, constpstr_t installFolderPathname) ; /*DG C8MR2R-MISRA-C:2004 Rule 5.1-SSW_Administrator_0005*/
+
+
+/*-----------------------------------------------------------------------------------------------------
+Helpers
+-----------------------------------------------------------------------------------------------------*/
+static bool_t pas_conf_unarchiveResourceFile(constpstr_t resourcePathname) ;
+static bool_t pas_conf_deleteFolderContent(pstr_t folderPathName, PersadminFilterMode_e eFilterMode) ;
+static sint_t pas_conf_filterResourcesList(pstr_t resourceID, bool_t bFilterOnlyNonDefault, bool_t bIsKeyType, pas_conf_listOfItems_s* const psListUnfiltered, pstr_t pListFiltered_out);
+
+
+/******************************************************************************************************
+******************************** Implementation ****************************************************
+******************************************************************************************************/
+
+
+/**
+ * @brief Allow to extend the configuration for persistency of data from specified level (application, user).
+ * Used during new persistency entry installation
+ * https://workspace1.conti.de/content/00002483/Team%20Documents/01%20Technical%20Documentation/04%20OIP/20_SW_Packages/03_Persistence/Administration_Service/Configure%20and%20initialize%20data%20and%20policy%20for%20new%20application%20-%20questions.doc
+ *
+ * @param resource_file name of the persistency resource configuration to integrate
+ *
+ * @return positive value: number of added/modified/removed entries in RCT for all public/groups/apps ; negative value: error code
+ */
+long persadmin_resource_config_add(char* resource_file)
+{
+ bool_t bEverythingOK = true ;
+ sint_t errorCode = PAS_FAILURE ;
+
+ sint_t iNoOfInstalledResources = 0 ;
+
+ /* check params */
+ if(NIL == resource_file)
+ {
+ bEverythingOK = false ;
+ errorCode = PERS_COM_ERR_INVALID_PARAM ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - NULL param", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ /* un-archive the resource file */
+ if( ! pas_conf_unarchiveResourceFile(resource_file))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_unarchiveResourceFile(%s) FAILED", __FUNCTION__, resource_file) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ /* source available in PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME */
+ /* check source validity/consistency */
+ if( ! pas_conf_checkSource())
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_checkSource FAILED", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ /* source in PERSADM_CFG_SOURCE_ROOT_FOLDER_PATH is fine */
+ sint_t iNoOfInstalledResourcesPartial = 0 ;
+
+ iNoOfInstalledResourcesPartial = pas_conf_configureDataForPublic() ;
+ if(iNoOfInstalledResourcesPartial >= 0)
+ {
+ iNoOfInstalledResources += iNoOfInstalledResourcesPartial ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - %d resources installed for public", __FUNCTION__, iNoOfInstalledResourcesPartial) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+
+ if(bEverythingOK)
+ {
+ iNoOfInstalledResourcesPartial = pas_conf_configureDataForGroups() ;
+ if(iNoOfInstalledResourcesPartial >= 0)
+ {
+ iNoOfInstalledResources += iNoOfInstalledResourcesPartial ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - %d resources installed for groups", __FUNCTION__, iNoOfInstalledResourcesPartial) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ iNoOfInstalledResourcesPartial = pas_conf_configureDataForApplications() ;
+ if(iNoOfInstalledResourcesPartial >= 0)
+ {
+ iNoOfInstalledResources += iNoOfInstalledResourcesPartial ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - %d resources installed for applications", __FUNCTION__, iNoOfInstalledResourcesPartial) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ /* remove the folder with un-compressed input */
+ if(0 <= persadmin_check_if_file_exists(PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME, true))
+ {
+ sint_t iBytesDeleted = persadmin_delete_folder(PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME) ;
+ if(iBytesDeleted < 0)
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persadmin_delete_folder(%s) returned <%d>",
+ __FUNCTION__, PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME, iBytesDeleted) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - result=%d bEverythingOK=%d", __FUNCTION__, iNoOfInstalledResources, bEverythingOK) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ return (bEverythingOK ? iNoOfInstalledResources : errorCode) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 1-SSW_Administrator_0008*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0009*/
+
+
+/**
+ * \brief Perform consistency check of the input (uncompressed in the default folder)
+ * \param none
+ * \return true for success, false for error
+ */
+static bool_t pas_conf_checkSource(void)
+{
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING("pas_conf_checkSource: NOT IMPLEMENTED !!!"));
+ return true ;
+}
+
+
+/**
+ * \brief Apply configuration for shared public data
+ * \param none
+ * \return the number of installed resources, or negative value for error
+ */
+static sint_t pas_conf_configureDataForPublic(void)
+{
+ bool_t bEverythingOK = true ;
+ sint_t errorCode = PAS_FAILURE ;
+ sint_t iNoOfInstalledResources = 0 ;
+ pas_cfg_instFoldCtx_s sContext = {0} ;
+ bool_t bNothingToDo = false ; /* set to true in case of PersAdminCfgInstallRules_DontTouch */
+ pstr_t pInstallRulesPathname = PERSADM_CFG_SOURCE_PUBLIC_FOLDER_PATH"/"PERSADM_CFG_RESOURCE_INSTALL_RULES_FILENAME ;
+
+ sint_t hRules = -1 ;
+
+ /* retrigger watchdog */
+ persadmin_RetriggerWatchdog();
+
+ /* initialize */
+ (void)memset(&sContext, 0x0, sizeof(sContext));
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - started...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ /* get handler for install rules file */
+ hRules = persAdmCfgFileOpen(pInstallRulesPathname, PersAdminCfgFileType_InstallRules) ;
+
+ if(hRules < 0)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgFileOpen(%s) Failed err=%d", __FUNCTION__, pInstallRulesPathname, hRules) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ /* there should be at most one install rule for "public" */
+
+ sint_t errorLocal = persAdmCfgRulesGetRuleForFolder(hRules, PERS_ORG_PUBLIC_FOLDER_NAME, &sContext.eInstallRule) ;
+ if(errorLocal >= 0)
+ {
+ /* install rule for "public" available */
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - install rule for public = <%d>", __FUNCTION__, sContext.eInstallRule) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(PersAdminCfgInstallRules_DontTouch == sContext.eInstallRule)
+ {
+ bNothingToDo = true ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - No configuration needed for public data", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ /* install rule for "public" not available => skip configuration for "public" */
+ bNothingToDo = true ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgRulesGetRuleForFolder(%s) Failed err=%d => skip it", __FUNCTION__, pInstallRulesPathname, errorLocal) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK && (! bNothingToDo))
+ {
+ if( (PersAdminCfgInstallRules_Uninstall == sContext.eInstallRule)
+ || (PersAdminCfgInstallRules_NewInstall == sContext.eInstallRule))
+ {
+ /* in case of newInstall/uninstall, the folder must be cleaned/deleted */
+ bool_t bPrepareForNewInstall = (PersAdminCfgInstallRules_NewInstall == sContext.eInstallRule) ;
+ if( ! pas_conf_removeDataForPublic(bPrepareForNewInstall))
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_removeDataForPublic(%d)...%s",
+ __FUNCTION__, bPrepareForNewInstall, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK && (! bNothingToDo))
+ {
+ /* let's be sure that "public" folder exists (if no one created it before, or it was deleted) */
+ if(0 > persadmin_check_if_file_exists(PERS_ORG_SHARED_PUBLIC_WT_PATH, true))
+ {
+ if(0 > persadmin_create_folder(PERS_ORG_SHARED_PUBLIC_WT_PATH))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK && (! bNothingToDo))
+ {
+ /* get the constext for install folder */
+ if(pas_conf_getContextInstallFolder(PERS_ORG_SHARED_PUBLIC_WT_PATH, PERSADM_CFG_SOURCE_PUBLIC_FOLDER_PATH"/"PERS_ORG_PUBLIC_FOLDER_NAME, &sContext))
+ {
+ iNoOfInstalledResources = pas_conf_configureDataForInstallFolder(&sContext) ;
+ if(iNoOfInstalledResources >= 0)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureDataForInstallFolder returned %d", __FUNCTION__, iNoOfInstalledResources) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = iNoOfInstalledResources ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureDataForInstallFolder FAILED err=%d", __FUNCTION__, errorCode) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_getContextInstallFolder FAILED", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if( ! pas_conf_destroyContextInstallFolder(&sContext))
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+
+ if(hRules >= 0)
+ {
+ (void)persAdmCfgFileClose(hRules) ;
+ }
+
+ return (bEverythingOK ? iNoOfInstalledResources : errorCode) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 1-SSW_Administrator_0010*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0011*/
+
+/**
+ * \brief Remove data for "public"
+ * \param bPrepareForNewInstall [in] if true, the install folder is cleaned, other way it is removed
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_removeDataForPublic(bool_t bPrepareForNewInstall)
+{
+ bool_t bEverythingOK = true ;
+ pstr_t pFolderPathName = PERS_ORG_SHARED_PUBLIC_WT_PATH ;
+
+ if(0 <= persadmin_check_if_file_exists(pFolderPathName, true))
+ {
+ if(bPrepareForNewInstall)
+ {
+ /* delete the content of "public" folder, but keep the folder */
+ if( ! pas_conf_deleteFolderContent(pFolderPathName, PersadminFilterAll))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ /* delete "public" folder */
+ if(0 > persadmin_delete_folder(pFolderPathName))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+
+/*****************************************************************************************************************
+****************************** Group data related ***************************************************************
+*****************************************************************************************************************/
+
+/**
+ * \brief Apply configuration for shared group data
+ * \param none
+ * \return the number of installed resources, or negative value for error
+ */
+static sint_t pas_conf_configureDataForGroups(void)
+{
+ bool_t bEverythingOK = true ;
+ sint_t errorCode = PAS_FAILURE ;
+ sint_t iNoOfInstalledResources = 0 ;
+ PersAdminCfgInstallRules_e eRule = PersAdminCfgInstallRules_DontTouch ;
+ pstr_t bufferInstallRules = NIL ;
+ sint_t iSizeBufInstallRules = 0 ;
+ pstr_t pInstallRulesPathname = PERSADM_CFG_SOURCE_GROUPS_FOLDER_PATH"/"PERSADM_CFG_RESOURCE_INSTALL_RULES_FILENAME ;
+ sint_t hRules = -1 ;
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - started...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ /* get handler to install rules file */
+ hRules = persAdmCfgFileOpen(pInstallRulesPathname, PersAdminCfgFileType_InstallRules) ;
+
+ if(hRules < 0)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgFileOpen(%s) Failed err=%d", __FUNCTION__, pInstallRulesPathname, hRules) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ /* get the list of groups for which install rules are defined */
+ iSizeBufInstallRules = persAdmCfgRulesGetSizeFoldersList(hRules) ;
+ if(iSizeBufInstallRules > 0)
+ {
+ bufferInstallRules = (pstr_t)malloc((size_t)iSizeBufInstallRules) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != bufferInstallRules)
+ {
+ sint_t iErrLocal = persAdmCfgRulesGetFoldersList(hRules, bufferInstallRules, iSizeBufInstallRules) ;
+ if(iErrLocal != iSizeBufInstallRules)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgRulesGetFoldersList returned %d (expected %d)",
+ __FUNCTION__, iErrLocal, iSizeBufInstallRules) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ if(iSizeBufInstallRules < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgRulesGetSizeFoldersList returned %d", __FUNCTION__, iSizeBufInstallRules) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ /* for each group in the list, apply configuration */
+ pstr_t currentGroupID = NIL ;
+ sint_t iPosInBuffer = 0 ;
+
+ while(bEverythingOK && (iPosInBuffer < iSizeBufInstallRules))
+ {
+ sint_t errorLocal ;
+ currentGroupID = bufferInstallRules + iPosInBuffer ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ if( ! pas_conf_isGroupIdValid(currentGroupID))
+ {
+ bEverythingOK = false ;
+ break ;
+ }
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - Start configuration for group <<%s>>", __FUNCTION__, currentGroupID) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ errorLocal = persAdmCfgRulesGetRuleForFolder(hRules, currentGroupID, &eRule) ;
+ if(errorLocal >= 0)
+ {
+ if(PersAdminCfgInstallRules_DontTouch != eRule)
+ {
+ sint_t iNoOfResourcesInstalledForGroup = pas_conf_configureDataForGroup(currentGroupID, eRule) ;
+ if(iNoOfResourcesInstalledForGroup >= 0)
+ {
+ iNoOfInstalledResources += iNoOfResourcesInstalledForGroup ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureDataForGroup(%s) returned %d",
+ __FUNCTION__, currentGroupID, iNoOfResourcesInstalledForGroup) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - No configuration needed for group <<%s>>", __FUNCTION__, currentGroupID) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ iPosInBuffer += ((sint_t)strlen(currentGroupID) + 1) ; /* 1 <=> '\0'*/
+ }
+ }
+
+ if(bufferInstallRules != NIL)
+ {
+ free(bufferInstallRules) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+
+ if(hRules >= 0)
+ {
+ (void)persAdmCfgFileClose(hRules) ;
+ }
+
+ return (bEverythingOK ? iNoOfInstalledResources : errorCode) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 1-SSW_Administrator_0012*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0013*/ /*DG C8ISQP-ISQP Metric 11-SSW_Administrator_0014*/
+
+/**
+ * \brief Apply configuration for one group
+ * \param groupID [in] group's name
+ * \param eInstallRule [in] install rule for the group
+ * \return the number of installed resources, or negative value for error
+ */
+static sint_t pas_conf_configureDataForGroup( constpstr_t groupID,
+ PersAdminCfgInstallRules_e eInstallRule)
+{
+ bool_t bEverythingOK = true ;
+ sint_t errorCode = PAS_FAILURE ;
+ sint_t iNoOfInstalledResources = 0 ;
+ pas_cfg_instFoldCtx_s sContext = {0};
+
+ str_t destInstallFolder[PERSADMIN_MAX_PATH_LENGHT] ;
+ str_t srcInstallFolder[PERSADMIN_MAX_PATH_LENGHT] ;
+
+ /* retrigger watchdog */
+ persadmin_RetriggerWatchdog();
+
+ if( (PersAdminCfgInstallRules_Uninstall == eInstallRule)
+ || (PersAdminCfgInstallRules_NewInstall == eInstallRule))
+ {
+ /* clean/delete the group's folder */
+ bool_t bPrepareForNewInstall = (PersAdminCfgInstallRules_NewInstall == eInstallRule) ;
+ if( ! pas_conf_removeDataForGroup(groupID, bPrepareForNewInstall))
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_removeDataForGroup(%s, %d)...%s",
+ __FUNCTION__, groupID, bPrepareForNewInstall, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK && (PersAdminCfgInstallRules_Uninstall != eInstallRule))
+ {
+ sContext.eInstallRule = eInstallRule ;
+
+ /* set the paths */
+ (void)snprintf(destInstallFolder, sizeof(destInstallFolder), "%s/%s",
+ PERS_ORG_SHARED_GROUP_WT_PATH, groupID) ;
+ (void)snprintf(srcInstallFolder, sizeof(destInstallFolder), "%s/%s",
+ PERSADM_CFG_SOURCE_GROUPS_FOLDER_PATH, groupID) ;
+
+ /* create the group's install folder, if not already created */
+ if(0 > persadmin_check_if_file_exists(destInstallFolder, true))
+ {
+ if(0 > persadmin_create_folder(destInstallFolder))
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ if( ! pas_conf_getContextInstallFolder(destInstallFolder, srcInstallFolder, &sContext))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_getContextInstallFolder FAILED", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+ if(bEverythingOK && (PersAdminCfgInstallRules_Uninstall != eInstallRule))
+ {
+ /* make configurations (e.g. create/delete sym-links) for the group's members */
+ if( ! pas_conf_configureGroupMembers(groupID, &sContext))
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureGroupMembers ... %s",
+ __FUNCTION__, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ }
+
+ if(bEverythingOK && (PersAdminCfgInstallRules_Uninstall != eInstallRule))
+ {
+ /* apply configuration for the group's folder */
+ iNoOfInstalledResources = pas_conf_configureDataForInstallFolder(&sContext) ;
+ if(iNoOfInstalledResources >= 0)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureDataForInstallFolder returned %d", __FUNCTION__, iNoOfInstalledResources) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = iNoOfInstalledResources ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureDataForInstallFolder FAILED err=%d", __FUNCTION__, errorCode) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if( ! pas_conf_destroyContextInstallFolder(&sContext))
+ {
+ bEverythingOK = false ;
+ }
+
+ return (bEverythingOK ? iNoOfInstalledResources : errorCode) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0015*/
+
+/**
+ * \brief Make configurations (e.g. create/delete sym-links) for the group's members
+ * \param groupID [in] group's name
+ * \param psInstallFolderCtx [in] context for the group
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_configureGroupMembers(constpstr_t groupID, pas_cfg_instFoldCtx_s* const psInstallFolderCtx)
+{
+ bool_t bEverythingOK = true ;
+ pstr_t pBufSrcMembersList = NIL ;
+ sint_t iSizeSrcMembersList = 0 ;
+ pstr_t pBufDestMembersList = NIL ;
+ sint_t iSizeDestMembersList = 0 ;
+ str_t destGroupMembersFilePathname[PERSADMIN_MAX_PATH_LENGHT] ;
+ str_t srcGroupMembersFilePathname[PERSADMIN_MAX_PATH_LENGHT] ;
+ bool_t bSrcGroupContentFileExists = false ;
+
+ /* set paths */
+ (void)snprintf(destGroupMembersFilePathname, sizeof(destGroupMembersFilePathname), "%s/%s",
+ psInstallFolderCtx->sDestContext.sInstallFolder.pathname,
+ PERSADM_CFG_RESOURCE_GROUP_CONTENT_FILENAME) ;
+ (void)snprintf(srcGroupMembersFilePathname, sizeof(srcGroupMembersFilePathname), "%s/%s",
+ psInstallFolderCtx->sSrcContext.sInstallFolder.pathname,
+ PERSADM_CFG_RESOURCE_GROUP_CONTENT_FILENAME) ;
+
+
+ /* Obtain the lists with the old and new group's members.
+ * Compare the new members list with the old ones.
+ * - for each new member => create sym link to group's folder
+ * - for each old member no longer in the list => delete sym link to group's folder */
+ if(0 <= persadmin_check_if_file_exists(srcGroupMembersFilePathname, false))
+ {
+ sint_t hSrcGroupContentFile ;
+
+ bSrcGroupContentFileExists = true ;
+
+ hSrcGroupContentFile = persAdmCfgFileOpen(srcGroupMembersFilePathname, PersAdminCfgFileType_GroupContent) ;
+
+ if(hSrcGroupContentFile >= 0)
+ {
+ iSizeSrcMembersList = persAdmCfgGroupContentGetSizeMembersList(hSrcGroupContentFile) ;
+ if(iSizeSrcMembersList > 0)
+ {
+ /* don't forget to free it */
+ pBufSrcMembersList = (pstr_t)malloc((size_t)iSizeSrcMembersList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != pBufSrcMembersList)
+ {
+ if(iSizeSrcMembersList != persAdmCfgGroupContentGetMembersList(hSrcGroupContentFile, pBufSrcMembersList, iSizeSrcMembersList))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ (void)persAdmCfgFileClose(hSrcGroupContentFile) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sint_t hDestGroupContentFile = persAdmCfgFileOpen(destGroupMembersFilePathname, PersAdminCfgFileType_GroupContent) ;
+ if(hDestGroupContentFile >= 0)
+ {
+ iSizeDestMembersList = persAdmCfgGroupContentGetSizeMembersList(hDestGroupContentFile) ;
+ if(iSizeDestMembersList > 0)
+ {
+ pBufDestMembersList = (pstr_t)malloc((size_t)iSizeDestMembersList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != pBufDestMembersList)
+ {
+ if(iSizeSrcMembersList != persAdmCfgGroupContentGetMembersList(hDestGroupContentFile, pBufDestMembersList, iSizeDestMembersList))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ (void)persAdmCfgFileClose(hDestGroupContentFile) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ /* We have the lists with old and new group members
+ * Identify the new members of the group and create the sym links */
+ bEverythingOK = pas_conf_identifyAndAddNewMembersToGroup(groupID, pBufSrcMembersList, iSizeSrcMembersList, pBufDestMembersList, iSizeDestMembersList) ;
+ }
+
+ if(bEverythingOK)
+ {
+ /* We have the lists with old and new group members
+ * Identify the obsolete members of the group and delete the sym links */
+ bEverythingOK = pas_conf_identifyAndRemoveObsoleteGroupMembers(groupID, pBufSrcMembersList, iSizeSrcMembersList, pBufDestMembersList, iSizeDestMembersList) ;
+ }
+
+ if(bEverythingOK && bSrcGroupContentFileExists)
+ {
+ /* keep a copy of the source groupContent file in the group's install folder
+ * In order to be able to get the group's members list easily (without scanning all the applications' folders)*/
+ sint_t iBytesCopied = persadmin_copy_file(srcGroupMembersFilePathname, destGroupMembersFilePathname) ;
+ if(iBytesCopied < 0)
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persadmin_copy_file(<%s>, <%s>) returned <%d>",
+ __FUNCTION__, srcGroupMembersFilePathname, destGroupMembersFilePathname, iBytesCopied) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(NIL != pBufSrcMembersList)
+ {
+ free(pBufSrcMembersList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+ if(NIL != pBufDestMembersList)
+ {
+ free(pBufDestMembersList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0016*/ /*DG C8ISQP-ISQP Metric 11-SSW_Administrator_0035*/
+
+/**
+ * \brief Make configurations (e.g. create sym-link) for the application that becomes member of the group
+ * \param groupID [in] group's name
+ * \param appName [in] application's name
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_addMemberToGroup(constpstr_t groupID, constpstr_t appName)
+{
+ bool_t bEverythingOK = true ;
+ str_t pathLink[PERSADMIN_MAX_PATH_LENGHT] ;
+ str_t pathTarget[PERSADMIN_MAX_PATH_LENGHT] ;
+
+ (void)snprintf(pathTarget, sizeof(pathTarget), "%s%s", PERS_ORG_SHARED_GROUP_WT_PATH_, groupID) ;
+ (void)snprintf(pathLink, sizeof(pathLink), "%s/%s/%s%s",
+ PERS_ORG_LOCAL_APP_WT_PATH, appName, PERS_ORG_SHARED_GROUP_SYMLINK_PREFIX, groupID);
+ if(0 > persadmin_create_symbolic_link(pathLink, pathTarget))
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persadmin_create_symbolic_link(<%s>, <%s>) %s",
+ __FUNCTION__, pathLink, pathTarget, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ return bEverythingOK ;
+}
+
+/**
+ * \brief Identifies the new members of the group and applies configurations (e.g. create sym-link)
+ * \param groupID [in] group's name
+ * \param pBufNewMembersList [in] buffer with '\0' separated new group's members
+ * \param iSizeNewList [in] sizeof pBufNewMembersList
+ * \param pBufOldMembersList [in] buffer with '\0' separated old group's members
+ * \param iSizeOldList [in] sizeof iSizeOldList
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_identifyAndAddNewMembersToGroup(constpstr_t groupID, constpstr_t pBufNewMembersList, sint_t iSizeNewList, constpstr_t pBufOldMembersList, sint_t iSizeOldList)
+{
+ bool_t bEverythingOK = true ;
+ sint_t iPosInSrcList = 0 ;
+ sint_t iPosInDestList = 0 ;
+ pstr_t oldAppName = NIL ;
+ pstr_t newAppName = NIL ;
+ bool_t bIsNewMember = false ;
+
+ while(bEverythingOK && (iPosInSrcList < iSizeNewList))
+ {
+ bIsNewMember = true ;
+ newAppName = pBufNewMembersList + iPosInSrcList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ iPosInDestList = 0 ;
+
+ while(iPosInDestList < iSizeOldList)
+ {
+ oldAppName = pBufOldMembersList + iPosInDestList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ iPosInDestList += ((sint_t)strlen(oldAppName) + 1) ; /* 1 <=> '\0' */
+ if(0 == strcmp(newAppName, oldAppName))
+ {
+ bIsNewMember = false ;
+ break ;
+ }
+ }
+
+ if(bIsNewMember)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - New member <<%s>> for group <<%s>>", __FUNCTION__, newAppName, groupID) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ bEverythingOK = pas_conf_addMemberToGroup(groupID, newAppName) ;
+ }
+ iPosInSrcList += ((sint_t)strlen(newAppName) + 1) ; /* 1 <=> '\0' */
+ }
+
+ return bEverythingOK ;
+}
+
+
+/**
+ * \brief Make configurations (e.g. delete sym-link) for all the applications that were members of the removed group
+ * \param groupID [in] group's name
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_removeGroupMembers(constpstr_t groupID)
+{
+ bool_t bEverythingOK = true ;
+ pstr_t pMembersList = NIL ;
+ sint_t iMemberListSize = 0 ;
+ str_t groupContentPathname[PERSADMIN_MAX_PATH_LENGHT] ;
+ sint_t hGroupContent = -1 ;
+
+ /* set path */
+ (void)snprintf(groupContentPathname, sizeof(groupContentPathname), "%s/%s/%s",
+ PERSADM_CFG_SOURCE_GROUPS_FOLDER_PATH,
+ groupID,
+ PERSADM_CFG_RESOURCE_GROUP_CONTENT_FILENAME) ;
+
+ /* get the list of existent group's members - first get size of the needed buffer */
+ if(persadmin_check_if_file_exists(groupContentPathname, false))
+ {
+ hGroupContent = persAdmCfgFileOpen(groupContentPathname, PersAdminCfgFileType_GroupContent) ;
+ if(hGroupContent >= 0)
+ {
+ iMemberListSize = persAdmCfgGroupContentGetSizeMembersList(hGroupContent) ;
+ if(iMemberListSize < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - <%s> does not exist", __FUNCTION__, groupContentPathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK && (iMemberListSize > 0))
+ {
+ /* get the list of existent group's members */
+ /* don't forget to free it */
+ pMembersList = (pstr_t)malloc((size_t)iMemberListSize) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != pMembersList)
+ {
+ if(iMemberListSize != persAdmCfgGroupContentGetMembersList(hGroupContent, pMembersList, iMemberListSize))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ if(bEverythingOK && (iMemberListSize > 0))
+ {
+ /* for each group's member in the list, remove the connections to group */
+ sint_t iPosInList = 0 ;
+ pstr_t pCurrentMember = NIL ;
+
+ while(bEverythingOK && (iPosInList < iMemberListSize))
+ {
+ pCurrentMember = pMembersList + iPosInList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ if( ! pas_conf_removeMemberFromGroup(groupID, pCurrentMember))
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_removeMemberFromGroup(<%s>, <%s>)...%s",
+ __FUNCTION__, groupID, pCurrentMember, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ iPosInList += ((sint_t)strlen(pCurrentMember) + 1) ; /* 1 <=> '\0' */
+ }
+ }
+
+ if(hGroupContent >= 0)
+ {
+ (void)persAdmCfgFileClose(hGroupContent) ;
+ }
+
+ if(NIL != pMembersList)
+ {
+ free(pMembersList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+/**
+ * \brief Make configurations (e.g. delete sym-link) for the application that is no longer member of the group
+ * \param groupID [in] group's name
+ * \param appID [in] application's name
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_removeMemberFromGroup(constpstr_t groupID, constpstr_t appID)
+{
+ bool_t bEverythingOK = true ;
+ str_t pathLink[PERSADMIN_MAX_PATH_LENGHT] ;
+
+ /* set path */
+ (void)snprintf(pathLink, sizeof(pathLink), "%s/%s/%s%s",
+ PERS_ORG_LOCAL_APP_WT_PATH, appID, PERS_ORG_SHARED_GROUP_SYMLINK_PREFIX, groupID);
+ if(persadmin_check_if_file_exists(pathLink, false))
+ {
+ if(! persadmin_delete_file(pathLink))
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - delete <%s> ... %s",
+ __FUNCTION__, pathLink, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+
+ return bEverythingOK ;
+}
+
+
+/**
+ * \brief Identifies the obsolete members of the group and applies configurations (e.g. delete sym-link)
+ * \param groupID [in] group's name
+ * \param pBufNewMembersList [in] buffer with '\0' separated new group's members
+ * \param iSizeNewList [in] sizeof pBufNewMembersList
+ * \param pBufOldMembersList [in] buffer with '\0' separated old group's members
+ * \param iSizeOldList [in] sizeof iSizeOldList
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_identifyAndRemoveObsoleteGroupMembers(constpstr_t groupID, constpstr_t pBufNewMembersList, sint_t iSizeNewList, constpstr_t pBufOldMembersList, sint_t iSizeOldList)
+{
+ bool_t bEverythingOK = true ;
+ sint_t iPosInSrcList = 0 ;
+ sint_t iPosInDestList = 0 ;
+ pstr_t oldAppName = NIL ;
+ pstr_t newAppName = NIL ;
+ bool_t bIsObsoleteMember = false ;
+
+ while(bEverythingOK && (iPosInDestList < iSizeOldList))
+ {
+ bIsObsoleteMember = true ;
+ oldAppName = pBufOldMembersList + iPosInDestList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ iPosInSrcList = 0 ;
+
+ while(iPosInSrcList < iSizeNewList)
+ {
+ newAppName = pBufNewMembersList + iPosInSrcList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ iPosInSrcList += ((sint_t)strlen(newAppName) + 1) ; /* 1 <=> '\0' */
+ if(0 == strcmp(newAppName, oldAppName))
+ {
+ bIsObsoleteMember = false ;
+ break ;
+ }
+ }
+
+ if(bIsObsoleteMember)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - Obsolete member <<%s>> for group <<%s>>", __FUNCTION__, oldAppName, groupID) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ bEverythingOK = pas_conf_removeMemberFromGroup(groupID, oldAppName) ;
+ }
+ iPosInDestList += ((sint_t)strlen(oldAppName) + 1) ; /* 1 <=> '\0' */
+ }
+
+ return bEverythingOK ;
+}
+
+/**
+ * \brief Remove data for groupID
+ * \param groupID [in] group's name
+ * \param bPrepareForNewInstall [in] if true, the group's folder is cleaned, other way it is removed
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_removeDataForGroup(constpstr_t groupID, bool_t bPrepareForNewInstall)
+{
+ bool_t bEverythingOK = true ;
+ str_t folderPathName[PERSADMIN_MAX_PATH_LENGHT] ;
+
+ /* set path */
+ (void)snprintf(folderPathName, sizeof(folderPathName), "%s%s", PERS_ORG_SHARED_GROUP_WT_PATH_, groupID) ;
+
+ if(0 <= persadmin_check_if_file_exists(folderPathName, true))
+ {
+ if(bPrepareForNewInstall)
+ {
+ /* delete the content of group folder, but keep the folder */
+ if( ! pas_conf_deleteFolderContent(folderPathName, PersadminFilterAll))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ /* delete "group" folder */
+ if(0 > persadmin_delete_folder(folderPathName))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ if( ! pas_conf_removeGroupMembers(groupID))
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+/**
+ * \brief Check the validity of the group's name
+ * \param groupID [in] group's name
+ * \return true is group's name is valid, false other way
+ */
+static bool_t pas_conf_isGroupIdValid(constpstr_t groupID)
+{
+ bool_t bEverythingOK = true ;
+ sint_t iGroupID = 0 ;
+
+ /* check the validity of the group name (2 digits hex value < 0x80) */
+ if(2 == strlen(groupID))
+ {
+ if(1 == sscanf(groupID, "%X", &iGroupID))
+ {
+ if((iGroupID < 0) || (iGroupID >= 0x80))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+
+ if(! bEverythingOK)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - invalid group ID : <<%s>>", __FUNCTION__, groupID) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ return bEverythingOK ;
+}
+
+/*****************************************************************************************************************
+****************************** Application data related *********************************************************
+*****************************************************************************************************************/
+
+/**
+ * \brief Apply configuration for applications's data
+ * \param none
+ * \return the number of installed resources, or negative value for error
+ */
+static sint_t pas_conf_configureDataForApplications(void)
+{
+ bool_t bEverythingOK = true ;
+ sint_t errorCode = PAS_FAILURE ;
+ sint_t iNoOfInstalledResources = 0 ;
+ PersAdminCfgInstallRules_e eRule ;
+ pstr_t bufferInstallRules = NIL ;
+ sint_t iSizeBufInstallRules = 0 ;
+ pstr_t pInstallRulesPathname = PERSADM_CFG_SOURCE_APPS_FOLDER_PATH"/"PERSADM_CFG_RESOURCE_INSTALL_RULES_FILENAME ;
+ sint_t hRules = -1 ;
+
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - started...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ hRules = persAdmCfgFileOpen(pInstallRulesPathname, PersAdminCfgFileType_InstallRules) ;
+
+ if(hRules < 0)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgFileOpen(%s) Failed err=%d", __FUNCTION__, pInstallRulesPathname, hRules) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ /* get the list of install rules for apps */
+ iSizeBufInstallRules = persAdmCfgRulesGetSizeFoldersList(hRules) ;
+ if(iSizeBufInstallRules > 0)
+ {
+ bufferInstallRules = (pstr_t)malloc((size_t)iSizeBufInstallRules) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != bufferInstallRules)
+ {
+ sint_t iErrLocal = persAdmCfgRulesGetFoldersList(hRules, bufferInstallRules, iSizeBufInstallRules) ;
+ if(iErrLocal != iSizeBufInstallRules)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgRulesGetFoldersList returned %d (expected %d)",
+ __FUNCTION__, iErrLocal, iSizeBufInstallRules) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ if(iSizeBufInstallRules < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgRulesGetSizeFoldersList returned %d", __FUNCTION__, iSizeBufInstallRules) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ /* for each application, apply configuration */
+ pstr_t currentApp = NIL ;
+ sint_t iPosInBuffer = 0 ;
+
+ while(bEverythingOK && (iPosInBuffer < iSizeBufInstallRules))
+ {
+ sint_t errorLocal ;
+ currentApp = bufferInstallRules + iPosInBuffer ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - Start configuration for app <<%s>>", __FUNCTION__, currentApp) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ errorLocal = persAdmCfgRulesGetRuleForFolder(hRules, currentApp, &eRule) ;
+ if(errorLocal >= 0)
+ {
+ if(PersAdminCfgInstallRules_DontTouch != eRule)
+ {
+ sint_t iNoOfResourcesInstalledForApp = pas_conf_configureDataForApp(currentApp, eRule) ;
+ if(iNoOfResourcesInstalledForApp >= 0)
+ {
+ iNoOfInstalledResources += iNoOfResourcesInstalledForApp ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureDataForApp(%s) returned %d",
+ __FUNCTION__, currentApp, iNoOfResourcesInstalledForApp) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - No configuration needed for app <<%s>>", __FUNCTION__, currentApp) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ iPosInBuffer += ((sint_t)strlen(currentApp) + 1) ; /* 1 <=> '\0'*/
+ }
+
+ }
+
+ if(NIL != bufferInstallRules)
+ {
+ free(bufferInstallRules) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+
+ if(hRules >= 0)
+ {
+ (void)persAdmCfgFileClose(hRules) ;
+ }
+
+ return (bEverythingOK ? iNoOfInstalledResources : errorCode) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 1-SSW_Administrator_0017*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0018*/ /*DG C8ISQP-ISQP Metric 11-SSW_Administrator_0019*/
+
+
+/**
+ * \brief Apply configuration for one application
+ * \param appID [in] application's name
+ * \param eInstallRule [in] install rule for the application
+ * \return the number of installed resources, or negative value for error
+ */
+static sint_t pas_conf_configureDataForApp(constpstr_t appID, PersAdminCfgInstallRules_e eInstallRule)
+{
+ bool_t bEverythingOK = true ;
+ sint_t errorCode = PAS_FAILURE ;
+ sint_t iNoOfInstalledResources = 0 ;
+ pas_cfg_instFoldCtx_s sContext = {0} ;
+ str_t destInstallFolder[PERSADMIN_MAX_PATH_LENGHT] ;
+ str_t srcInstallFolder[PERSADMIN_MAX_PATH_LENGHT] ;
+
+ /* retrigger watchdog */
+ persadmin_RetriggerWatchdog();
+
+ if( (PersAdminCfgInstallRules_Uninstall == eInstallRule)
+ || (PersAdminCfgInstallRules_NewInstall == eInstallRule))
+ {
+ /* clear/remove the application's folder */
+ bool_t bPrepareForNewInstall = (PersAdminCfgInstallRules_NewInstall == eInstallRule) ;
+ if( ! pas_conf_removeDataForApp(appID, bPrepareForNewInstall))
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_removeDataForApp(%s, %d)...%s",
+ __FUNCTION__, appID, bPrepareForNewInstall, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK && (PersAdminCfgInstallRules_Uninstall != eInstallRule))
+ {
+ sContext.eInstallRule = eInstallRule ;
+
+ /* set paths */
+ (void)snprintf(destInstallFolder, sizeof(destInstallFolder), "%s/%s",
+ PERS_ORG_LOCAL_APP_WT_PATH, appID) ;
+ (void)snprintf(srcInstallFolder, sizeof(destInstallFolder), "%s/%s",
+ PERSADM_CFG_SOURCE_APPS_FOLDER_PATH, appID) ;
+
+ if(0 > persadmin_check_if_file_exists(destInstallFolder, true))
+ {
+ if(0 > persadmin_create_folder(destInstallFolder))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK && (PersAdminCfgInstallRules_Uninstall != eInstallRule))
+ {
+ if( ! pas_conf_getContextInstallFolder(destInstallFolder, srcInstallFolder, &sContext))
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_getContextInstallFolder FAILED", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK && (PersAdminCfgInstallRules_Uninstall != eInstallRule))
+ {
+ /* create symlink to public folder - if not already available */
+ str_t pathLink[PERSADMIN_MAX_PATH_LENGHT] ;
+
+ (void)snprintf(pathLink, sizeof(pathLink), "%s/%s",
+ destInstallFolder, PERS_ORG_SHARED_PUBLIC_SYMLINK_NAME);
+ if(0 > persadmin_check_if_file_exists(pathLink, false))
+ {
+ /* symlink does not exist */
+ if(0 > persadmin_create_symbolic_link(pathLink, PERS_ORG_SHARED_PUBLIC_WT_PATH))
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persadmin_create_symbolic_link(<%s>, <%s>) %s",
+ __FUNCTION__, pathLink, PERS_ORG_SHARED_PUBLIC_WT_PATH, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK && (PersAdminCfgInstallRules_Uninstall != eInstallRule))
+ {
+ iNoOfInstalledResources = pas_conf_configureDataForInstallFolder(&sContext) ;
+ if(iNoOfInstalledResources >= 0)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureDataForInstallFolder returned %d", __FUNCTION__, iNoOfInstalledResources) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ errorCode = iNoOfInstalledResources ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureDataForInstallFolder FAILED err=%d", __FUNCTION__, errorCode) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if( ! pas_conf_destroyContextInstallFolder(&sContext))
+ {
+ bEverythingOK = false ;
+ }
+
+ return (bEverythingOK ? iNoOfInstalledResources : errorCode) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0020*/
+
+/**
+ * \brief Remove data for one application
+ * \param appID [in] application's name
+ * \param bPrepareForNewInstall [in] if true, the application's folder is cleaned, other way it is removed
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_removeDataForApp(constpstr_t appID, bool_t bPrepareForNewInstall)
+{
+ bool_t bEverythingOK = true ;
+ str_t appFolderPathname[PERSADMIN_MAX_PATH_LENGHT] ;
+
+ /* set path */
+ (void)snprintf(appFolderPathname, sizeof(appFolderPathname), "%s%s", PERS_ORG_LOCAL_APP_WT_PATH_, appID) ;
+
+ if(0 <= persadmin_check_if_file_exists(appFolderPathname, true))
+ {
+ if(bPrepareForNewInstall)
+ {
+ /* delete the content of the folder(don't delete sym-links), but keep the folder */
+ if( ! pas_conf_deleteFolderContent(appFolderPathname, PersadminFilterFoldersAndRegularFiles))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ /* delete "public" folder */
+ if(0 > persadmin_delete_folder(appFolderPathname))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+
+/*****************************************************************************************************************
+****************************** Folder (public, group, app) data related *****************************************
+*****************************************************************************************************************/
+
+/**
+ * \brief Get the context for the public/group/app's install folder
+ * \param destInstallFolder [in] pathname for the destination(install) folder
+ * \param srcInstallFolder [in] pathname for the source(configuration input) folder
+ * \param psInstallFolderCtx_inout [inout] pointer to the public/group/app's context
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_getContextInstallFolder(constpstr_t destInstallFolder, constpstr_t srcInstallFolder, pas_cfg_instFoldCtx_s* psInstallFolderCtx_inout)
+{
+ bool_t bEverythingOK = true ;
+ size_t iIndex = 0 ;
+
+ /*---------------------------------------------------------------------------------------------------------
+ get context for destination folder
+ ---------------------------------------------------------------------------------------------------------*/
+ (void)snprintf( psInstallFolderCtx_inout->sDestContext.sInstallFolder.pathname,
+ sizeof(psInstallFolderCtx_inout->sDestContext.sInstallFolder.pathname),
+ "%s", destInstallFolder) ;
+
+ (void)snprintf(psInstallFolderCtx_inout->sDestContext.sRctDB.pathname,
+ sizeof(psInstallFolderCtx_inout->sDestContext.sRctDB.pathname),
+ "%s/%s", destInstallFolder, PERS_ORG_RCT_NAME) ;
+ psInstallFolderCtx_inout->sDestContext.sRctDB.handler = persComRctOpen(psInstallFolderCtx_inout->sDestContext.sRctDB.pathname, true) ;
+ if(psInstallFolderCtx_inout->sDestContext.sRctDB.handler >= 0)
+ {
+ psInstallFolderCtx_inout->sDestContext.sRctDB.bIsAvailable = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persComRctOpen(%s) returned <%d>",
+ __FUNCTION__, psInstallFolderCtx_inout->sDestContext.sRctDB.pathname, psInstallFolderCtx_inout->sDestContext.sRctDB.handler) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ if(bEverythingOK)
+ {
+ /* table with the files/folders to be checked in the destination folder */
+ pas_conf_helpDestContextEntry_s tab_sDestLocalDBsInfo[] =
+ {
+ {false, NIL, /* &psInstallFolderCtx_inout->sDestContext.sCachedDB*/ PERS_ORG_LOCAL_CACHE_DB_NAME},
+ {false, NIL, /* &psInstallFolderCtx_inout->sDestContext.sWtDB*/ PERS_ORG_LOCAL_WT_DB_NAME},
+ {false, NIL, /* &psInstallFolderCtx_inout->sDestContext.sFactoryDefaultDB*/ PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME},
+ {false, NIL, /* &psInstallFolderCtx_inout->sDestContext.sConfigurableDefaultDB*/ PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME}
+ } ;
+ tab_sDestLocalDBsInfo[0].psFileAvailability = &psInstallFolderCtx_inout->sDestContext.sCachedDB ;
+ tab_sDestLocalDBsInfo[1].psFileAvailability = &psInstallFolderCtx_inout->sDestContext.sWtDB ;
+ tab_sDestLocalDBsInfo[2].psFileAvailability = &psInstallFolderCtx_inout->sDestContext.sFactoryDefaultDB ;
+ tab_sDestLocalDBsInfo[3].psFileAvailability = &psInstallFolderCtx_inout->sDestContext.sConfigurableDefaultDB ;
+
+ for(iIndex = 0 ; bEverythingOK && (iIndex < sizeof(tab_sDestLocalDBsInfo)/sizeof(tab_sDestLocalDBsInfo[0])) ; iIndex++)
+ {
+ (void)snprintf( tab_sDestLocalDBsInfo[iIndex].psFileAvailability->pathname,
+ sizeof(tab_sDestLocalDBsInfo[iIndex].psFileAvailability->pathname),
+ "%s/%s", destInstallFolder, tab_sDestLocalDBsInfo[iIndex].filename) ;
+ tab_sDestLocalDBsInfo[iIndex].psFileAvailability->handler = persComDbOpen(tab_sDestLocalDBsInfo[iIndex].psFileAvailability->pathname, true) ;
+ if(tab_sDestLocalDBsInfo[iIndex].psFileAvailability->handler >= 0)
+ {
+ tab_sDestLocalDBsInfo[iIndex].psFileAvailability->bIsAvailable = true ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persComDbOpen(%s) returned <%d>",
+ __FUNCTION__, tab_sDestLocalDBsInfo[iIndex].psFileAvailability->pathname, tab_sDestLocalDBsInfo[iIndex].psFileAvailability->handler) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ /*---------------------------------------------------------------------------------------------------------
+ get context for source folders
+ ---------------------------------------------------------------------------------------------------------*/
+ if(bEverythingOK)
+ {
+ /* table with the folders to be checked in the source folder */
+ pas_conf_helpSrcContextEntry_s tab_sSrcContextEntries[] =
+ {
+ {true, NIL, /* &psInstallFolderCtx_inout->sSrcContext.sInstallFolder*/
+ "", PersAdminCfgFileType_LastEntry, true},
+ {true, NIL, /* &psInstallFolderCtx_inout->sSrcContext.sFiledataFolder*/
+ "/"PERSADM_CFG_RESOURCE_ROOT_FILEDATA_FOLDER_NAME, PersAdminCfgFileType_LastEntry, true},
+ {true, NIL, /* &psInstallFolderCtx_inout->sSrcContext.sKeydataFolder*/
+ "/"PERSADM_CFG_RESOURCE_ROOT_KEYDATA_FOLDER_NAME, PersAdminCfgFileType_LastEntry, true}
+ };
+ tab_sSrcContextEntries[0].psFileAvailability = &psInstallFolderCtx_inout->sSrcContext.sInstallFolder ;
+ tab_sSrcContextEntries[1].psFileAvailability = &psInstallFolderCtx_inout->sSrcContext.sFiledataFolder ;
+ tab_sSrcContextEntries[2].psFileAvailability = &psInstallFolderCtx_inout->sSrcContext.sKeydataFolder ;
+
+ for(iIndex = 0 ; bEverythingOK && (iIndex < sizeof(tab_sSrcContextEntries)/sizeof(tab_sSrcContextEntries[0])) ; iIndex++)
+ {
+ (void)snprintf( tab_sSrcContextEntries[iIndex].psFileAvailability->pathname,
+ sizeof(tab_sSrcContextEntries[iIndex].psFileAvailability->pathname),
+ "%s%s", srcInstallFolder, tab_sSrcContextEntries[iIndex].filename) ;
+ if(0 <= persadmin_check_if_file_exists(tab_sSrcContextEntries[iIndex].psFileAvailability->pathname, tab_sSrcContextEntries[iIndex].bIsFolder))
+ {
+ tab_sSrcContextEntries[iIndex].psFileAvailability->bIsAvailable = true ;
+ }
+ else
+ {
+ tab_sSrcContextEntries[iIndex].psFileAvailability->bIsAvailable = false ;
+ if(tab_sSrcContextEntries[iIndex].bPresenceIsMandatory)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - %s <<%s>>", __FUNCTION__,
+ tab_sSrcContextEntries[iIndex].psFileAvailability->bIsAvailable ? "Found" : "Not found",
+ tab_sSrcContextEntries[iIndex].psFileAvailability->pathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ /* table with the files to be checked in the source folder */
+ pas_conf_helpSrcContextEntry_s tab_sSrcContextEntries[] =
+ {
+ {false, NIL,/* &psInstallFolderCtx_inout->sSrcContext.sRctFile */
+ PERSADM_CFG_RESOURCE_RCT_FILENAME, PersAdminCfgFileType_RCT, true},
+ {false, NIL,/* &psInstallFolderCtx_inout->sSrcContext.sFactoryDefaultDataFile */
+ PERSADM_CFG_RESOURCE_ROOT_KEYDATA_FOLDER_NAME"/"PERSADM_CFG_RESOURCE_FACTORY_DEFAULT_KEYDATA_FILENAME, PersAdminCfgFileType_Database, true},
+ {false, NIL,/* &psInstallFolderCtx_inout->sSrcContext.sConfigurableDefaultDataFile */
+ PERSADM_CFG_RESOURCE_ROOT_KEYDATA_FOLDER_NAME"/"PERSADM_CFG_RESOURCE_CONFIG_KEYDEFAULT_DATA_FILENAME, PersAdminCfgFileType_Database, true},
+ {false, NIL,/* &psInstallFolderCtx_inout->sSrcContext.sInitialDataFile */
+ PERSADM_CFG_RESOURCE_ROOT_KEYDATA_FOLDER_NAME"/"PERSADM_CFG_RESOURCE_NON_DEFAULT_KEYDATA_FILENAME, PersAdminCfgFileType_Database, false},
+ {false, NIL,/* &psInstallFolderCtx_inout->sSrcContext.sExceptionsFile */
+ PERSADM_CFG_RESOURCE_INSTALL_EXCEPTIONS_FILENAME, PersAdminCfgFileType_InstallExceptions, true}
+ } ;
+ /* initialize here to please SCC */
+ tab_sSrcContextEntries[0].psFileAvailability = &psInstallFolderCtx_inout->sSrcContext.sRctFile ;
+ tab_sSrcContextEntries[1].psFileAvailability = &psInstallFolderCtx_inout->sSrcContext.sFactoryDefaultDataFile ;
+ tab_sSrcContextEntries[2].psFileAvailability = &psInstallFolderCtx_inout->sSrcContext.sConfigurableDefaultDataFile ;
+ tab_sSrcContextEntries[3].psFileAvailability = &psInstallFolderCtx_inout->sSrcContext.sInitialDataFile ;
+ tab_sSrcContextEntries[4].psFileAvailability = &psInstallFolderCtx_inout->sSrcContext.sExceptionsFile ;
+
+ for(iIndex = 0 ; bEverythingOK && (iIndex < sizeof(tab_sSrcContextEntries)/sizeof(tab_sSrcContextEntries[0])) ; iIndex++)
+ {
+ (void)snprintf( tab_sSrcContextEntries[iIndex].psFileAvailability->pathname,
+ sizeof(tab_sSrcContextEntries[iIndex].psFileAvailability->pathname),
+ "%s/%s", srcInstallFolder, tab_sSrcContextEntries[iIndex].filename) ;
+ if(0 <= persadmin_check_if_file_exists(tab_sSrcContextEntries[iIndex].psFileAvailability->pathname, tab_sSrcContextEntries[iIndex].bIsFolder))
+ {
+ tab_sSrcContextEntries[iIndex].psFileAvailability->bIsAvailable = true ;
+ tab_sSrcContextEntries[iIndex].psFileAvailability->handler =
+ persAdmCfgFileOpen(tab_sSrcContextEntries[iIndex].psFileAvailability->pathname, tab_sSrcContextEntries[iIndex].eCfgFileType) ;
+ if(tab_sSrcContextEntries[iIndex].psFileAvailability->handler < 0)
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgFileOpen(<%s>, %d) returned <%d>",
+ __FUNCTION__, tab_sSrcContextEntries[iIndex].psFileAvailability->pathname,
+ tab_sSrcContextEntries[iIndex].eCfgFileType, tab_sSrcContextEntries[iIndex].psFileAvailability->handler) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ tab_sSrcContextEntries[iIndex].psFileAvailability->bIsAvailable = false ;
+ tab_sSrcContextEntries[iIndex].psFileAvailability->handler = -1 ;
+ if(tab_sSrcContextEntries[iIndex].bPresenceIsMandatory)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - %s <<%s>>", __FUNCTION__,
+ tab_sSrcContextEntries[iIndex].psFileAvailability->bIsAvailable ? "Found" : "Not found",
+ tab_sSrcContextEntries[iIndex].filename) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ }
+
+ /*---------------------------------------------------------------------------------------------------------
+ create lists
+ ---------------------------------------------------------------------------------------------------------*/
+ if(bEverythingOK)
+ {
+ bEverythingOK = pas_conf_createListsForInstallFolder(psInstallFolderCtx_inout);
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - create lists... %s",
+ __FUNCTION__, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 1-SSW_Administrator_0021*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0022*/
+
+/**
+ * \brief Close handlers, free dynamicaly allocated memory for the public/group/app's context
+ * \param psInstallFolderCtx_inout [inout] pointer to the public/group/app's context
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_destroyContextInstallFolder(pas_cfg_instFoldCtx_s* psInstallFolderCtx_inout)
+{
+ bool_t bEverythingOK = true ;
+ size_t iIndex = 0 ;
+ sint_t* tab_pDestHandlers[] =
+ {
+ NIL,/* &(psInstallFolderCtx_inout->sDestContext.sCachedDB.handler) */
+ NIL,/* &(psInstallFolderCtx_inout->sDestContext.sWtDB.handler) */
+ NIL,/* &(psInstallFolderCtx_inout->sDestContext.sFactoryDefaultDB.handler) */
+ NIL,/* &(psInstallFolderCtx_inout->sDestContext.sConfigurableDefaultDB.handler) */
+ } ;
+
+ sint_t* tab_pSrcHandlers[] =
+ {
+ NIL,/* &(psInstallFolderCtx_inout->sSrcContext.sRctFile.handler) */
+ NIL,/* &(psInstallFolderCtx_inout->sSrcContext.sFactoryDefaultDataFile.handler) */
+ NIL,/* &(psInstallFolderCtx_inout->sSrcContext.sConfigurableDefaultDataFile.handler) */
+ NIL,/* &(psInstallFolderCtx_inout->sSrcContext.sInitialDataFile.handler) */
+ NIL,/* &(psInstallFolderCtx_inout->sSrcContext.sExceptionsFile.handler) */
+ } ;
+
+ /* initialize here to please SCC */
+ tab_pDestHandlers[0] = &(psInstallFolderCtx_inout->sDestContext.sCachedDB.handler) ;
+ tab_pDestHandlers[1] = &(psInstallFolderCtx_inout->sDestContext.sWtDB.handler) ;
+ tab_pDestHandlers[2] = &(psInstallFolderCtx_inout->sDestContext.sFactoryDefaultDB.handler) ;
+ tab_pDestHandlers[3] = &(psInstallFolderCtx_inout->sDestContext.sConfigurableDefaultDB.handler) ;
+
+ /* initialize here to please SCC */
+ tab_pSrcHandlers[0] = &(psInstallFolderCtx_inout->sSrcContext.sRctFile.handler) ;
+ tab_pSrcHandlers[1] = &(psInstallFolderCtx_inout->sSrcContext.sFactoryDefaultDataFile.handler) ;
+ tab_pSrcHandlers[2] = &(psInstallFolderCtx_inout->sSrcContext.sConfigurableDefaultDataFile.handler) ;
+ tab_pSrcHandlers[3] = &(psInstallFolderCtx_inout->sSrcContext.sInitialDataFile.handler) ;
+ tab_pSrcHandlers[4] = &(psInstallFolderCtx_inout->sSrcContext.sExceptionsFile.handler) ;
+
+ /* close destination handlers */
+ if(psInstallFolderCtx_inout->sDestContext.sRctDB.handler >= 0)
+ {
+ (void)persComRctClose(psInstallFolderCtx_inout->sDestContext.sRctDB.handler) ;
+ psInstallFolderCtx_inout->sDestContext.sRctDB.handler = -1 ;
+ }
+
+ for(iIndex = 0 ; iIndex < sizeof(tab_pDestHandlers)/sizeof(tab_pDestHandlers[0]) ; iIndex++)
+ {
+ if(*tab_pDestHandlers[iIndex] >= 0)
+ {
+ (void)persComDbClose(*tab_pDestHandlers[iIndex]) ;
+ *tab_pDestHandlers[iIndex] = -1 ;
+ }
+ }
+
+ /* close source handlers */
+ for(iIndex = 0 ; iIndex < sizeof(tab_pSrcHandlers)/sizeof(tab_pSrcHandlers[0]) ; iIndex++)
+ {
+ if(*tab_pSrcHandlers[iIndex] >= 0)
+ {
+ (void)persAdmCfgFileClose(*tab_pSrcHandlers[iIndex]) ;
+ *tab_pSrcHandlers[iIndex] = -1 ;
+ }
+ }
+
+ /* distroy lists */
+ bEverythingOK = pas_conf_destroyListsForInstallFolder(psInstallFolderCtx_inout) ;
+
+ return bEverythingOK ;
+}
+
+
+/**
+ * \brief Apply configuration for public/group/app's folder
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \return number of installed resources, or negative value for error
+ */
+static sint_t pas_conf_configureDataForInstallFolder(pas_cfg_instFoldCtx_s* const psInstallFolderCtx)
+{
+ bool_t bEverythingOK = true ;
+ sint_t errorCode = PAS_FAILURE ;
+ sint_t iNoOfInstalledResources = 0 ;
+ sint_t iNoOfInstalledResourcesPartial = 0 ;
+
+ /* first un-install data for the resources no longer present in the source RCT */
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - process obsolete resources ...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ iNoOfInstalledResourcesPartial = pas_conf_uninstallObsoleteDataForInstallFolder(psInstallFolderCtx) ;
+ if(iNoOfInstalledResourcesPartial >= 0)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - Un-installed <%d> obsolete resources",
+ __FUNCTION__, iNoOfInstalledResourcesPartial) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - process obsolete resources ... %s",
+ __FUNCTION__, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+
+ /* then process eventual policy changes */
+ if(bEverythingOK)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - process policy changes...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ iNoOfInstalledResourcesPartial = pas_conf_processPolicyChangesForInstallFolder(psInstallFolderCtx) ;
+ if(iNoOfInstalledResourcesPartial >= 0)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - Changed policy for <%d> resources",
+ __FUNCTION__, iNoOfInstalledResourcesPartial) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - process policy changes ... %s",
+ __FUNCTION__, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ /* Configuration for factory-default data (if affected by the install rule) */
+ if(bEverythingOK && (g_LookUpRules[psInstallFolderCtx->eInstallRule].affectedDataLookUp[pas_cfg_dataTypes_DefaultFactory]))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - start configuration of factory default data...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ iNoOfInstalledResourcesPartial = pas_conf_configureForDefault(psInstallFolderCtx, true) ;
+ if(iNoOfInstalledResourcesPartial >= 0)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureForDefault(factory) returned %d", __FUNCTION__, iNoOfInstalledResources) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureForDefault(factory) FAILED", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - skip configuration of factory default data...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ /* Configuration for configurable-default data (if affected by the install rule) */
+ if(bEverythingOK && (g_LookUpRules[psInstallFolderCtx->eInstallRule].affectedDataLookUp[pas_cfg_dataTypes_DefaultConfigurable]))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - start configuration of configurable default data...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ iNoOfInstalledResourcesPartial = pas_conf_configureForDefault(psInstallFolderCtx, false) ;
+ if(iNoOfInstalledResourcesPartial >= 0)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureForDefault(configurable) returned %d", __FUNCTION__, iNoOfInstalledResources) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureForDefault(configurable) FAILED", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - skip configuration of configurable default data...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ /* Configuration for non-default data (if affected by the install rule) */
+ if(bEverythingOK && (g_LookUpRules[psInstallFolderCtx->eInstallRule].affectedDataLookUp[pas_cfg_dataTypes_NonDefault]))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - start configuration of normal data...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ iNoOfInstalledResourcesPartial = pas_conf_configureForNonDefault(psInstallFolderCtx) ;
+ if(iNoOfInstalledResourcesPartial >= 0)
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureForNonDefault returned %d", __FUNCTION__, iNoOfInstalledResources) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_configureForNonDefault FAILED", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - skip configuration of normal data...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ /* update local RCT - to mirror the source RCT */
+ sint_t iNoOfUpdatesInRct = pas_conf_updateRctForInstallFolder(psInstallFolderCtx) ;
+ if(iNoOfUpdatesInRct >= 0)
+ {
+ iNoOfInstalledResources = iNoOfUpdatesInRct ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_updateRctForInstallFolder returned <%d>", __FUNCTION__, iNoOfUpdatesInRct) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ return (bEverythingOK ? iNoOfInstalledResources : errorCode) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 1-SSW_Administrator_0023*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0024*/
+
+/**
+ * \brief Create (allocate and fill) the lists in pas_conf_listsForInstallFolder_s
+ * \param psInstallFolderCtx_inout [inout] pointer to the public/group/app's context
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_createListsForInstallFolder( pas_cfg_instFoldCtx_s* psInstallFolderCtx_inout)
+{
+ bool_t bEverythingOK = true ;
+
+ if( ! psInstallFolderCtx_inout->sSrcContext.sRctFile.bIsAvailable)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - %s NOT available",
+ __FUNCTION__, psInstallFolderCtx_inout->sSrcContext.sRctFile.pathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList = persAdmCfgRctGetSizeResourcesList(psInstallFolderCtx_inout->sSrcContext.sRctFile.handler) ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgRctGetSizeResourcesList(hSrcRct) returned %d",
+ __FUNCTION__, psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList > 0)
+ {
+ psInstallFolderCtx_inout->sLists.sSrcRCT.pList = (pstr_t)malloc((size_t)psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != psInstallFolderCtx_inout->sLists.sSrcRCT.pList)
+ {
+ sint_t iErrLocal = persAdmCfgRctGetResourcesList( psInstallFolderCtx_inout->sSrcContext.sRctFile.handler,
+ psInstallFolderCtx_inout->sLists.sSrcRCT.pList,
+ psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList) ;
+ if(iErrLocal != psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgRctGetResourcesList returned %d (expected %d)",
+ __FUNCTION__, iErrLocal, psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ if(psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList < 0)
+ {/* size of 0 is not an error (even if not much sense to have an empty RCT) */
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList = persComRctGetSizeResourcesList(psInstallFolderCtx_inout->sDestContext.sRctDB.handler) ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persComRctGetSizeResourcesList(hDestRctDB) returned %d",
+ __FUNCTION__, psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList > 0)
+ {
+ psInstallFolderCtx_inout->sLists.sDestRCT.pList = (pstr_t)malloc((size_t)psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != psInstallFolderCtx_inout->sLists.sDestRCT.pList)
+ {
+ sint_t iErrLocal = persComRctGetResourcesList( psInstallFolderCtx_inout->sDestContext.sRctDB.handler,
+ psInstallFolderCtx_inout->sLists.sDestRCT.pList,
+ psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList) ;
+ if(iErrLocal != psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persComRctGetResourcesList returned %d (expected %d)",
+ __FUNCTION__, iErrLocal, psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ /* size of 0 is not an error (even if it would be strange) */
+ if(psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ /* create the list of obsolete resources */
+ if(psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList > 0)
+ {
+ psInstallFolderCtx_inout->sLists.sObsoleteResources.sizeOfList = 0 ;
+ psInstallFolderCtx_inout->sLists.sObsoleteResources.pList =
+ (pstr_t)malloc((size_t)psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != psInstallFolderCtx_inout->sLists.sObsoleteResources.pList)
+ {
+ sint_t iPosInDestList = 0 ;
+ sint_t iPosInSrcList = 0 ;
+ sint_t iPosInObsoleteList = 0 ;
+ pstr_t pCurrentDestResource = NIL ;
+ pstr_t pCurrentSrcResource = NIL ;
+ while(bEverythingOK && (iPosInDestList < psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList))
+ {
+ bool_t bCurrentResourceIsObsolete = true ;
+ iPosInSrcList = 0 ;
+ pCurrentDestResource = psInstallFolderCtx_inout->sLists.sDestRCT.pList + iPosInDestList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ /* search the resource in the new(source) list */
+ while(iPosInSrcList < psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList)
+ {
+ pCurrentSrcResource = psInstallFolderCtx_inout->sLists.sSrcRCT.pList + iPosInSrcList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ iPosInSrcList+= ((sint_t)strlen(pCurrentSrcResource) + 1) ; /* 1 <=> '\0' */
+
+ if(0 == strcmp(pCurrentDestResource, pCurrentSrcResource))
+ {
+ /* not obsolete resources */
+ bCurrentResourceIsObsolete = false ;
+ break ;
+ }
+ }
+
+ if(bCurrentResourceIsObsolete)
+ {
+ (void)strcpy(psInstallFolderCtx_inout->sLists.sObsoleteResources.pList+iPosInObsoleteList, pCurrentDestResource) ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ psInstallFolderCtx_inout->sLists.sObsoleteResources.sizeOfList+= ((sint_t)strlen(pCurrentDestResource) + 1) ; /* 1 <=> '\0' */
+ iPosInObsoleteList = psInstallFolderCtx_inout->sLists.sObsoleteResources.sizeOfList ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - obsolete resource <<%s>> list(size=%d, pos=%d)",
+ __FUNCTION__, pCurrentDestResource,
+ psInstallFolderCtx_inout->sLists.sObsoleteResources.sizeOfList, iPosInObsoleteList) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ iPosInDestList+= ((sint_t)strlen(pCurrentDestResource) + 1) ; /* 1 <=> '\0' */
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ /* no old resources => no obsolete resources */
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - No obsolete resources...", __FUNCTION__) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ psInstallFolderCtx_inout->sLists.sObsoleteResources.sizeOfList = 0 ;
+ psInstallFolderCtx_inout->sLists.sObsoleteResources.pList = NIL ;
+ }
+ }
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 1-SSW_Administrator_0025*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0026*/ /*DG C8ISQP-ISQP Metric 11-SSW_Administrator_0027*/
+
+/**
+ * \brief Distroy (de-allocate) the lists previously created by pas_conf_createListsForInstallFolder
+ * \param psInstallFolderCtx_inout [inout] pointer to the public/group/app's context
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_destroyListsForInstallFolder(pas_cfg_instFoldCtx_s* psInstallFolderCtx_inout)
+{
+ if( (psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList >= 0)
+ && (NIL != psInstallFolderCtx_inout->sLists.sSrcRCT.pList))
+ {
+ free(psInstallFolderCtx_inout->sLists.sSrcRCT.pList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ psInstallFolderCtx_inout->sLists.sSrcRCT.pList = NIL ;
+ psInstallFolderCtx_inout->sLists.sSrcRCT.sizeOfList = 0 ;
+ }
+
+ if( (psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList >= 0)
+ && (NIL != psInstallFolderCtx_inout->sLists.sDestRCT.pList))
+ {
+ free(psInstallFolderCtx_inout->sLists.sDestRCT.pList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ psInstallFolderCtx_inout->sLists.sDestRCT.pList = NIL ;
+ psInstallFolderCtx_inout->sLists.sDestRCT.sizeOfList = 0 ;
+ }
+
+ if( (psInstallFolderCtx_inout->sLists.sObsoleteResources.sizeOfList >= 0)
+ && (NIL != psInstallFolderCtx_inout->sLists.sObsoleteResources.pList))
+ {
+ free(psInstallFolderCtx_inout->sLists.sObsoleteResources.pList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ psInstallFolderCtx_inout->sLists.sObsoleteResources.pList = NIL ;
+ psInstallFolderCtx_inout->sLists.sObsoleteResources.sizeOfList = 0 ;
+ }
+
+ return true ;
+}
+
+/**
+ * \brief Process policy change for resources of public/group/app
+ * \param psInstallFolderCtx [inout] pointer to the public/group/app's context
+ * \return number policy changes performed, or negative value for error
+ */
+static sint_t pas_conf_processPolicyChangesForInstallFolder(pas_cfg_instFoldCtx_s* const psInstallFolderCtx)
+{
+ /* identify the key type local resorces affected by policy change
+ * for each of these, call pas_conf_processPolicyChangesForKey */
+
+ bool_t bEverythingOK = true ;
+ sint_t iNoOfPolicyChanges = 0 ;
+ sint_t iPosInSrcRctList = 0 ;
+ pstr_t pCurrentResourceID = NIL ;
+ PersistenceConfigurationKey_s sSrcConfig ;
+ PersistenceConfigurationKey_s sDestConfig ;
+ /* pas_conf_getContextInstallFolder assures that all the handlers below are opened */
+ sint_t hSrcRct = psInstallFolderCtx->sSrcContext.sRctFile.handler ;
+ sint_t hDestRct = psInstallFolderCtx->sDestContext.sRctDB.handler ;
+ sint_t hDestCachedDB = psInstallFolderCtx->sDestContext.sCachedDB.handler ;
+ sint_t hDestWtDB = psInstallFolderCtx->sDestContext.sWtDB.handler ;
+
+ while(bEverythingOK && (iPosInSrcRctList < psInstallFolderCtx->sLists.sSrcRCT.sizeOfList))
+ {
+ pCurrentResourceID = psInstallFolderCtx->sLists.sSrcRCT.pList + iPosInSrcRctList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ if(0 <= persAdmCfgRctRead(hSrcRct, pCurrentResourceID, &sSrcConfig))
+ {
+ if(0 <= persComRctRead(hDestRct, pCurrentResourceID, &sDestConfig))
+ {
+ if( (PersistenceResourceType_key == sSrcConfig.type)
+ && (PersistenceResourceType_key == sDestConfig.type)
+ && (sSrcConfig.storage < PersistenceStorage_custom)
+ && (sDestConfig.storage < PersistenceStorage_custom)
+ && (sDestConfig.policy != sSrcConfig.policy))
+ {
+ /* initialize this way to please SCC */
+ pas_conf_keyPolicyChangeCtx_s sKeyPolicyChangeCtx = {0} ;
+ sKeyPolicyChangeCtx.psSrcConfig = &sSrcConfig ;
+ sKeyPolicyChangeCtx.psDestConfig = &sDestConfig ;
+ sKeyPolicyChangeCtx.hDestCachedDB = hDestCachedDB ;
+ sKeyPolicyChangeCtx.hDestWtDB = hDestWtDB ;
+
+ iNoOfPolicyChanges++ ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - change policy (%s) for <%s>",
+ __FUNCTION__,
+ (PersistencePolicy_wc == sSrcConfig.policy) ? "wt -> wc" : "wc -> wt",
+ pCurrentResourceID) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if( ! pas_conf_processPolicyChangesForKey(pCurrentResourceID, psInstallFolderCtx, &sKeyPolicyChangeCtx))
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_processPolicyChangesForKey(%s)...%s",
+ __FUNCTION__, pCurrentResourceID, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+
+ iPosInSrcRctList += ((sint_t)strlen(pCurrentResourceID)+1) ; /* 1 <=> '\0' */
+ }
+
+ return bEverythingOK ? iNoOfPolicyChanges : PAS_FAILURE ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 11-SSW_Administrator_0028*/
+
+
+/**
+ * \brief Perform policy change for one resources
+ * \param resourceID [in] resource identifier
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \param psKeyPolicyChangeCtx [in] relevant context for resourceID
+ * \return number policy changes performed, or negative value for error
+ */
+static bool_t pas_conf_processPolicyChangesForKey( pstr_t resourceID,
+ pas_cfg_instFoldCtx_s* const psInstallFolderCtx,
+ pas_conf_keyPolicyChangeCtx_s* const psKeyPolicyChangeCtx)
+{
+ /* get the list of entries (related to the key) in e.g. cachedDB and move them into wtDB */
+ bool_t bEverythingOK = true ;
+ sint_t hOldDB = -1 ;
+ sint_t hNewDB = -1 ;
+ sint_t iListUnfilteredSize = 0 ;
+ pstr_t pListUnfilteredBuffer = NIL ;
+ sint_t iListFilteredSize = 0 ;
+ pstr_t pListFilteredBuffer = NIL ;
+
+ switch(psKeyPolicyChangeCtx->psSrcConfig->policy)
+ {
+ case PersistencePolicy_wc:
+ {
+ hNewDB = psKeyPolicyChangeCtx->hDestCachedDB ;
+ hOldDB = psKeyPolicyChangeCtx->hDestWtDB ;
+ break ;
+ }
+ case PersistencePolicy_wt:
+ {
+ hNewDB = psKeyPolicyChangeCtx->hDestWtDB ;
+ hOldDB = psKeyPolicyChangeCtx->hDestCachedDB ;
+ break ;
+ }
+ default:
+ {
+ bEverythingOK = false ;
+ break ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ /* now it is clear where from to take the data and where to move it
+ * but we only have the name of the resourceID in RCT,
+ * not the name of the keys in cached/wt DBs (this contains node/group/user/seat prefix) */
+ iListUnfilteredSize = persComDbGetSizeKeysList(hOldDB) ;
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persComDbGetSizeKeysList() returned <%d>",
+ __FUNCTION__, iListUnfilteredSize) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ if(iListUnfilteredSize > 0)
+ {
+ pListUnfilteredBuffer = (pstr_t)malloc((size_t)iListUnfilteredSize) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != pListUnfilteredBuffer)
+ {
+ if(iListUnfilteredSize != persComDbGetKeysList(hOldDB, pListUnfilteredBuffer, iListUnfilteredSize))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ if(iListUnfilteredSize < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK && (iListUnfilteredSize > 0))
+ {
+ /* pListUnfilteredBuffer contains the names of all the keys, but we have to filter the keys we want to move */
+ pListFilteredBuffer = (pstr_t)malloc((size_t)iListUnfilteredSize) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != pListFilteredBuffer)
+ {
+ /* initialize this way to please SCC */
+ pas_conf_listOfItems_s sUnfilteredList = {0} ;
+ sUnfilteredList.pList = pListUnfilteredBuffer ;
+ sUnfilteredList.sizeOfList = iListUnfilteredSize ;
+
+ iListFilteredSize = pas_conf_filterResourcesList(resourceID, false, true, &sUnfilteredList, pListFilteredBuffer);
+ if(iListFilteredSize < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ if(bEverythingOK && (iListFilteredSize > 0))
+ {
+ str_t keyData[PERS_DB_MAX_SIZE_KEY_DATA] ;
+ sint_t iDataSize ;
+ sint_t iPosInListing = 0 ;
+ pstr_t pOldDbPathname = (PersistencePolicy_wt == psKeyPolicyChangeCtx->psSrcConfig->policy) ?
+ psInstallFolderCtx->sDestContext.sCachedDB.pathname :
+ psInstallFolderCtx->sDestContext.sWtDB.pathname ;
+ pstr_t pNewDbPathname = (PersistencePolicy_wt == psKeyPolicyChangeCtx->psSrcConfig->policy) ?
+ psInstallFolderCtx->sDestContext.sWtDB.pathname :
+ psInstallFolderCtx->sDestContext.sCachedDB.pathname ;
+
+ while((iPosInListing < iListFilteredSize) && bEverythingOK)
+ {
+ pstr_t pCurrentKey = pListFilteredBuffer + iPosInListing ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ iDataSize = persComDbReadKey(hOldDB, pCurrentKey, keyData, sizeof(keyData)) ;
+ if(iDataSize >= 0)
+ {
+ if(0 <= persComDbWriteKey(hNewDB, pCurrentKey, keyData, iDataSize))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persComDbWriteKey(<%s>, <%s>, %d) done",
+ __FUNCTION__, pNewDbPathname, pCurrentKey, iDataSize) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(0 > persComDbDeleteKey(hOldDB, pCurrentKey))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persComDbDeleteKey(<%s>, <%s>) failed",
+ __FUNCTION__, pOldDbPathname, pCurrentKey) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persComDbDeleteKey(<%s>, <%s>) done",
+ __FUNCTION__, pOldDbPathname, pCurrentKey) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persComDbWriteKey(<%s>, <%s>, %d) failed",
+ __FUNCTION__, pNewDbPathname, pCurrentKey, iDataSize) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+ }
+
+ iPosInListing += ((sint_t)strlen(pCurrentKey)+1); /* 1 <=> '\0' */
+ }
+ }
+
+ if(NIL != pListUnfilteredBuffer)
+ {
+ free(pListUnfilteredBuffer) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+ if(NIL != pListFilteredBuffer)
+ {
+ free(pListFilteredBuffer) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 1-SSW_Administrator_0029*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0030*/ /*DG C8ISQP-ISQP Metric 11-SSW_Administrator_0031*/
+
+/**
+ * \brief Remove the data for obsolete resources of public/group/app
+ * \param psInstallFolderCtx [inout] pointer to the public/group/app's context
+ * \return number of obsolete resources removed, or negative value for error
+ */
+static sint_t pas_conf_uninstallObsoleteDataForInstallFolder(pas_cfg_instFoldCtx_s* const psInstallFolderCtx)
+{
+ bool_t bEverythingOK = true ;
+ sint_t iNoOfRemovedObsoleteResources = 0 ;
+ bool_t bObsoleteResourcesAvailable = false ;
+ sint_t hDestRct = psInstallFolderCtx->sDestContext.sRctDB.handler ;
+
+ if(psInstallFolderCtx->sLists.sObsoleteResources.sizeOfList > 0)
+ {
+ /* there are obsolete resources */
+ bObsoleteResourcesAvailable = true ;
+ }
+
+ if(bObsoleteResourcesAvailable)
+ {
+ PersistenceConfigurationKey_s sConfig ;
+ pstr_t pCurrentObsoleteResource = NIL ;
+ sint_t iPosInList = 0 ;
+ while(bEverythingOK && (iPosInList < psInstallFolderCtx->sLists.sObsoleteResources.sizeOfList))
+ {
+ sint_t iResultLocal ;
+ pCurrentObsoleteResource = psInstallFolderCtx->sLists.sObsoleteResources.pList + iPosInList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ iResultLocal = persComRctRead(hDestRct, pCurrentObsoleteResource, &sConfig);
+ if((sint_t)sizeof(sConfig) == iResultLocal)
+ {
+ iNoOfRemovedObsoleteResources++ ;
+ bEverythingOK = pas_conf_uninstallObsoleteResource(pCurrentObsoleteResource, &sConfig, psInstallFolderCtx) ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_uninstallObsoleteResource(%s)...%s",
+ __FUNCTION__, pCurrentObsoleteResource, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ iPosInList += ((sint_t)strlen(pCurrentObsoleteResource)+1) ; /* 1 <=> '\0' */
+ }
+ }
+
+ return bEverythingOK ? iNoOfRemovedObsoleteResources : PAS_FAILURE ;
+}
+
+
+/**
+ * \brief Remove the data for one obsolete resource
+ * \param resourceID [in] resource's identifier
+ * \param psConfig [in] resource's configuration
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \return true for success, false otherway
+ */
+static bool_t pas_conf_uninstallObsoleteResource( constpstr_t resourceID,
+ PersistenceConfigurationKey_s* const psConfig,
+ pas_cfg_instFoldCtx_s* const psInstallFolderCtx)
+{
+ bool_t bEverythingOK = true ;
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - <<%s>> policy=%d type=%d",
+ __FUNCTION__, resourceID, psConfig->policy, psConfig->type) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ switch(psConfig->type)
+ {
+ case PersistenceResourceType_key:
+ {
+ bEverythingOK = pas_conf_uninstallObsoleteKey(resourceID, psConfig, psInstallFolderCtx) ;
+ break;
+ }
+ case PersistenceResourceType_file:
+ {
+ bEverythingOK = pas_conf_uninstallObsoleteFile(resourceID, psConfig, psInstallFolderCtx) ;
+ break;
+ }
+ default:
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - unknown type = %d", __FUNCTION__, psConfig->type) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ break;
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+/**
+ * \brief Remove the data for one obsolete key type resource
+ * \param resourceID [in] resource's identifier
+ * \param psConfig [in] resource's configuration
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \return true for success, false otherway
+ */
+static bool_t pas_conf_uninstallObsoleteKey( pstr_t resourceID,
+ PersistenceConfigurationKey_s* const psConfig,
+ pas_cfg_instFoldCtx_s* const psInstallFolderCtx)
+{
+ bool_t bEverythingOK = true ;
+ bool_t bUninstallSupported = true ;
+
+ if(psConfig->storage >= PersistenceStorage_custom)
+ {
+ bUninstallSupported = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - not supported for <%s> storage=%d",
+ __FUNCTION__, resourceID, psConfig->storage) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK && bUninstallSupported)
+ {
+ /* remove the entry from factory-default DB - if available */
+ if(psInstallFolderCtx->sDestContext.sFactoryDefaultDB.bIsAvailable)
+ {
+ sint_t hDefaultDB = psInstallFolderCtx->sDestContext.sFactoryDefaultDB.handler;
+ if(hDefaultDB >= 0)
+ {
+ sint_t iResult = persComDbDeleteKey(hDefaultDB, resourceID) ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persComDbDeleteKey(<%s>, <%s>)returned <%d>",
+ __FUNCTION__, psInstallFolderCtx->sDestContext.sFactoryDefaultDB.pathname, resourceID, iResult) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if((iResult < 0) && (PERS_COM_ERR_NOT_FOUND != iResult))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK && bUninstallSupported)
+ {
+ /* remove the entry from configurable-default DB - if available */
+ if(psInstallFolderCtx->sDestContext.sConfigurableDefaultDB.bIsAvailable)
+ {
+ sint_t hDefaultDB = psInstallFolderCtx->sDestContext.sConfigurableDefaultDB.handler ;
+ if(hDefaultDB >= 0)
+ {
+ sint_t iResult = persComDbDeleteKey(hDefaultDB, resourceID) ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persComDbDeleteKey(<%s>, <%s>)returned <%d>",
+ __FUNCTION__, psInstallFolderCtx->sDestContext.sConfigurableDefaultDB.pathname, resourceID, iResult) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if((iResult < 0) && (PERS_COM_ERR_NOT_FOUND != iResult))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK && bUninstallSupported)
+ {
+ /* remove the entry from non-default DB (cached or wt according to key's policy) */
+ sint_t hNonDefaultDB = -1;
+ pstr_t pNonDefaultDbPathname = NIL ;
+ switch(psConfig->policy)
+ {
+ case PersistencePolicy_wc:
+ {
+ hNonDefaultDB = psInstallFolderCtx->sDestContext.sCachedDB.handler ;
+ pNonDefaultDbPathname = psInstallFolderCtx->sDestContext.sCachedDB.pathname ;
+ break;
+ }
+ case PersistencePolicy_wt:
+ {
+ hNonDefaultDB = psInstallFolderCtx->sDestContext.sWtDB.handler ;
+ pNonDefaultDbPathname = psInstallFolderCtx->sDestContext.sWtDB.pathname ;
+ break;
+ }
+ default:
+ {
+ bEverythingOK = false ;
+ break;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ if( ! pas_conf_deleteNonDefaultDataForKeyTypeResource(resourceID, hNonDefaultDB))
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s pas_conf_deleteNonDefaultDataForKeyTypeResource(<%s>, <%s>)...%s",
+ __FUNCTION__, resourceID, pNonDefaultDbPathname, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0032*/
+
+/**
+ * \brief Remove the data for one obsolete file type resource
+ * \param resourceID [in] resource's identifier
+ * \param psConfig [in] resource's configuration
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \return true for success, false otherway
+ */
+static bool_t pas_conf_uninstallObsoleteFile( pstr_t resourceID,
+ PersistenceConfigurationKey_s* const psConfig,
+ pas_cfg_instFoldCtx_s* const psInstallFolderCtx)
+{
+ bool_t bEverythingOK = true ;
+ str_t filePathname[PERSADMIN_MAX_PATH_LENGHT] ;
+ sint_t iSizeOfListing = 0 ;
+ pstr_t pListingBuffer = NIL ;
+ pstr_t pListingBufferFiltered = NIL ;
+ pstr_t installFolderPathname = psInstallFolderCtx->sDestContext.sInstallFolder.pathname ; /* just to have shorter expressions */
+ bool_t bUninstallSupported = true ;
+
+ if(psConfig->storage >= PersistenceStorage_custom)
+ {
+ bUninstallSupported = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - not supported for <%s> storage=%d",
+ __FUNCTION__, resourceID, psConfig->storage) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bUninstallSupported)
+ {
+ /* get a list of all the files in the application folder */
+ iSizeOfListing = persadmin_list_folder_get_size(installFolderPathname, PersadminFilterFilesRegular, true) ;
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s: persadmin_list_folder_get_size(%s) returned <%d>",
+ __FUNCTION__, installFolderPathname, iSizeOfListing) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ if(iSizeOfListing > 0)
+ {
+ pListingBuffer = (pstr_t)malloc((size_t)iSizeOfListing) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pListingBufferFiltered = (pstr_t)malloc((size_t)iSizeOfListing) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if((NIL != pListingBuffer) && (NIL != pListingBufferFiltered))
+ {
+ if(iSizeOfListing != persadmin_list_folder(installFolderPathname, pListingBuffer, iSizeOfListing, PersadminFilterFilesRegular, true))
+ {
+ /* very strange */
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK && bUninstallSupported && (iSizeOfListing > 0))
+ {
+ /* we have the list with all the files in the install folder
+ * now we have to filter and delete all the files with the same name as resourceID */
+ sint_t iSizeOfListFiltered = 0 ;
+ /* initialize this way to please SCC */
+ pas_conf_listOfItems_s sUnfilteredList = {0} ;
+ sUnfilteredList.pList = pListingBuffer ;
+ sUnfilteredList.sizeOfList = iSizeOfListing ;
+
+ iSizeOfListFiltered = pas_conf_filterResourcesList(resourceID, false, false, &sUnfilteredList, pListingBufferFiltered) ;
+
+ if(iSizeOfListFiltered > 0)
+ {
+ sint_t iPosInBuffer = 0 ;
+ pstr_t pCurrentFilePathname = NIL ;
+ while((iPosInBuffer < iSizeOfListFiltered) && bEverythingOK)
+ {
+ sint_t iDeleteResult ;
+ pCurrentFilePathname = pListingBufferFiltered + iPosInBuffer ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ /* delete the file */
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s: resID=<%s> filename=<%s>", __FUNCTION__, resourceID, pCurrentFilePathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ (void)snprintf(filePathname, sizeof(filePathname), "%s/%s", installFolderPathname, pCurrentFilePathname) ;
+ iDeleteResult = persadmin_delete_file(filePathname) ;
+ if(iDeleteResult < 0)
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persadmin_delete_file(<%s>) returned <%d>", __FUNCTION__, filePathname, iDeleteResult) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ iPosInBuffer += ((sint_t)strlen(pCurrentFilePathname) + 1) ; /* 1 <=> '\0' */
+ }
+ }
+ else
+ {
+ if(iSizeOfListFiltered < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(pListingBuffer)
+ {
+ free(pListingBuffer) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+ if(pListingBufferFiltered)
+ {
+ free(pListingBufferFiltered) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 6-SSW_Administrator_0033*/
+
+/**
+ * \brief Update the existent public/group/app's existent RCT in order to match the input(source) RCT
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \return the number of updated RCT entries, or negative value in case of error
+ */
+static sint_t pas_conf_updateRctForInstallFolder(pas_cfg_instFoldCtx_s* const psInstallFolderCtx)
+{
+ bool_t bEverythingOK = true ;
+ sint_t iNoOfRctEntriesModified = 0 ;
+ /* pas_conf_getContextInstallFolder assures that all the handlers below are opened */
+ sint_t hDestRCT = psInstallFolderCtx->sDestContext.sRctDB.handler ;
+ sint_t hSrcRCT = psInstallFolderCtx->sSrcContext.sRctFile.handler;
+
+ if(bEverythingOK)
+ {
+ /* first remove the obsolete resources */
+ sint_t iPosInList = 0 ;
+ pstr_t pCurrentResource = NIL ;
+ sint_t iCurrentNumberOfResourceProcessed = 0 ;
+ while(bEverythingOK && (iPosInList < psInstallFolderCtx->sLists.sObsoleteResources.sizeOfList))
+ {
+ if(0 == (++iCurrentNumberOfResourceProcessed)%15) /* retrigger watchdog once for every 15 resources processed*/
+ {
+ /* retrigger watchdog */
+ persadmin_RetriggerWatchdog();
+ }
+
+ pCurrentResource = psInstallFolderCtx->sLists.sObsoleteResources.pList + iPosInList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ if(0 <= persComRctDelete(hDestRCT, pCurrentResource))
+ {
+ iNoOfRctEntriesModified++ ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persComRctDelete(%s) %s", __FUNCTION__,
+ pCurrentResource, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ iPosInList += ((sint_t)strlen(pCurrentResource) + 1) ; /* 1 <=> '\0'*/
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ /* then (over)write the old RCT entries with the new ones */
+ sint_t iPosInList = 0 ;
+ pstr_t pCurrentResource = NIL ;
+ PersistenceConfigurationKey_s sOldConfig = {PersistencePolicy_na} ;
+ PersistenceConfigurationKey_s sNewConfig = {PersistencePolicy_na};
+ bool_t bIsNewRsource = false ;
+ sint_t iCurrentNumberOfResourceProcessed = 0 ;
+ while(bEverythingOK && (iPosInList < psInstallFolderCtx->sLists.sSrcRCT.sizeOfList))
+ {
+ bIsNewRsource = false ;
+ pCurrentResource = psInstallFolderCtx->sLists.sSrcRCT.pList + iPosInList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ if(0 == (++iCurrentNumberOfResourceProcessed)%15) /* retrigger watchdog once for every 15 resources processed*/
+ {
+ /* retrigger watchdog */
+ persadmin_RetriggerWatchdog();
+ }
+
+ if(0 <= persAdmCfgRctRead(hSrcRCT, pCurrentResource, &sNewConfig))
+ {
+ sint_t iReadSize = persComRctRead(hDestRCT, pCurrentResource, &sOldConfig) ;
+ if(PERS_COM_ERR_NOT_FOUND == iReadSize)
+ {
+ bIsNewRsource = true ;
+ }
+ if( (iReadSize < 0) && (PERS_COM_ERR_NOT_FOUND != iReadSize))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+
+ if(((0 != memcmp(&sNewConfig, &sOldConfig, sizeof(sOldConfig))) || bIsNewRsource)
+ && (bEverythingOK) ) /* normally first check, but SCC suspects that memcmp has side effects */
+ {
+ /* new resource or different configuration => (over)write with the new one */
+ if(0 > persComRctWrite(hDestRCT, pCurrentResource, &sNewConfig))
+ {
+ bEverythingOK = false ;
+ }
+ else
+ {
+ iNoOfRctEntriesModified++ ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s update of RCT for <%s> %s", __FUNCTION__,
+ pCurrentResource, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ iPosInList += ((sint_t)strlen(pCurrentResource) + 1) ; /* 1 <=> '\0'*/
+ }
+ }
+
+ return bEverythingOK ? iNoOfRctEntriesModified : PAS_FAILURE ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/**
+ * \brief Apply configuration on public/group/app's default data
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \param bForFactoryDefault [in] select data to be affected (factory-default for true, configurable-default for false)
+ * \return the number of configured resources, or negative value in case of error
+ */
+static sint_t pas_conf_configureForDefault(pas_cfg_instFoldCtx_s* const psInstallFolderCtx, bool_t bForFactoryDefault)
+{
+ bool_t bEverythingOK = true ;
+ sint_t errorCode = PAS_FAILURE ;
+ sint_t iNoOfInstalledResources = 0 ;
+ pas_conf_handlersForDefault_s sHandlers ;
+ pas_conf_listsForInstallFolder_s* psLists = &psInstallFolderCtx->sLists; /* only to have shorter expressions */
+
+ (void)memset(&sHandlers, 0x0, sizeof(sHandlers));
+
+ if( ! pas_conf_setupHandlersForDefault(psInstallFolderCtx, bForFactoryDefault, &sHandlers))
+ {
+ bEverythingOK = false ;
+ }
+
+ if(bEverythingOK)
+ {
+ sint_t iPosInListOfResources = 0 ;
+ pstr_t pCurrentResourceID = NIL ;
+ sint_t iCurrentNumberOfResourceProcessed = 0 ;
+
+ /* for each resource in the list:
+ * - find out which kind of configuration to apply (if any)
+ * - apply configuration */
+ while(bEverythingOK && (iPosInListOfResources < psLists->sSrcRCT.sizeOfList))
+ {
+ bool_t bSkipCurrentResource = false ;
+ pas_cfg_configTypes_e eConfigTypeForResource = pas_cfg_configType_dontTouch ;
+
+ if(0 == (++iCurrentNumberOfResourceProcessed)%15) /* retrigger watchdog once for every 15 resources processed*/
+ {
+ /* retrigger watchdog */
+ persadmin_RetriggerWatchdog();
+ }
+
+ pCurrentResourceID = psLists->sSrcRCT.pList + iPosInListOfResources ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ if(pas_conf_getConfigurationNeededForResource(pCurrentResourceID, psInstallFolderCtx->eInstallRule, sHandlers.hSrcExceptions, &eConfigTypeForResource))
+ {
+ if(pas_cfg_configType_dontTouch == eConfigTypeForResource)
+ {
+ bSkipCurrentResource = true ;
+ }
+ }
+ else
+ {
+ bSkipCurrentResource = true ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_getConfigurationNeededForResource(%s) FAILED. Skip configuration...",
+ __FUNCTION__, pCurrentResourceID) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if( (! bSkipCurrentResource) && (pas_cfg_configType_update == eConfigTypeForResource))
+ {
+ if(pas_conf_updateDefaultDataForResource(pCurrentResourceID, psInstallFolderCtx, &sHandlers, bForFactoryDefault))
+ {
+ iNoOfInstalledResources++ ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_updateDefaultDataForResource(<%s>, <%s>) ... %s",
+ __FUNCTION__, pCurrentResourceID,
+ bForFactoryDefault ? "factory" : "configurable",
+ bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if( (! bSkipCurrentResource) && (pas_cfg_configType_delete == eConfigTypeForResource))
+ {
+ if(pas_conf_deleteDefaultDataForResource(pCurrentResourceID, psInstallFolderCtx, &sHandlers, bForFactoryDefault))
+ {
+ iNoOfInstalledResources++ ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_deleteDefaultDataForResource(<%s>, <%s>) ... %s",
+ __FUNCTION__, pCurrentResourceID,
+ bForFactoryDefault ? "factory" : "configurable",
+ bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ iPosInListOfResources += ((sint_t)strlen(pCurrentResourceID) + 1) ; /* 1 <=> '\0' */
+ }
+ }
+
+ return (bEverythingOK ? iNoOfInstalledResources : errorCode) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/**
+ * \brief Setup handlers to public/group/app's default data accordinf to pas_conf_handlersForDefault_s
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \param bForFactoryDefault [in] select data to be affected (factory-default for true, configurable-default for false)
+ * \param psHandlers_out [out] pointer to the handlers structure
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_setupHandlersForDefault( pas_cfg_instFoldCtx_s* const psInstallFolderCtx,
+ bool_t bForFactoryDefault,
+ pas_conf_handlersForDefault_s* psHandlers_out)
+{
+ bool_t bEverythingOK = true ;
+
+ psHandlers_out->hDestRctDB = psInstallFolderCtx->sDestContext.sRctDB.handler ;
+ psHandlers_out->hDestDefaultDataDB = bForFactoryDefault ?
+ psInstallFolderCtx->sDestContext.sFactoryDefaultDB.handler :
+ psInstallFolderCtx->sDestContext.sConfigurableDefaultDB.handler ;
+ psHandlers_out->hSrcRctFile = psInstallFolderCtx->sSrcContext.sRctFile.handler;
+ psHandlers_out->hSrcDefaultDataFile = bForFactoryDefault ?
+ psInstallFolderCtx->sSrcContext.sFactoryDefaultDataFile.handler :
+ psInstallFolderCtx->sSrcContext.sConfigurableDefaultDataFile.handler ;
+ psHandlers_out->hSrcExceptions = psInstallFolderCtx->sSrcContext.sExceptionsFile.handler;
+
+
+ return bEverythingOK ;
+}
+
+
+/**
+ * \brief Configure non-default(initial and run-time) data for install folder
+ * \param psInstallFolderCtx [in] pointer to install folder context
+ * \return the number of installed resources, or negative value for error
+ */
+static sint_t pas_conf_configureForNonDefault(pas_cfg_instFoldCtx_s* const psInstallFolderCtx)
+{
+ bool_t bEverythingOK = true ;
+ sint_t errorCode = PAS_FAILURE ;
+ sint_t iNoOfInstalledResources = 0 ;
+ pas_conf_handlersForNonDefault_s sHandlers = {0} ;
+ pas_conf_listsForInstallFolder_s* psLists = &psInstallFolderCtx->sLists; /* only to have shorter expressions */
+
+ if( ! pas_conf_setupHandlersForNonDefault(psInstallFolderCtx, &sHandlers))
+ {
+ bEverythingOK = false ;
+ }
+
+ if(bEverythingOK)
+ {
+ sint_t iPosInListOfResources = 0 ;
+ pstr_t pCurrentResourceID = NIL ;
+
+ /* for each resource in the list:
+ * - find out which kind of configuration to apply (if any)
+ * - apply configuration */
+ while(bEverythingOK && (iPosInListOfResources < psLists->sSrcRCT.sizeOfList))
+ {
+ bool_t bSkipCurrentResource = false ;
+ pas_cfg_configTypes_e eConfigTypeForResource = pas_cfg_configType_dontTouch ;
+
+ pCurrentResourceID = psLists->sSrcRCT.pList + iPosInListOfResources ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ if(pas_conf_getConfigurationNeededForResource(pCurrentResourceID, psInstallFolderCtx->eInstallRule, sHandlers.hSrcExceptions, &eConfigTypeForResource))
+ {
+ if(pas_cfg_configType_dontTouch == eConfigTypeForResource)
+ {
+ bSkipCurrentResource = true ;
+ }
+ }
+ else
+ {
+ bSkipCurrentResource = true ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_getConfigurationNeededForResource(%s) FAILED. Skip configuration...",
+ __FUNCTION__, pCurrentResourceID) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if( (! bSkipCurrentResource) && (pas_cfg_configType_update == eConfigTypeForResource))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - update of non-default data for <%s> not (yet) supported",
+ __FUNCTION__, pCurrentResourceID) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if( (! bSkipCurrentResource) && (pas_cfg_configType_delete == eConfigTypeForResource))
+ {
+ if(pas_conf_deleteNonDefaultDataForResource(pCurrentResourceID, psInstallFolderCtx, &sHandlers))
+ {
+ iNoOfInstalledResources++ ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - pas_conf_deleteNonDefaultDataForResource(<%s>) ... %s",
+ __FUNCTION__, pCurrentResourceID, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ iPosInListOfResources += ((sint_t)strlen(pCurrentResourceID) + 1) ; /* 1 <=> '\0' */
+ }
+ }
+
+ return (bEverythingOK ? iNoOfInstalledResources : errorCode) ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+/**
+ * \brief Open handlers to public/group/app's non-default data accordinf to pas_conf_handlersForNonDefault_s
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \param psHandlers_out [out] pointer to the handlers structure
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_setupHandlersForNonDefault(pas_cfg_instFoldCtx_s* const psInstallFolderCtx, pas_conf_handlersForNonDefault_s* psHandlers_out)
+{
+ bool_t bEverythingOK = true ;
+
+ psHandlers_out->hDestRctDB = psInstallFolderCtx->sDestContext.sRctDB.handler ;
+ psHandlers_out->hDestCachedDataDB = psInstallFolderCtx->sDestContext.sCachedDB.handler ;
+ psHandlers_out->hDestWtDataDB = psInstallFolderCtx->sDestContext.sWtDB.handler ;
+ psHandlers_out->hSrcRctFile = psInstallFolderCtx->sSrcContext.sRctFile.handler ;
+ psHandlers_out->hSrcExceptions = psInstallFolderCtx->sSrcContext.sExceptionsFile.handler ;
+
+ return bEverythingOK ;
+}
+
+
+/**
+ * \brief Find out the type of configuration to by performed on the resource
+ * \param resourceID [in] resource's identifier
+ * \param eRule [in] generic(folder level) install rule
+ * \param hExceptions [in] handler to the install-exceptions file
+ * \param peConfigType_out [out]where the type of configuration is returned
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_getConfigurationNeededForResource( constpstr_t resourceID,
+ PersAdminCfgInstallRules_e eRule,
+ sint_t hExceptions,
+ pas_cfg_configTypes_e* peConfigType_out )
+{
+ bool_t bEverythingOK = true ;
+ bool_t bExceptionSpecifiedForResource = false ;
+ PersAdminCfgInstallExceptions_e eExceptionForResource ;
+
+ if(hExceptions >= 0)
+ {
+ sint_t iErrLocal = persAdmCfgExcGetExceptionForResource(hExceptions, resourceID, &eExceptionForResource) ;
+ if(iErrLocal >= 0)
+ {
+ bExceptionSpecifiedForResource = true ;
+ }
+ else
+ {
+ if(PAS_FAILURE_NOT_FOUND != iErrLocal)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s unexpected error =<%d>(0x%X) !!!",
+ __FUNCTION__, iErrLocal, iErrLocal) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+ if(bEverythingOK && bExceptionSpecifiedForResource)
+ {
+ /* check if the exception is valid in corespondence to install rule */
+ if( ! g_LookUpRules[eRule].exceptionsLookUp[eExceptionForResource])
+ {
+ /* invalid install exception */
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s unexpected exception <%d> for install rule <%d> !!!",
+ __FUNCTION__, eRule, eExceptionForResource) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ if(bExceptionSpecifiedForResource)
+ {
+ switch(eExceptionForResource)
+ {
+ case PersAdminCfgInstallExceptions_Update:
+ {
+ *peConfigType_out = pas_cfg_configType_update;
+ break ;
+ }
+ case PersAdminCfgInstallExceptions_Delete:
+ {
+ *peConfigType_out = pas_cfg_configType_delete;
+ break ;
+ }
+ default: /* i.e. PersAdminCfgInstallExceptions_DontTouch */
+ {
+ *peConfigType_out = pas_cfg_configType_dontTouch;
+ break ;
+ }
+ }
+ }
+ else
+ {
+ *peConfigType_out = g_LookUpRules[eRule].eDefaultConfigType ;
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+
+/**
+ * \brief Update default data (factory or configurable) for one resource
+ * \param resourceID [in] resource's identifier
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \param psHandlers [in] structure with handlers to relevan files
+ * \param bForFactoryDefault [in] select data to be updated (factory-default for true, configurable-default for false)
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_updateDefaultDataForResource(constpstr_t resourceID,
+ pas_cfg_instFoldCtx_s* const psInstallFolderCtx,
+ pas_conf_handlersForDefault_s* psHandlers,
+ bool_t bForFactoryDefault)
+{
+ bool_t bEverythingOK = true ;
+ PersistenceConfigurationKey_s sResourceCfgSrc ;
+ int iErrLocal ;
+
+ iErrLocal = persAdmCfgRctRead(psHandlers->hSrcRctFile, resourceID, &sResourceCfgSrc) ;
+ if(iErrLocal >= 0)
+ {
+ if(PersistenceResourceType_key == sResourceCfgSrc.type) /* supported also for custom plugins */
+ {
+ PersAdminCfgKeyDataEntry_s sDefaultDataEntry ;
+ sint_t iDefaultDataSize = 0 ;
+
+ /* check if there is default data for the key */
+ iDefaultDataSize = persAdmCfgReadDefaultData(psHandlers->hSrcDefaultDataFile, resourceID, sDefaultDataEntry.data, sizeof(sDefaultDataEntry.data)) ;
+ if(iDefaultDataSize > 0)
+ {
+ /* (over)write default data */
+ sint_t iDbErr = persComDbWriteKey(psHandlers->hDestDefaultDataDB, resourceID, sDefaultDataEntry.data, iDefaultDataSize) ;
+ if(iDbErr < 0)
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persComDbWriteKey(%s) returned %d",
+ __FUNCTION__, resourceID, iDefaultDataSize) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if( (sResourceCfgSrc.storage < PersistenceStorage_custom ) /* supported only for local/shared storage */
+ && (PersistenceResourceType_file == sResourceCfgSrc.type))
+ {
+ str_t srcDefaultFilePathname[PERSADMIN_MAX_PATH_LENGHT] ;
+ str_t destDefaultFilePathname[PERSADMIN_MAX_PATH_LENGHT] ;
+
+ /* set paths */
+ (void)snprintf(srcDefaultFilePathname, sizeof(srcDefaultFilePathname), "%s/%s/%s",
+ psInstallFolderCtx->sSrcContext.sFiledataFolder.pathname,
+ bForFactoryDefault ? PERS_ORG_DEFAULT_DATA_FOLDER_NAME : PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME,
+ resourceID) ;
+ (void)snprintf(destDefaultFilePathname, sizeof(destDefaultFilePathname), "%s/%s/%s",
+ psInstallFolderCtx->sDestContext.sInstallFolder.pathname,
+ bForFactoryDefault ? PERS_ORG_DEFAULT_DATA_FOLDER_NAME : PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME,
+ resourceID) ;
+ if(0 <= persadmin_check_if_file_exists(srcDefaultFilePathname, false))
+ {
+ /* default data available for the resource */
+ sint_t iErrCopy = persadmin_copy_file(srcDefaultFilePathname, destDefaultFilePathname) ;
+ if(iErrCopy < 0)
+ {
+ bEverythingOK = false ;
+ }
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persadmin_copy_file(<%s>, <%s>) returned %d",
+ __FUNCTION__, srcDefaultFilePathname, destDefaultFilePathname, iErrCopy) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - no default data (<%s>) ",
+ __FUNCTION__, srcDefaultFilePathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/**
+ * \brief Remove default data (factory or configurable) for one resource
+ * \param resourceID [in] resource's identifier
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \param psHandlers [in] structure with handlers to relevan files
+ * \param bForFactoryDefault [in] select data to be removed (factory-default for true, configurable-default for false)
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_deleteDefaultDataForResource(constpstr_t resourceID,
+ pas_cfg_instFoldCtx_s* const psInstallFolderCtx,
+ pas_conf_handlersForDefault_s* psHandlers,
+ bool_t bForFactoryDefault)
+{
+ bool_t bEverythingOK = true ;
+ PersistenceConfigurationKey_s sResourceCfgSrc ;
+ int iErrLocal ;
+
+ iErrLocal = persAdmCfgRctRead(psHandlers->hSrcRctFile, resourceID, &sResourceCfgSrc) ;
+ if(iErrLocal >= 0)
+ {
+ if( (sResourceCfgSrc.storage < PersistenceStorage_custom ) /* supported only for local/shared storage */
+ && (PersistenceResourceType_key == sResourceCfgSrc.type))
+ {
+ sint_t iDefaultDataSize = 0 ;
+
+ /* check if there is default data for the key */
+ iDefaultDataSize = persComDbGetKeySize(psHandlers->hDestDefaultDataDB, resourceID) ;
+ if(iDefaultDataSize > 0)
+ {
+ /* delete default data */
+ sint_t iDbErr = persComDbDeleteKey(psHandlers->hDestDefaultDataDB, resourceID) ;
+ if( (iDbErr < 0) && (PERS_COM_ERR_NOT_FOUND != iDbErr))
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persComDbDeleteKey(%s) ... %s",
+ __FUNCTION__, resourceID, bEverythingOK ? "OK" : "FAILED") ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - no default data to be deleted for <%s>",
+ __FUNCTION__, resourceID) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if( (sResourceCfgSrc.storage < PersistenceStorage_custom ) /* supported only for local/shared storage */
+ && (PersistenceResourceType_file == sResourceCfgSrc.type))
+ {
+ str_t defaultFilePathname[PERSADMIN_MAX_PATH_LENGHT] ;
+
+ (void)snprintf(defaultFilePathname, sizeof(defaultFilePathname), "%s/%s/%s",
+ psInstallFolderCtx->sDestContext.sInstallFolder.pathname,
+ bForFactoryDefault ? PERS_ORG_DEFAULT_DATA_FOLDER_NAME : PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME,
+ resourceID) ;
+ if(0 <= persadmin_check_if_file_exists(defaultFilePathname, false))
+ {
+ /* default data available for the resource => delete it */
+ sint_t iErrCopy = persadmin_delete_file(defaultFilePathname) ;
+ if(iErrCopy < 0)
+ {
+ bEverythingOK = false ;
+ }
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persadmin_delete_file(<%s>) returned %d",
+ __FUNCTION__, defaultFilePathname, iErrCopy) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - no default data file (<%s>) to be deleted",
+ __FUNCTION__, defaultFilePathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+ else
+ {
+ /* should never happen */
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgRctRead(%s) failed err=%d",
+ __FUNCTION__, resourceID, iErrLocal) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+/**
+ * \brief Remove non-default data (initial or run time) for one resource
+ * \param resourceID [in] resource's identifier
+ * \param psInstallFolderCtx [in] pointer to the public/group/app's context
+ * \param psHandlers [in] structure with handlers to relevan files
+ * \return true for success, false other way
+ */
+static bool_t pas_conf_deleteNonDefaultDataForResource( constpstr_t resourceID,
+ pas_cfg_instFoldCtx_s* const psInstallFolderCtx,
+ pas_conf_handlersForNonDefault_s* psHandlers)
+{
+ bool_t bEverythingOK = true ;
+ PersistenceConfigurationKey_s sResourceCfgSrc ;
+ int iErrLocal ;
+
+ iErrLocal = persAdmCfgRctRead(psHandlers->hSrcRctFile, resourceID, &sResourceCfgSrc) ;
+ if(iErrLocal >= 0)
+ {
+ if( (sResourceCfgSrc.storage < PersistenceStorage_custom ) /* supported only for local/shared storage */
+ && (PersistenceResourceType_key == sResourceCfgSrc.type))
+ {
+ sint_t hNonDefaultDB = (PersistencePolicy_wc == sResourceCfgSrc.policy) ?
+ psHandlers->hDestCachedDataDB : psHandlers->hDestWtDataDB ;
+
+ bEverythingOK = pas_conf_deleteNonDefaultDataForKeyTypeResource(resourceID, hNonDefaultDB) ;
+ }
+
+ if( (sResourceCfgSrc.storage < PersistenceStorage_custom ) /* supported only for local/shared storage */
+ && (PersistenceResourceType_file == sResourceCfgSrc.type))
+ {
+ bEverythingOK = pas_conf_deleteNonDefaultDataForFileTypeResource(resourceID, psInstallFolderCtx->sDestContext.sInstallFolder.pathname) ;
+ }
+ }
+ else
+ {
+ /* should never happen */
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persAdmCfgRctRead(%s) failed err=%d",
+ __FUNCTION__, resourceID, iErrLocal) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ return bEverythingOK ;
+}
+
+/**
+ * \brief Remove the resource's entries from non-default DB
+ * \param resourceID [in] resource's identifier
+ * \param hNonDefaultDB [in] Handler to non-default DB
+ * \return true for success, false other way
+ *
+ * \note The caller must provide hNonDefaultDB according to resource's policy
+ */
+static bool_t pas_conf_deleteNonDefaultDataForKeyTypeResource(constpstr_t resourceID, sint_t hNonDefaultDB)
+{
+ bool_t bEverythingOK = true ;
+ sint_t iSizeUnfilteredList = 0 ;
+ sint_t iSizeFilteredList = 0 ;
+ pstr_t pUnfilteredList = NIL ;
+ pstr_t pFilteredList = NIL ;
+ bool_t bNothingToDeleteFromDB = true ;
+
+ /* get a list of all the keys in psAppDB->pathname related to our resourceID and delete them */
+ iSizeUnfilteredList = persComDbGetSizeKeysList(hNonDefaultDB) ;
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persComDbGetSizeKeysList() returned <%d>",
+ __FUNCTION__, iSizeUnfilteredList) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ if(iSizeUnfilteredList > 0)
+ {
+ bNothingToDeleteFromDB = false ;
+ pUnfilteredList = (pstr_t)malloc((size_t)iSizeUnfilteredList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL != pUnfilteredList)
+ {
+ pFilteredList = (pstr_t)malloc((size_t)iSizeUnfilteredList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pFilteredList)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ if(iSizeUnfilteredList < 0)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persComDbGetSizeKeysList() FAILED err=<%d>",
+ __FUNCTION__, iSizeUnfilteredList) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK && (! bNothingToDeleteFromDB))
+ {
+ sint_t iListingSize = persComDbGetKeysList(hNonDefaultDB, pUnfilteredList, iSizeUnfilteredList) ;
+ if(iListingSize == iSizeUnfilteredList)
+ {
+ /* there are keys in the unfiltered list, so let's filter the list upon our key */
+
+ /* initialize this way to please SCC */
+ pas_conf_listOfItems_s sUnfilteredList = {0} ;
+ sUnfilteredList.pList = pUnfilteredList ;
+ sUnfilteredList.sizeOfList = iSizeUnfilteredList ;
+
+ iSizeFilteredList = pas_conf_filterResourcesList(resourceID, false, true, &sUnfilteredList, pFilteredList) ;
+ }
+ else
+ {
+ /* very strange */
+ bEverythingOK = false ;
+ }
+ }
+
+ if(bEverythingOK && (! bNothingToDeleteFromDB) && (iSizeFilteredList > 0))
+ {
+ /* there are keys in the filtered list, so delete all of them from psDestDB->pathname */
+ sint_t posInList = 0 ;
+ pstr_t pCurrentKey = NIL ;
+ sint_t iResult ;
+
+ while((posInList < iSizeFilteredList) && bEverythingOK)
+ {
+ pCurrentKey = pFilteredList + posInList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ iResult = persComDbDeleteKey(hNonDefaultDB, pCurrentKey) ;
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persComDbDeleteKey(<%s>)returned <%d>",
+ __FUNCTION__, pCurrentKey, iResult) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ if(iResult < 0)
+ {
+ bEverythingOK = false ;
+ }
+
+ posInList += ((sint_t)strlen(pCurrentKey) + 1) ; /* 1 <=> '\0' */
+ }
+ }
+
+ if(pUnfilteredList)
+ {
+ free(pUnfilteredList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+ if(pFilteredList)
+ {
+ free(pFilteredList) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+/**
+ * \brief Remove the resource's non-default data files
+ * \param resourceID [in] resource's identifier
+ * \param installFolderPathname [in] public/group/app's install folder pathname
+ * \return true for success, false other way
+ *
+ * \note The caller must provide hNonDefaultDB according to resource's policy
+ */
+static bool_t pas_conf_deleteNonDefaultDataForFileTypeResource(constpstr_t resourceID, constpstr_t installFolderPathname)
+{
+ bool_t bEverythingOK = true ;
+ str_t filePathname[PERSADMIN_MAX_PATH_LENGHT] ;
+ sint_t iSizeOfListing = 0 ;
+ pstr_t pListingBuffer = NIL ;
+ pstr_t pListingBufferFiltered = NIL ;
+
+
+
+ /* get a list of all the files in the install folder */
+ iSizeOfListing = persadmin_list_folder_get_size(installFolderPathname, PersadminFilterFilesRegular, true) ;
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s: persadmin_list_folder_get_size(%s) returned <%d>",
+ __FUNCTION__, installFolderPathname, iSizeOfListing) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ if(iSizeOfListing > 0)
+ {
+ pListingBuffer = (pstr_t)malloc((size_t)iSizeOfListing) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pListingBufferFiltered = (pstr_t)malloc((size_t)iSizeOfListing) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if((NIL != pListingBuffer) && (NIL != pListingBufferFiltered))
+ {
+ if(iSizeOfListing != persadmin_list_folder(installFolderPathname, pListingBuffer, iSizeOfListing, PersadminFilterFilesRegular, true))
+ {
+ /* very strange */
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+
+ if(bEverythingOK && (iSizeOfListing > 0))
+ {
+ /* we have the list
+ * now we have to delete all the files with the same name as resourceID
+ */
+ sint_t iSizeOfListFiltered = 0 ;
+ /* initialize this way to please SCC */
+ pas_conf_listOfItems_s sUnfilteredList = {0} ;
+ sUnfilteredList.pList = pListingBuffer ;
+ sUnfilteredList.sizeOfList = iSizeOfListing ;
+
+ iSizeOfListFiltered = pas_conf_filterResourcesList(resourceID, true, false, &sUnfilteredList, pListingBufferFiltered) ;
+
+ if(iSizeOfListFiltered > 0)
+ {
+ sint_t iPosInBuffer = 0 ;
+ pstr_t pCurrentFilePathname = NIL ;
+ while((iPosInBuffer < iSizeOfListFiltered) && bEverythingOK)
+ {
+ sint_t iDeleteResult ;
+ pCurrentFilePathname = pListingBufferFiltered + iPosInBuffer ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+
+ /* delete the file */
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s: resID=<%s> filename=<%s>", __FUNCTION__, resourceID, pCurrentFilePathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ (void)snprintf(filePathname, sizeof(filePathname), "%s/%s", installFolderPathname, pCurrentFilePathname) ;
+ iDeleteResult = persadmin_delete_file(filePathname) ;
+ if(iDeleteResult < 0)
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s persadmin_delete_file(<%s>) returned <%d>", __FUNCTION__, filePathname, iDeleteResult) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ iPosInBuffer += ((sint_t)strlen(pCurrentFilePathname) + 1) ; /* 1 <=> PERSADMIN_ITEMS_IN_LIST_SEPARATOR */
+ }
+ }
+ else
+ {
+ if(iSizeOfListFiltered < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(NIL != pListingBuffer)
+ {
+ free(pListingBuffer) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+ if(NIL != pListingBufferFiltered)
+ {
+ free(pListingBufferFiltered) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+
+ return bEverythingOK ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+/**
+ * \brief Uncompress into the default folder the archive indicated by resourcePathname
+ * \param resourcePathname [in] absolute pathname for the input archive
+ * \return true for success, false otherway
+ */
+static bool_t pas_conf_unarchiveResourceFile(constpstr_t resourcePathname)
+{
+ bool_t bEverythingOK = true ;
+
+ if(0 <= persadmin_check_if_file_exists(resourcePathname, false))
+ {
+ /* create the destination folder (if not already available) */
+ if(0 <= persadmin_create_folder(PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME))
+ {
+ /* clean the folder's content (un-archive does not do this by default) */
+ if( ! pas_conf_deleteFolderContent(PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME, PersadminFilterAll))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persadmin_create_folder(<%s>) FAILED",
+ __FUNCTION__, resourcePathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - archive <%s> not found",
+ __FUNCTION__, resourcePathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bEverythingOK)
+ {
+ /* un-compress resourcePathname into default folder */
+ sint_t iErrCodeLocal = persadmin_uncompress(resourcePathname, PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME) ;
+ if(iErrCodeLocal < 0)
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persadmin_uncompress(<%s>, <%s>) returned <%d>",
+ __FUNCTION__, resourcePathname, PERSADM_CFG_UNCOMPRESSED_RESOURCE_FOLDER_PATHNAME, iErrCodeLocal) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ }
+
+ return bEverythingOK;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+/**
+ * \brief Delete a folder's content according to filter
+ * \param folderPathName [in] absolute pathname to the folder
+ * \param eFilterMode [in] specify which kind of files/folders to be deleted
+ * \return true for success, false otherway
+ */
+static bool_t pas_conf_deleteFolderContent(pstr_t folderPathName, PersadminFilterMode_e eFilterMode)
+{
+ bool_t bEverythingOK = true ;
+ pstr_t pListingBuffer = NIL ;
+ sint_t iListingSize = 0 ;
+
+ iListingSize = persadmin_list_folder_get_size(folderPathName, eFilterMode, false);
+ if(iListingSize > 0)
+ {
+ pListingBuffer = (pstr_t)malloc((size_t)iListingSize); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pListingBuffer)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ if(iListingSize < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ if(bEverythingOK && (iListingSize > 0))
+ {
+ sint_t iListingSizeLocal = persadmin_list_folder(folderPathName, pListingBuffer, iListingSize, eFilterMode, false) ;
+ if(iListingSizeLocal != iListingSize)
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ if(bEverythingOK && (iListingSize > 0))
+ {
+ /* the list of files and folders available in pListingBuffer */
+ sint_t iPosInList = 0 ;
+ pstr_t pCurrentFileOrFolder = NIL ;
+ str_t pathname[PERSADMIN_MAX_PATH_LENGHT] ;
+ while(bEverythingOK && (iPosInList < iListingSize))
+ {
+ pCurrentFileOrFolder = pListingBuffer + iPosInList ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ (void)snprintf(pathname, sizeof(pathname), "%s/%s", folderPathName, pCurrentFileOrFolder) ;
+
+ if(0 <= persadmin_check_if_file_exists(pathname, true))
+ {
+ /* it is a folder => delete it */
+ sint_t iDeletedSize = persadmin_delete_folder(pathname) ;
+ if(iDeletedSize < 0)
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persadmin_delete_folder(%s) returned <%d>",
+ __FUNCTION__, pathname, iDeletedSize) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ if(0 <= persadmin_check_if_file_exists(pathname, false))
+ {
+ /* it is a file */
+ sint_t iDeletedSize = persadmin_delete_file(pathname) ;
+ if(iDeletedSize < 0)
+ {
+ bEverythingOK = false ;
+ }
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - persadmin_delete_file(%s) returned <%d>",
+ __FUNCTION__, pathname, iDeletedSize) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "%s - invalid path <%s>",
+ __FUNCTION__, pathname) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ iPosInList += ((sint_t)strlen(pCurrentFileOrFolder) + 1) ; /* 1 <=> '\0' */
+ }
+ }
+
+ if(NIL != pListingBuffer)
+ {
+ free(pListingBuffer) ; /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+
+ return bEverythingOK;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/ /*DG C8ISQP-ISQP Metric 11-SSW_Administrator_0034*/
+
+/**
+ * \brief From a list with items for all resources, extract only the items related to one resourceID
+ * \param resourceID [in] resource's identifier
+ * \param bFilterOnlyNonDefault [in] if true, default entries are not filetered in
+ * \param bIsKeyType [in] resource's type (key for true, file otherway)
+ * \param psListUnfiltered [in] structure(buffer + size) with the items for all the resources
+ * \param pListFiltered_out [in] buffer where to return the list of items related to resourceID
+ * \return the actual list size in pListFiltered_out, or negative value in case of error
+ */
+#define PREFIX_MAX_SIZE 32 /* should be enough for "/user/2/seat/1/" or "configurableDefaultData/" like strings */
+static sint_t pas_conf_filterResourcesList( pstr_t resourceID,
+ bool_t bFilterOnlyNonDefault,
+ bool_t bIsKeyType,
+ pas_conf_listOfItems_s* const psListUnfiltered,
+ pstr_t pListFiltered_out)
+{
+ bool_t bEverythingOK = true ;
+ sint_t iFilteredBufSize = -1 ;
+ str_t searchString[PERSADMIN_MAX_PATH_LENGHT] = {0} ;
+ sint_t iPosInUnfilteredBuf = 0 ;
+ sint_t iPosInFilteredBuf = 0 ;
+ /* (PERSADMIN_NO_OF_SEATS+1) <=> PERSADMIN_NO_OF_SEATS for "/user/user_no/seat/seat_no/", 1 for "/user/user_no/" */
+ /* +1][PREFIX_MAX_SIZE] <=> + "node" */
+ static str_t prefixesKey[((PERSADMIN_NO_OF_USERS)*(PERSADMIN_NO_OF_SEATS+1))+1][PREFIX_MAX_SIZE] ;
+ /* +1+2][PREFIX_MAX_SIZE] <=> + "node", "defaultData", "configurableDefaultData" */
+ static str_t prefixesFile[((PERSADMIN_NO_OF_USERS)*(PERSADMIN_NO_OF_SEATS+1))+1+2][PREFIX_MAX_SIZE] ;
+ static sint_t iNoOfPrefixesKey = 0;
+ static sint_t iNoOfPrefixesFile = 0;
+ static bool_t bFirstCall = true ;
+ sint_t i, j ; /* indexes to be used in loops */
+
+ if(bFirstCall)
+ {
+ /**************************************************
+ * The idea is to obtain something like this:
+ *
+ * str_t prefixesKey[][PREFIX_MAX_SIZE] =
+ * {
+ * "/user/1/seat/1/",
+ * "/user/1/seat/2/",
+ * ................
+ * "/user/4/seat/4/",
+ * "/user/1/",
+ * .........
+ * "/user/4/",
+ * "/node"
+ * } ;
+ *
+ * str_t prefixesFile[][PREFIX_MAX_SIZE] =
+ * {
+ * "user/1/seat/1/",
+ * "user/1/seat/2/",
+ * ................
+ * "user/4/seat/4/",
+ * "user/1/",
+ * .........
+ * "user/4/",
+ * "node",
+ * "defaultData",
+ * "configurableDefaultData"
+ * } ;
+ ****************************************************/
+
+ bFirstCall = false ; /* do it only once */
+
+ for(i = PERSADMIN_MIN_USER_NO ; i <= PERSADMIN_MAX_USER_NO ; i++)
+ {
+ for(j = PERSADMIN_MIN_SEAT_NO ; j <= PERSADMIN_MAX_SEAT_NO ; j++)
+ {
+ (void)snprintf(&prefixesKey[(i-PERSADMIN_MIN_USER_NO)*PERSADMIN_NO_OF_USERS + (j - PERSADMIN_MIN_SEAT_NO)][0], PREFIX_MAX_SIZE, "%s/%d/%s/%d/",
+ ("/"PERS_ORG_USER_FOLDER_NAME), i, PERS_ORG_SEAT_FOLDER_NAME, j) ;
+ (void)snprintf(&prefixesFile[(i-PERSADMIN_MIN_USER_NO)*PERSADMIN_NO_OF_USERS + (j - PERSADMIN_MIN_SEAT_NO)][0], PREFIX_MAX_SIZE, "%s/%d/%s/%d/",
+ (PERS_ORG_USER_FOLDER_NAME), i, PERS_ORG_SEAT_FOLDER_NAME, j) ;
+ }
+ }
+ for(i = PERSADMIN_MIN_USER_NO ; i <= PERSADMIN_MAX_USER_NO ; i++)
+ {
+ (void)snprintf(&prefixesKey[(PERSADMIN_NO_OF_USERS*PERSADMIN_NO_OF_SEATS-1)+i][0], PREFIX_MAX_SIZE, "%s/%d/",
+ ("/"PERS_ORG_USER_FOLDER_NAME) , i) ;
+ (void)snprintf(&prefixesFile[(PERSADMIN_NO_OF_USERS*PERSADMIN_NO_OF_SEATS-1)+i][0], PREFIX_MAX_SIZE, "%s/%d/",
+ PERS_ORG_USER_FOLDER_NAME , i) ;
+ }
+ (void)snprintf(&prefixesKey[PERSADMIN_NO_OF_USERS*(PERSADMIN_NO_OF_SEATS+1)][0], PREFIX_MAX_SIZE, "%s/",
+ PERS_ORG_NODE_FOLDER_NAME_) ;
+ (void)snprintf(&prefixesFile[PERSADMIN_NO_OF_USERS*(PERSADMIN_NO_OF_SEATS+1)][0], PREFIX_MAX_SIZE, "%s/",
+ PERS_ORG_NODE_FOLDER_NAME) ;
+
+ /* prefixes relevant only for file type resources */
+ (void)snprintf(&prefixesFile[PERSADMIN_NO_OF_USERS*(PERSADMIN_NO_OF_SEATS+1)+1][0], PREFIX_MAX_SIZE, "%s/", PERS_ORG_DEFAULT_DATA_FOLDER_NAME) ;
+ (void)snprintf(&prefixesFile[PERSADMIN_NO_OF_USERS*(PERSADMIN_NO_OF_SEATS+1)+2][0], PREFIX_MAX_SIZE, "%s/", PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME) ;
+
+ iNoOfPrefixesKey = sizeof(prefixesKey)/sizeof(prefixesKey[0]) ;
+ iNoOfPrefixesFile = sizeof(prefixesFile)/sizeof(prefixesFile[0]) ;
+ }
+
+ while((iPosInUnfilteredBuf < psListUnfiltered->sizeOfList) && bEverythingOK)
+ {
+ pstr_t pFilenameToBeFiltered = psListUnfiltered->pList + iPosInUnfilteredBuf ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ sint_t iLengthFilenameToBeFiltered = (sint_t)strlen(pFilenameToBeFiltered) ;
+ bool_t bFilenameFilteredIn = false ;
+ pstr_t pFoundString = NIL ;
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s pos=%d len=%d <%s>",
+ __FUNCTION__, iPosInUnfilteredBuf, iLengthFilenameToBeFiltered, pFilenameToBeFiltered) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ /* scan pFilenameToBeFiltered to see if a sequence matches searchString */
+ pFoundString = strstr(pFilenameToBeFiltered, resourceID) ;
+ if(NIL != pFoundString)
+ {
+ sint_t iNoOfPrefixesToCheck = bIsKeyType ? iNoOfPrefixesKey : iNoOfPrefixesFile ;
+ if( (! bIsKeyType) && bFilterOnlyNonDefault)
+ {
+ /* don't filter in default data */
+ iNoOfPrefixesToCheck = iNoOfPrefixesFile - 2 ; /* 2 <=> defaultData and configurableDefaultData */
+ }
+
+ /* sequence found, make sure that the path is valid and avoid collision with other files with names close to this one */
+ for(i = 0 ; i < iNoOfPrefixesToCheck ; i++)
+ {
+ (void)snprintf(searchString, sizeof(searchString), "%s%s", bIsKeyType ? &prefixesKey[i][0] : &prefixesFile[i][0], resourceID) ;
+
+ (void)snprintf(g_msg, sizeof(g_msg), "%s <%s> vs <%s> vs <%s>",
+ __FUNCTION__, searchString, resourceID, pFilenameToBeFiltered) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ if(0 == strcmp(searchString, pFilenameToBeFiltered))
+ {
+ bFilenameFilteredIn = true ;
+ break ;
+ }
+ }
+ }
+
+ if(bFilenameFilteredIn)
+ {
+ (void)strcpy(pListFiltered_out+iPosInFilteredBuf, pFilenameToBeFiltered) ; /*DG C8MR2R-MISRA-C:2004 Rule 17.4-SSW_Administrator_0006*/
+ iPosInFilteredBuf += (iLengthFilenameToBeFiltered + 1) ; /* 1 <=> '\0' */
+ (void)snprintf(g_msg, sizeof(g_msg), "%s Filtered in <%s> <%s> size=%d pos=%d",
+ __FUNCTION__, pFilenameToBeFiltered, resourceID, strlen(pFilenameToBeFiltered), iPosInFilteredBuf) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ iPosInUnfilteredBuf += (iLengthFilenameToBeFiltered + 1) ; /* 1 <=> '\0' */
+ }
+
+ if(bEverythingOK)
+ {
+ iFilteredBufSize = iPosInFilteredBuf;
+ }
+
+ return iFilteredBufSize ;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
diff --git a/Administrator/src/ssw_pers_admin_restore_default.c b/Administrator/src/ssw_pers_admin_restore_default.c
new file mode 100644
index 0000000..20b106e
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_restore_default.c
@@ -0,0 +1,1610 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of recovery process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.04.15 uidu0250 CSP_WZ#3424: Initial version
+*
+**********************************************************************************************************************/
+
+/* ---------------------- include files --------------------------------- */
+#include "persComTypes.h"
+#include "string.h"
+#include "stdlib.h"
+#include <dlt/dlt.h>
+
+#include "persComDataOrg.h"
+#include "persistence_admin_service.h"
+#include "ssw_pers_admin_files_helper.h"
+#include "ssw_pers_admin_database_helper.h"
+#include "ssw_pers_admin_common.h"
+#include "ssw_pers_admin_service.h"
+
+
+/* ---------- local defines, macros, constants and type definitions ------------ */
+#define PAS_ITEM_LIST_DELIMITER '\0'
+
+#define PAS_SHARED_PUBLIC_PATH PERS_ORG_SHARED_FOLDER_NAME"/"PERS_ORG_PUBLIC_FOLDER_NAME
+
+
+#define PAS_MAX_LIST_DB_SIZE (32 * 1024)
+
+#define LT_HDR "RESTORE DEFAULT>>"
+
+
+
+/* ----------global variables. initialization of global contexts ------------ */
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+
+/* ---------------------- local functions ---------------------------------- */
+/**
+ * \brief Allow recovery of default data on application level -> (node+user).(application)
+ *
+ * \param defaultSource source of the default to allow reset
+ * \param appId the application identifier
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_appl_data(PersASDefaultSource_e defaultSource,
+ pstr_t appId );
+
+
+/**
+ * \brief Allow recovery of default data on user level -> (user).(application+shared)
+ *
+ * \param defaultSource source of the default to allow reset
+ * \param appId the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_user_data( PersASDefaultSource_e defaultSource,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no );
+
+
+/**
+ * \brief Allow restore all data to default values -> (node+user).(application+shared)
+ *
+ * \param defaultSource source of the default to allow reset
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_all_data( PersASDefaultSource_e defaultSource );
+
+
+/**
+ * \brief Allow recovery of default data on application level for the node section
+ *
+ * \param appId the application identifier
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_appl_node( pstr_t appId );
+
+
+/**
+ * \brief Allow recovery of default data on application level for the user section (all or a specific user)
+ *
+ * \param defaultSource source of the default to allow reset
+ * \param appId the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_appl_user( PersASDefaultSource_e defaultSource,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+/**
+ * \brief Allow recovery of default local user data for the selected user_no (all or a specific user)
+ *
+ * \param defaultSource source of the default to allow reset
+ * \param appId the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_user_local_data(PersASDefaultSource_e defaultSource,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+/**
+ * \brief Allow recovery of default shared user data for the selected user_no (all or a specific user)
+ *
+ * \param type restore type
+ * \param defaultSource source of the default to allow reset
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_user_shared_data( PersASSelectionType_e type,
+ PersASDefaultSource_e defaultSource,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+/**
+ * \brief Allow recovery of default user public files for the selected user_no (all or a specific user)
+ *
+ * \param defaultSource source of the default to allow reset
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_user_public_files( PersASDefaultSource_e defaultSource,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+/**
+ * \brief Allow recovery of default user group files for the selected user_no (all or a specific user)
+ *
+ * \param defaultSource source of the default to allow reset
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_user_group_files( PersASDefaultSource_e defaultSource,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+/**
+ * \brief Allow restore of default shared data not related to user
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_non_user_shared_data(void);
+
+
+/**
+ * \brief Allow restore of default local keys for the selected applicationId and/or user_no (all or a specific user)
+ *
+ * \param type recovery type
+ * \param defaultSource source of the default to allow reset
+ * \param appId the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_local_keys( PersASSelectionType_e type,
+ PersASDefaultSource_e defaultSource,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+
+/**
+ * \brief Allow restore of default shared keys for the selected applicationId and/or user_no (all or a specific user)
+ *
+ * \param type recovery type
+ * \param defaultSource source of the default to allow reset
+ * \param appId the application identifier
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return 0 for success; negative value: error code
+ */
+static sint_t persadmin_restore_default_shared_keys(PersASSelectionType_e type,
+ PersASDefaultSource_e defaultSource,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+
+/**
+ * \brief Forms the user path (by appending) according to the provided user_no and seat_no
+ *
+ * \param parentUserPath an application/group/public path
+ * \param parentUserPathLength the size of the parentUserPath in characters. Should be able to accommodate the additional user/seat info
+ * \param user_no the user ID
+ * \param seat_no the seat ID
+ *
+ * \return void
+ */
+static void persadmin_restore_set_user_path(pstr_t parentUserPath,
+ uint_t parentUserPathLength,
+ uint32_t user_no,
+ uint32_t seat_no);
+
+
+
+/**
+* \brief Allow restore of default values on different level (application, user or complete)
+*
+* \param type represents the quality of the data to backup: all, application, user
+* \param defaultSource source of the default data to reset
+* \param applicationID the application identifier
+* \param user_no the user ID
+* \param seat_no the seat number (seat 0 to 3)
+*
+* \return 0 for success; negative value: error code (\ref PAS_RETURNS)
+*/
+long persadmin_data_restore_to_default( PersASSelectionType_e type,
+ PersASDefaultSource_e defaultSource,
+ const char* applicationID,
+ unsigned int user_no,
+ unsigned int seat_no)
+{
+ if(NIL == applicationID)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_data_restore_to_default call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ }
+
+ switch(type)
+ {
+
+ case PersASSelectionType_All:
+ {
+ return (long)persadmin_restore_default_all_data( defaultSource );
+ }
+ break;
+
+ case PersASSelectionType_User:
+ {
+ return (long)persadmin_restore_default_user_data(defaultSource,
+ (pstr_t)applicationID,
+ (uint32_t)user_no,
+ (uint32_t)seat_no);
+ }
+ break;
+
+ case PersASSelectionType_Application:
+ {
+ return (long)persadmin_restore_default_appl_data( defaultSource,
+ (pstr_t)applicationID );
+ }
+ break;
+
+ default:
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_data_restore_to_default call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ break; // redundant
+ }
+}
+
+
+//---------------------------------------------------------------
+static void persadmin_restore_set_user_path(pstr_t parentUserPath,
+ uint_t parentUserPathLength,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ pstr_t pTempSrcUserPath = NIL;
+
+ pTempSrcUserPath = (pstr_t)malloc(parentUserPathLength * sizeof(*parentUserPath));/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pTempSrcUserPath)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Failed to allocate memory for user path."));
+ }
+ else
+ {
+ if(NIL != parentUserPath)
+ {
+ // all users & all seats;
+ if( (PERSIST_SELECT_ALL_USERS == user_no) && (PERSIST_SELECT_ALL_SEATS == seat_no) )
+ {
+ /* <parentUserPath>/user */
+ (void)snprintf(pTempSrcUserPath, parentUserPathLength, "%s%s", parentUserPath, gUser);
+ }
+ // only one user & all seats;
+ if( (PERSIST_SELECT_ALL_USERS != user_no) && (PERSIST_SELECT_ALL_SEATS == seat_no) )
+ {
+ /* <parentUserPath>/user/<user> */
+ (void)snprintf(pTempSrcUserPath, parentUserPathLength, "%s%s%d", parentUserPath, gUser, user_no);
+ }
+ // only one user & one seat;
+ if( (PERSIST_SELECT_ALL_USERS != user_no) && (PERSIST_SELECT_ALL_SEATS != seat_no) )
+ {
+ /* <parentUserPath>/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pTempSrcUserPath, parentUserPathLength, "%s%s%d%s%d", parentUserPath, gUser, user_no, gSeat, seat_no);
+ }
+
+ (void)snprintf(parentUserPath, parentUserPathLength, "%s", pTempSrcUserPath);
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_set_user_path call."));
+ }
+
+ free(pTempSrcUserPath);/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ }
+}
+
+
+//---------------------------------------------------------------
+static sint_t persadmin_restore_default_appl_node( pstr_t appId ) // could use an 'extended' app path
+{
+ sint_t retVal;
+ str_t pNodeDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+ if(NIL == appId)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_default_appl_node call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore default node content for:"),
+ DLT_STRING(appId));
+
+
+ /* app node dest path */
+
+ /* /Data/mnt-c/<appId>/node */
+ (void)snprintf(pNodeDestPath, sizeof(pNodeDestPath), gLocalCachePath, appId, gNode);
+
+ /* erase node content */
+ if(PAS_SUCCESS == persadmin_check_if_file_exists(pNodeDestPath, true))
+ {
+ retVal = persadmin_delete_folder(pNodeDestPath);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_folder call failed with error code:"),
+ DLT_INT(retVal),
+ DLT_STRING("for"),
+ DLT_STRING(pNodeDestPath));
+ return retVal;
+ }
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully default node content for:"),
+ DLT_STRING(appId),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+}
+
+
+//-----------------------------------------------------------------------
+static sint_t persadmin_restore_default_appl_user( PersASDefaultSource_e defaultSource,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+ str_t pUserDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pConfDefaultPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+ if(NIL == appId)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_default_appl_user call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore default user content for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("Seat:"),
+ DLT_UINT8(seat_no));
+
+ /* user dest path */
+ /* /Data/mnt-c/<appId>/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pUserDestPath, sizeof(pUserDestPath), gLocalCachePath, appId, "");
+ persadmin_restore_set_user_path(pUserDestPath,
+ sizeof(pUserDestPath)/sizeof(*pUserDestPath),
+ user_no,
+ seat_no);
+
+ /* erase user content */
+ if(PAS_SUCCESS == persadmin_check_if_file_exists(pUserDestPath, true))
+ {
+ retVal = persadmin_delete_folder(pUserDestPath);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_folder call failed with error code:"),
+ DLT_INT(retVal),
+ DLT_STRING("for"),
+ DLT_STRING(pUserDestPath));
+ return retVal;
+ }
+ }
+
+ if(PersASDefaultSource_Factory == defaultSource)
+ {
+ /* delete configurableDefaultUserData folder */
+
+ /* /Data/mnt-c/<appId>/configurableDefaultUserData */
+ (void)snprintf(pConfDefaultPath, sizeof(pConfDefaultPath), gLocalCachePath, appId, PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_);
+
+ if(PAS_SUCCESS == persadmin_check_if_file_exists(pConfDefaultPath, true))
+ {
+ retVal = persadmin_delete_folder(pConfDefaultPath);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Failed to delete folder:"),
+ DLT_STRING(pConfDefaultPath));
+ return retVal;
+ }
+ }
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully default user content for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//-------------------------------------------------------------------------------------
+static sint_t persadmin_restore_default_non_user_shared_data(void)
+{
+ sint_t retVal;
+ str_t pExtendedAppId [PERS_ORG_MAX_LENGTH_PATH_FILENAME]; // group path
+ sint_t listBuffSize = 0;
+ pstr_t pStrList = NIL;
+ pstr_t pItemName = NIL;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore default non-user shared data"));
+
+ /* --- public file/folder restore --- */
+ retVal = persadmin_restore_default_appl_node( PAS_SHARED_PUBLIC_PATH );
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_appl_node call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ /* --- group file/folder restore --- */
+
+ /* Check all groups */
+ retVal = persadmin_list_folder_get_size(PERS_ORG_SHARED_GROUP_CACHE_PATH,
+ PersadminFilterFolders,
+ false );
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_folder_get_size call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ listBuffSize = retVal;
+
+ if(listBuffSize > 0)
+ {
+ pStrList = NIL;
+ pStrList = (pstr_t)malloc((uint_t)(listBuffSize * sizeof(*pStrList))); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pStrList)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error allocating memory for list of folders."));
+ return PAS_FAILURE_OUT_OF_MEMORY;
+ }
+ (void)memset(pStrList, 0, (uint_t)(listBuffSize * sizeof(*pStrList)));
+
+ retVal = persadmin_list_folder( PERS_ORG_SHARED_GROUP_CACHE_PATH,
+ pStrList,
+ listBuffSize,
+ PersadminFilterFolders,
+ false);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error obtaining the list of folders."));
+ free(pStrList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ return retVal;
+ }
+
+ pItemName = pStrList;
+ while(listBuffSize > 0)
+ {
+ if(0 == strlen(pItemName))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid folder item found"));
+ break;
+ }
+
+ /* Restore the default node content for every group */
+
+ /* shared/group/<group_id> */
+ (void)snprintf(pExtendedAppId, sizeof(pExtendedAppId), "%s/%s/%s", PERS_ORG_SHARED_FOLDER_NAME, PERS_ORG_GROUP_FOLDER_NAME, pItemName);
+
+ retVal = persadmin_restore_default_appl_node( pExtendedAppId);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_appl_node call failed with error code:"),
+ DLT_INT(retVal));
+ free(pStrList);/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ return retVal;
+ }
+
+ listBuffSize -= ((sint_t)strlen(pItemName) + 1) * (sint_t)sizeof(*pItemName);
+ pItemName += (strlen(pItemName) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+
+ free(pStrList);/*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored default non-user shared data."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//--------------------------------------------------------------------------
+static sint_t persadmin_restore_default_user_public_files( PersASDefaultSource_e defaultSource,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+ str_t pConfDefaultPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pUserDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore default user public files"),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+ /* --- public file/folder restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("public file/folder restore..."));
+
+ /* /Data/mnt-c/shared/public/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pUserDestPath, sizeof(pUserDestPath), "%s", PERS_ORG_SHARED_PUBLIC_CACHE_PATH);
+ persadmin_restore_set_user_path(pUserDestPath,
+ sizeof(pUserDestPath)/sizeof(*pUserDestPath),
+ user_no,
+ seat_no);
+
+ /* erase user content */
+ if(PAS_SUCCESS == persadmin_check_if_file_exists(pUserDestPath, true))
+ {
+ retVal = persadmin_delete_folder(pUserDestPath);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_folder call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+ }
+
+ if(PersASDefaultSource_Factory == defaultSource)
+ {
+ /* delete configurableDefaultUserData folder */
+
+ /* /Data/mnt-c/shared/public/configurableDefaultUserData */
+ (void)snprintf(pConfDefaultPath, sizeof(pConfDefaultPath), "%s%s", PERS_ORG_SHARED_PUBLIC_CACHE_PATH, PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_);
+
+ if(PAS_SUCCESS == persadmin_check_if_file_exists(pConfDefaultPath, true))
+ {
+ retVal = persadmin_delete_folder(pConfDefaultPath);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Failed to delete folder:"),
+ DLT_STRING(pConfDefaultPath));
+ return retVal;
+ }
+ }
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully default user public files"),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//--------------------------------------------------------------------------
+static sint_t persadmin_restore_default_user_group_files( PersASDefaultSource_e defaultSource,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+ str_t pConfDefaultPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pUserDestPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ pstr_t pStrList = NIL;
+ pstr_t pItemName = NIL;
+ sint_t listBuffSize = 0;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore default user group files"),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+ /* Check all groups */
+ retVal = persadmin_list_folder_get_size(PERS_ORG_SHARED_GROUP_CACHE_PATH,
+ PersadminFilterFolders,
+ false );
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_folder_get_size call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+ if(0 == retVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR),
+ DLT_STRING("No content to restore for user group files"),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."));
+ return retVal;
+ }
+
+ listBuffSize = retVal;
+
+ pStrList = NIL;
+ pStrList = (pstr_t)malloc((uint_t)(listBuffSize * sizeof(*pStrList))); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pStrList)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error allocating memory for list of folders."));
+ return PAS_FAILURE_OUT_OF_MEMORY;
+ }
+ (void)memset(pStrList, 0, (uint_t)(listBuffSize * sizeof(*pStrList)));
+
+ retVal = persadmin_list_folder( PERS_ORG_SHARED_GROUP_CACHE_PATH,
+ pStrList,
+ listBuffSize,
+ PersadminFilterFolders,
+ false);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error obtaining the list of folders."));
+ free(pStrList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ return retVal;
+ }
+
+ pItemName = pStrList;
+ while(listBuffSize > 0)
+ {
+ if(0 == strlen(pItemName))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid group name found."));
+ break;
+ }
+
+ /* Restore the user content for every group */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("restore default user content for group"),
+ DLT_STRING(pItemName),
+ DLT_STRING(" ..."));
+
+ /* /Data/mnt-c/shared/group/<group_id>/user/<user_no>/seat/<seat_no> */
+ (void)snprintf(pUserDestPath, sizeof(pUserDestPath), PERS_ORG_SHARED_CACHE_PATH_STRING_FORMAT, pItemName, "");
+ persadmin_restore_set_user_path(pUserDestPath,
+ sizeof(pUserDestPath) / sizeof(*pUserDestPath),
+ user_no,
+ seat_no);
+
+ /* erase user content */
+ if(PAS_SUCCESS == persadmin_check_if_file_exists(pUserDestPath, true))
+ {
+ retVal = persadmin_delete_folder(pUserDestPath);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_folder call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+ }
+
+ if(PersASDefaultSource_Factory == defaultSource)
+ {
+ /* delete configurableDefaultUserData folder */
+
+ /* /Data/mnt-c/shared/group/<group_id>/configurableDefaultData */
+ (void)snprintf(pConfDefaultPath, sizeof(pConfDefaultPath), PERS_ORG_SHARED_CACHE_PATH_STRING_FORMAT, pItemName, PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_);
+
+ if(PAS_SUCCESS == persadmin_check_if_file_exists(pConfDefaultPath, true))
+ {
+ retVal = persadmin_delete_folder(pConfDefaultPath);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Failed to delete folder:"),
+ DLT_STRING(pConfDefaultPath));
+
+ free(pStrList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+ return retVal;
+ }
+ }
+ }
+
+ listBuffSize -= ((sint_t)strlen(pItemName) + 1) * (sint_t)sizeof(*pItemName);
+ pItemName += (strlen(pItemName) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+
+ free(pStrList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pStrList = NIL;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully default user group files"),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//--------------------------------------------------------------------------
+static sint_t persadmin_restore_default_user_local_data(PersASDefaultSource_e defaultSource,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+ sint_t listBuffSize = 0;
+ pstr_t pAppNameList = NIL;
+ pstr_t pAppName = NIL;
+
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore default user local data"),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT32(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT32(seat_no));
+
+ /* Restore default values for a specific application only */
+ if(0 != strcmp(appId, ""))
+ {
+ /* user_no for every app */
+ retVal = persadmin_restore_default_appl_user( defaultSource,
+ appId,
+ user_no,
+ seat_no );
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_appl_user call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ /* user_no for local keys */
+ retVal = persadmin_restore_default_local_keys( PersASSelectionType_User,
+ defaultSource,
+ appId,
+ user_no,
+ seat_no);
+
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_local_keys call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully user local data "),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+ }
+
+
+ /* Get list of application names */
+ retVal = persadmin_list_application_folders_get_size("");
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_application_folders_get_size call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ if(0 == retVal) /* size of path collection is 0 */
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR),
+ DLT_STRING("No application found."));
+ return retVal;
+ }
+
+ listBuffSize = retVal;
+
+ pAppNameList = NIL;
+ pAppNameList = (pstr_t) malloc((uint_t)(listBuffSize * sizeof(*pAppNameList))); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pAppNameList)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error allocating memory for App name list."));
+ return PAS_FAILURE_OUT_OF_MEMORY;
+ }
+ (void)memset(pAppNameList, 0, (uint_t)(listBuffSize * sizeof(*pAppNameList)));
+
+ retVal = persadmin_list_application_folders("",
+ pAppNameList,
+ listBuffSize );
+
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_application_folders call failed with error code:"),
+ DLT_INT(retVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+
+ if(retVal > listBuffSize)
+ {
+ return PAS_FAILURE;
+ }
+
+ return retVal;
+ }
+
+ listBuffSize = retVal;
+ pAppName = pAppNameList;
+ while(listBuffSize > 0)
+ {
+ if(0 == strlen(pAppName))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid app name found."));
+ break;
+ }
+
+ /* user_no for every app */
+ retVal = persadmin_restore_default_appl_user( defaultSource,
+ pAppName,
+ user_no,
+ seat_no );
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_appl_user call failed with error code:"),
+ DLT_INT(retVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return retVal;
+ }
+
+ /* user_no for local keys */
+ retVal = persadmin_restore_default_local_keys( PersASSelectionType_User,
+ defaultSource,
+ pAppName,
+ user_no,
+ seat_no);
+
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_local_keys call failed with error code:"),
+ DLT_INT(retVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return retVal;
+ }
+
+ listBuffSize -= ((sint_t)strlen(pAppName) + 1) * (sint_t)sizeof(*pAppName);
+ pAppName += (strlen(pAppName) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully user local data "),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//--------------------------------------------------------------------------
+static sint_t persadmin_restore_default_user_shared_data( PersASSelectionType_e type,
+ PersASDefaultSource_e defaultSource,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore default user shared data"),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+ /* --- public user files restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("public file/folder restore..."));
+
+ retVal = persadmin_restore_default_user_public_files( defaultSource,
+ user_no,
+ seat_no);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_user_public_files call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ /* --- group user files restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("group file/folder restore..."));
+
+ retVal = persadmin_restore_default_user_group_files(defaultSource,
+ user_no,
+ seat_no);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_user_group_files call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ /* --- shared key-value restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("restore default shared keys"),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("..."));
+
+ retVal = persadmin_restore_default_shared_keys( type,
+ defaultSource,
+ "",
+ user_no,
+ seat_no);
+
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_shared_keys call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully default user shared data"),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//-------------------------------------------------------------------------
+static sint_t persadmin_restore_default_local_keys( PersASSelectionType_e type,
+ PersASDefaultSource_e defaultSource,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+ str_t pDestDBPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+
+ if(NIL == appId)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_default_local_keys call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore default local keys for:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+ /* cache dest. db. path */
+ /* /Data/mnt-c/<appId>/cached.itz */
+ (void)snprintf(pDestDBPath, sizeof(pDestDBPath), gLocalCachePath, appId, PERS_ORG_LOCAL_CACHE_DB_NAME_);
+
+ /* delete the keys in the cache dest. DB */
+ retVal = persadmin_delete_keys_by_filter( type,
+ pDestDBPath,
+ user_no,
+ seat_no);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_keys_by_filter call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+
+ /* wt dest. db. path */
+ /* /Data/mnt-c/<appId>/wt.itz */
+ (void)snprintf(pDestDBPath, sizeof(pDestDBPath), gLocalCachePath, appId, PERS_ORG_LOCAL_WT_DB_NAME_);
+
+ /* delete the keys in the wt dest. DB */
+ retVal = persadmin_delete_keys_by_filter( type,
+ pDestDBPath,
+ user_no,
+ seat_no);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_keys_by_filter call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+
+ if(PersASDefaultSource_Factory == defaultSource)
+ {
+ /* delete configurable-default-data.itz */
+
+ /* /Data/mnt-c/<appId>/configurable-default-data.itz */
+ (void)snprintf(pDestDBPath, sizeof(pDestDBPath), gLocalCachePath, appId, PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_);
+
+ if(PAS_SUCCESS == persadmin_check_if_file_exists( pDestDBPath, false))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Removing file:"),
+ DLT_STRING(pDestDBPath));
+
+ retVal = persadmin_delete_file(pDestDBPath);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Failed to delete file:"),
+ DLT_STRING(pDestDBPath));
+ return retVal;
+ }
+ }
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully default local keys for:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//-------------------------------------------------------------------------
+static sint_t persadmin_restore_default_shared_keys(PersASSelectionType_e type,
+ PersASDefaultSource_e defaultSource,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no)
+{
+ sint_t retVal;
+ str_t pDBFileName [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pDestDBParentPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ str_t pConfDefaultDBPath [PERS_ORG_MAX_LENGTH_PATH_FILENAME];
+ pstr_t pDestDBPath = NIL;
+ str_t pDBList [PAS_MAX_LIST_DB_SIZE];
+
+ if(NIL == appId)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_default_shared_keys call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore default shared keys"),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+
+ retVal = persadmin_get_all_db_paths_with_names( "",
+ appId,
+ PersistenceStorage_shared,
+ pDBList,
+ PAS_MAX_LIST_DB_SIZE);
+
+ if(retVal <= 0)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_get_all_db_paths_with_names call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ pDestDBPath = pDBList;
+ while(PAS_ITEM_LIST_DELIMITER != (*pDestDBPath))
+ {
+ (void)memset(pDBFileName, 0, sizeof(pDBFileName));
+
+ retVal = persadmin_get_filename(pDestDBPath,
+ pDBFileName,
+ sizeof(pDBFileName));
+
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_get_filename call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ /* filter only the cached.itz and wt.itz databases */
+ if(0 != strcmp(pDBFileName, PERS_ORG_SHARED_CACHE_DB_NAME))
+ {
+ if(0 != strcmp(pDBFileName, PERS_ORG_SHARED_WT_DB_NAME))
+ {
+ pDestDBPath += (strlen(pDestDBPath) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ continue;
+ }
+ }
+
+
+ /* delete the keys in the dest. DB */
+ retVal = persadmin_delete_keys_by_filter( type,
+ pDestDBPath,
+ user_no,
+ seat_no);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_delete_keys_by_filter call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+
+ if(PersASDefaultSource_Factory == defaultSource)
+ {
+ /* delete configurable-default-data.itz */
+ (void)snprintf(pDestDBParentPath, (strlen(pDestDBPath)- strlen(pDBFileName) + 1) * sizeof(*pDestDBParentPath), "%s", pDestDBPath);
+
+ /* default configurable-default-data.itz source db. path */
+ (void)snprintf(pConfDefaultDBPath, sizeof(pConfDefaultDBPath), "%s%s", pDestDBParentPath, PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME);
+
+ if(PAS_SUCCESS == persadmin_check_if_file_exists(pConfDefaultDBPath, false))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Removing file:"),
+ DLT_STRING(pConfDefaultDBPath));
+
+ retVal = persadmin_delete_file(pConfDefaultDBPath);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Failed to delete file:"),
+ DLT_STRING(pConfDefaultDBPath));
+ return retVal;
+ }
+ }
+ }
+
+ pDestDBPath += (strlen(pDestDBPath) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully default shared keys"),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//---------------------------------------------------------------------------
+static sint_t persadmin_restore_default_appl_data(PersASDefaultSource_e defaultSource,
+ pstr_t appId )
+{
+ sint_t retVal;
+
+ if(NIL == appId)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_default_appl_data call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ }
+
+ switch(defaultSource)
+ {
+ case PersASDefaultSource_Factory:
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore factory default app data for App:"),
+ DLT_STRING(appId));
+ break;
+
+ case PersASDefaultSource_Configurable:
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore configurable default app data for App:"),
+ DLT_STRING(appId));
+ break;
+ default:
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_default_appl_data call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ break; /* redundant */
+ }
+
+
+ /* --- local file/folder restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("local file/folder restore..."));
+
+
+ /* restore default node content */
+ retVal = persadmin_restore_default_appl_node((pstr_t)appId);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_appl_node call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+
+ /* restore default user content (for all users) */
+ retVal = persadmin_restore_default_appl_user( defaultSource,
+ (pstr_t)appId,
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_appl_user call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+
+ /* --- local key-value restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("local key/value restore..."));
+
+ retVal = persadmin_restore_default_local_keys( PersASSelectionType_Application,
+ defaultSource,
+ appId,
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_local_keys call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully default app data for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+//---------------------------------------------------------------------------
+static sint_t persadmin_restore_default_user_data( PersASDefaultSource_e defaultSource,
+ pstr_t appId,
+ uint32_t user_no,
+ uint32_t seat_no )
+{
+ sint_t retVal;
+
+ if(NIL == appId)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_default_user_data call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ }
+
+ switch(defaultSource)
+ {
+ case PersASDefaultSource_Factory:
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore factory default user data"),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("not supported."));
+ return PAS_FAILURE_OPERATION_NOT_SUPPORTED;
+ break; /* redundant */
+
+ case PersASDefaultSource_Configurable:
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore configurable default user data"),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no));
+ break;
+
+ default:
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_default_user_data call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ break; /* redundant */
+ }
+
+
+ /* --- local user data restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("default local user data restore..."));
+
+ retVal = persadmin_restore_default_user_local_data( defaultSource,
+ appId,
+ user_no,
+ seat_no);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_user_local_data call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ if(0 == strcmp(appId, ""))
+ {
+ /* --- shared user data restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("default shared user data restore..."));
+
+ retVal = persadmin_restore_default_user_shared_data( PersASSelectionType_User,
+ defaultSource,
+ user_no,
+ seat_no);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_user_shared_data call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully default user data"),
+ DLT_STRING("for App:"),
+ DLT_STRING(appId),
+ DLT_STRING("for User:"),
+ DLT_UINT8(user_no),
+ DLT_STRING("for Seat:"),
+ DLT_UINT8(seat_no),
+ DLT_STRING("."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+
+//---------------------------------------------------------------------------
+static sint_t persadmin_restore_default_all_data( PersASDefaultSource_e defaultSource )
+{
+ sint_t retVal;
+ sint_t listBuffSize = 0;
+ pstr_t pAppNameList = NIL;
+ pstr_t pAppName = NIL;
+
+
+ switch(defaultSource)
+ {
+ case PersASDefaultSource_Factory:
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore all factory default data"));
+ break;
+
+ case PersASDefaultSource_Configurable:
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore all configurable default data"));
+ break;
+
+ default:
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid parameter in persadmin_restore_default_all_data call."));
+ return PAS_FAILURE_INVALID_PARAMETER;
+ break; /* redundant */
+ }
+
+
+ /* --- local data restore --- */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("local data restore..."));
+
+ /* Get the list of application names */
+ retVal = persadmin_list_application_folders_get_size("");
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_application_folders_get_size call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ if(0 == retVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR),
+ DLT_STRING("No application found."));
+ return retVal;
+ }
+
+ listBuffSize = retVal;
+
+ pAppNameList = (pstr_t) malloc((uint_t)(listBuffSize * sizeof(*pAppNameList))); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ if(NIL == pAppNameList)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("Error allocating memory for apps name list."));
+ return PAS_FAILURE_OUT_OF_MEMORY;
+ }
+ (void)memset(pAppNameList, 0, (uint_t)(listBuffSize * sizeof(*pAppNameList)));
+
+ retVal = persadmin_list_application_folders("",
+ pAppNameList,
+ listBuffSize );
+
+ if((retVal < PAS_SUCCESS) || (retVal > listBuffSize))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_list_application_folders call failed with error code:"),
+ DLT_INT(retVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return retVal;
+ }
+
+ pAppName = pAppNameList;
+ while(listBuffSize > 0)
+ {
+ if(0 == strlen(pAppName))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING(LT_HDR),
+ DLT_STRING("Invalid app name found."));
+ break;
+ }
+
+ /* local app data */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("local app data restore..."));
+
+ retVal = persadmin_restore_default_appl_data( defaultSource,
+ pAppName );
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_appl_data call failed with error code:"),
+ DLT_INT(retVal));
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+ return retVal;
+ }
+
+ listBuffSize -= ((sint_t)strlen(pAppName) + 1) * (sint_t)sizeof(*pAppName);
+ pAppName += (strlen(pAppName) + 1); // MISRA-C:2004 Rule 17.4 Performing pointer arithmetic. - Rule currently not accepted
+ }
+ free(pAppNameList); /*DG C8MR2R-MISRA-C:2004 Rule 20.4-SSW_Administrator_0002*/
+ pAppNameList = NIL;
+
+
+ /* non-user shared data */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("restore non-user shared data..."));
+
+ retVal = persadmin_restore_default_non_user_shared_data();
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_non_user_shared_data call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+ /* user shared data */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("restore user shared data..."));
+
+ retVal = persadmin_restore_default_user_shared_data( PersASSelectionType_All,
+ defaultSource,
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ if(retVal < PAS_SUCCESS)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING("persadmin_restore_default_user_shared_data call failed with error code:"),
+ DLT_INT(retVal));
+ return retVal;
+ }
+
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR),
+ DLT_STRING("Restored successfully all default data."));
+
+ return PAS_SUCCESS;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
diff --git a/Administrator/src/ssw_pers_admin_service.c b/Administrator/src/ssw_pers_admin_service.c
new file mode 100644
index 0000000..89c308e
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_service.c
@@ -0,0 +1,1092 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila[at]continental-corporation.com
+*
+* Implementation for Persistence Administration Service
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.10.07 uidu0250 CSP_WZ#5965: Fixed timeout calculation for mq_timedreceive
+* 2013.09.23 uidl9757 CSP_WZ#5781: Watchdog timeout of pas-daemon
+* 2013.09.17 uidu0250 CSP_WZ#5633: Ignore requests received before registration to NSM
+* 2013.09.03 uidu0250 CSP_WZ#4480: Implement watchdog functionality
+* 2013.05.23 uidu0250 CSP_WZ#3831: Adapt PAS to be started as a service by systemd
+* 2013.04.19 uidu0250 CSP_WZ#3424: Add PAS IF extension for "restore to default"
+* 2013.04.04 uidu0250 CSP_WZ#2739: Using PersCommonIPC for requests to PCL
+* 2013.03.26 uidu0250 CSP_WZ#3171: Update PAS registration to NSM
+* 2012.11.16 uidl9757 CSP_WZ#1280: persadmin_response_msg_s: rename bResult to result and change type to long
+* 2012.11.13 uidu0250 CSP_WZ#1280: Implemented DBus registration/notification mechanism
+* 2012.11.12 uidl9757 CSP_WZ#1280: Created (only stubs for access lib part introduced)
+*
+**********************************************************************************************************************/
+
+/* ---------------------- include files --------------------------------- */
+#include "persComTypes.h"
+#include "stdio.h"
+#include "string.h"
+#include "stdlib.h"
+#include <stddef.h>
+#include <unistd.h>
+#include <sys/file.h>
+#include "fcntl.h"
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/time.h> /* used for watchdog re-triggering */
+#include <mqueue.h>
+#include <semaphore.h>
+#include <dlt.h>
+#include <pthread.h>
+#include <signal.h>
+#include <syslog.h> /* Syslog messages */
+#include <systemd/sd-daemon.h> /* Systemd wdog */
+
+#include "persComErrors.h"
+
+#include "persistence_admin_service.h"
+#include "ssw_pers_admin_access_lib.h"
+#include "ssw_pers_admin_pcl.h"
+#include "ssw_pers_admin_dbus.h"
+#include "ssw_pers_admin_pcl.h"
+#include "ssw_pers_admin_service.h"
+
+
+/* ---------- local defines, macros, constants and type definitions ------------ */
+
+/* Definition of the process name for this application. Used for logging. */
+#define PERSISTENCE_ADMIN_PROC_NAME "PersistenceAdminService"
+
+#define LT_HDR "PAS >>"
+
+#define INIT_PROC_PID 1
+#define ONE_SEC_IN_US (1000000U) /* microseconds */
+
+#define OS_SUCCESS_CODE 0
+#define OS_ERROR_CODE (-1)
+#define OS_INVALID_HANDLE (-1)
+
+#define DAEMONIZE_FAIL_RET_VAL (-1)
+#define DAEMONIZE_SUCCESS_RET_VAL 1
+#define DAEMONIZE_PARENT_RET_VAL 0
+
+
+#define PAS_PID_FILE_NAME "pers_admin_svc.pid"
+#define PAS_PID_FILE_PATH "/tmp/" PAS_PID_FILE_NAME
+#define PAS_SYSPROC_PATH "/proc"
+#define PAS_PID_MAX_SIZE 10
+#define PAS_PID_PROC_PATH_MAX_SIZE (PAS_PID_MAX_SIZE + 6) /* PAS_PID_MAX_SIZE + strlen(PAS_SYSPROC_PATH) + 1 */
+
+#define PAS_WATCHDOG_USEC_DEFAULT_VALUE (5 * ONE_SEC_IN_US) /* microseconds */
+#define PAS_ACCESS_LIB_REQ_QUEUE_TIMEOUT (50000U) /* 50 ms in microseconds */
+
+
+/* ----------global variables. initialization of global contexts ------------ */
+
+DLT_DECLARE_CONTEXT(persAdminSvcDLTCtx);
+
+static sint32_t g_hPASPidFile = OS_INVALID_HANDLE;
+
+static bool_t g_bOpInProgress = false;
+static bool_t g_bShutdownInProgress = false;
+static volatile bool_t g_bRunAccessLibThread = true;
+
+static pthread_mutex_t shutdownMtx;
+static pthread_cond_t shutdownCond;
+
+
+/* ---------------------- local functions declarations ---------------------------------- */
+
+/**
+ * \brief Access lib thread. Thread responsible to perform (on behalf of the clients)
+ * the requests available in persistence_admin_service.h
+ *
+ * \param arg: thread arguments
+ *
+ * \return NIL
+ **/
+static void * persadmin_AccessLibThread (void *arg);
+
+/**
+ * \brief Process the specified request (from the requests available in persistence_admin_service.h)
+ *
+ * \param psRequest: request details
+ * \param pResult_out: request result
+ *
+ * \return true if successful, false otherwise
+ **/
+static bool_t persadmin_ProcessRequest (persadmin_request_msg_s* psRequest, long* pResult_out);
+
+/**
+ * \brief The function is called from main and turns the current process into a daemon.
+ *
+ * \param pProcessName: Specifies the name of the process to be daemonized.
+ *
+ * \return 0 : parent process returned; positive value: success; negative value: error
+ **/
+static sint_t persadmin_DaemonizeProcess(pstr_t pProcessName);
+
+/**
+ * \brief Run main daemon actions.
+ *
+ * \return 0 : success; negative value: error
+ **/
+static sint_t persadmin_RunDaemon(void);
+
+/**
+ * \brief Signal handler.
+ *
+ * \param signum : signal identifier
+ *
+ * \return void
+ **/
+static void persadmin_HandleTerm(int signum);
+
+/**
+ * \brief The function is called from main. It checks if the unlocks the PID file and closes the opened handles.
+ *
+ * \return true if the process is already running, false otherwise
+ **/
+static bool_t persadmin_IsAlreadyRunning(void);
+
+/**
+ * \brief The function is called from main and writes the child PID to be used by systemd
+ *
+ * \return true if successful, false otherwise
+ **/
+static bool_t persadmin_LockPidFile(void);
+
+/**
+ * \brief The function is called from main. It unlocks the PID file and closes the opened handles.
+ *
+ * \return void
+ **/
+static void persadmin_EndPASProcess(void);
+
+/**
+ * \brief Get re-trigger rate from environment variable (from .service file)
+ *
+ * \return re-trigger rate (in seconds)
+ **/
+static uint32_t persadmin_GetWdogRetriggerRate(void);
+
+
+/* ---------------------- public functions definition ---------------------------------- */
+
+/**
+ * \brief Set PAS shutdown state
+ *
+ * \param state the shutdown state : true if the shutdown is pending, false otherwise
+ *
+ * \return : void
+ */
+void persadmin_set_shutdown_state(bool_t state)
+{
+ if(OS_SUCCESS_CODE != pthread_mutex_lock(&shutdownMtx))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("Failed to lock the shutdown mutex. errno =");
+ DLT_INT(errno));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ }
+ else
+ {
+ if(true == state)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Shutdown request received. Waiting for active operations to complete..."));
+
+ /* wait for any pending operation */
+ while (true == g_bOpInProgress) {
+ (void)pthread_cond_wait(&shutdownCond, &shutdownMtx);
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Completed all running operations before shutdown."));
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Shutdown canceled notification received."));
+ }
+
+ g_bShutdownInProgress = state;
+
+ (void)pthread_mutex_unlock(&shutdownMtx);
+ }
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+/**
+ * \brief Allow the modification of the resource properties from data (key-values and files)
+ *
+ * \param resource_config_file name of the persistency resource configuration to integrate
+ *
+ * \return positive value: number of modified properties in the resource configuration; negative value: error code
+ */
+long persadmin_resource_config_change_properties(char* resource_config_file)
+{
+ printf("persadmin_resource_config_change_properties(%s) \n",
+ resource_config_file) ;
+ printf("persadmin_resource_config_change_properties - NOT IMPLEMENTED \n") ;
+
+ return -1 ;
+}
+
+
+/**
+ * \brief Allow the copy of user related data between different users
+ *
+ * \param src_user_no the user ID source
+ * \param src_seat_no the seat number source (seat 0 to 3)
+ * \param dest_user_no the user ID destination
+ * \param dest_seat_no the seat number destination (seat 0 to 3)
+ *
+ * \return positive value: number of bytes copied; negative value: error code
+ */
+long persadmin_user_data_copy(unsigned int src_user_no, unsigned int src_seat_no, unsigned int dest_user_no, unsigned int dest_seat_no)
+{
+ printf("persadmin_user_data_copy(%d %d %d %d) \n",
+ src_user_no, src_seat_no, dest_user_no, dest_seat_no) ;
+ printf("persadmin_user_data_copy - NOT IMPLEMENTED \n") ;
+
+ return -1 ;
+}
+
+
+/* ---------------------- local functions definition ---------------------- */
+
+static bool_t persadmin_ProcessRequest(persadmin_request_msg_s* psRequest, long* pResult_out)
+{
+ bool_t bEverythingOK = true;
+ bool_t bLockedMtx = false;
+ long result = -1 ;
+
+ /* check if PAS is registered to NSM */
+ if(false == persadmin_IsRegisteredToNSM())
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING("Cannot process request. Not registered to NSM yet..."));
+
+ bEverythingOK = false;
+ }
+
+
+ /* check if a shutdown is in progress */
+ if(true == bEverythingOK)
+ {
+ if(OS_SUCCESS_CODE != pthread_mutex_lock(&shutdownMtx))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("Failed to lock the shutdown mutex. errno =");
+ DLT_INT(errno));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ bEverythingOK = false;
+ }
+ else
+ {
+ bLockedMtx = true;
+ }
+ }
+
+ if(true == bEverythingOK)
+ {
+ if(true == g_bShutdownInProgress)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_WARN, DLT_STRING("Cannot process request. Shutdown is in progress..."));
+
+ *pResult_out = PAS_FAILURE_OS_RESOURCE_ACCESS;
+
+ bEverythingOK = false;
+ }
+ }
+
+ if(true == bEverythingOK)
+ {
+ g_bOpInProgress = true;
+
+ (void)pthread_mutex_unlock(&shutdownMtx);
+ bLockedMtx = false;
+
+ switch(psRequest->eRequest)
+ {
+ case PAS_Req_DataBackupCreate:
+ {
+ result = persadmin_data_backup_create(psRequest->type, psRequest->path1, psRequest->path2, psRequest->user_no, psRequest->seat_no) ;
+ break ;
+ }
+ case PAS_Req_DataBackupRecovery:
+ {
+ result = persadmin_data_backup_recovery(psRequest->type, psRequest->path1, psRequest->path2, psRequest->user_no, psRequest->seat_no) ;
+ break ;
+ }
+ case PAS_Req_DataRestoreToDefault:
+ {
+ result = persadmin_data_restore_to_default(psRequest->type, psRequest->defaultSource, psRequest->path2, psRequest->user_no, psRequest->seat_no);
+ break;
+ }
+ case PAS_Req_DataFolderExport:
+ {
+ result = persadmin_data_folder_export(psRequest->type, psRequest->path1) ;
+ break ;
+ }
+ case PAS_Req_DataFolderImport:
+ {
+ result = persadmin_data_folder_import(psRequest->type, psRequest->path1) ;
+ break ;
+ }
+ case PAS_Req_ResourceConfigAdd:
+ {
+ result = persadmin_resource_config_add(psRequest->path1) ;
+ break ;
+ }
+ case PAS_Req_ResourceConfigChangeProperties:
+ {
+ result = persadmin_resource_config_change_properties(psRequest->path1) ;
+ break ;
+ }
+ case PAS_Req_UserDataCopy:
+ {
+ result = persadmin_user_data_copy(psRequest->src_user_no, psRequest->src_seat_no, psRequest->dest_user_no, psRequest->dest_seat_no) ;
+ break ;
+ }
+ case PAS_Req_UserDataDelete:
+ {
+ result = persadmin_user_data_delete(psRequest->user_no, psRequest->seat_no) ;
+ break ;
+ }
+ default:
+ {
+ /* shall never happen */
+ bEverythingOK = false ;
+ break ;
+ }
+ }
+
+ /* operation finished */
+ if(OS_SUCCESS_CODE != pthread_mutex_lock(&shutdownMtx))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("Failed to lock the shutdown mutex. errno =");
+ DLT_INT(errno));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ bEverythingOK = false;
+ }
+ else
+ {
+ bLockedMtx = true;
+
+ g_bOpInProgress = false;
+
+ /* notify any waiting thread */
+ (void)pthread_cond_broadcast(&shutdownCond);
+ }
+ }
+
+ if(true == bLockedMtx)
+ {
+ (void)pthread_mutex_unlock(&shutdownMtx);
+ bLockedMtx = false;
+ }
+
+ *pResult_out = bEverythingOK ? result : PAS_FAILURE ;
+
+ return bEverythingOK;
+
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static void * persadmin_AccessLibThread(void *arg)
+{
+ bool_t bEverythingOK = true;
+
+ sem_t * pSyncSem = NIL;
+ mqd_t mqdMsgQueueRequest = OS_INVALID_HANDLE;
+ mqd_t mqdMsgQueueResponse = OS_INVALID_HANDLE;
+
+ persadmin_request_msg_s sRequest;
+ persadmin_response_msg_s sResponse;
+
+ struct timeval timestamp = {0};
+ struct timespec tsTimestamp;
+ struct timespec tsWdogTimestamp;
+ struct timespec * pTimestamp = NIL;
+
+ uint32_t u32RetriggerRate = 0;
+ bool_t bWDogTimeoutSet = false;
+
+ struct mq_attr mq_attr_request;
+ struct mq_attr mq_attr_response;
+ mq_attr_request.mq_maxmsg = 1; /* max 1 message in the queue */
+ mq_attr_request.mq_msgsize = sizeof(persadmin_request_msg_s);
+ mq_attr_response.mq_maxmsg = 1; /* max 1 message in the queue */
+ mq_attr_response.mq_msgsize = sizeof(persadmin_response_msg_s);
+
+
+ /* first initialize the resources */
+ pSyncSem = sem_open(PERSADMIN_ACCESSLIB_SYNC_SEMAPHORE, O_CREAT|O_EXCL, S_IRWXU|S_IRWXG|S_IRWXO, 1) ;
+ {
+ if(NIL == pSyncSem)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("Failed to create semaphore");
+ DLT_STRING(PERSADMIN_ACCESSLIB_SYNC_SEMAPHORE);
+ DLT_STRING(". Error :");
+ DLT_STRING(strerror(errno)));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ bEverythingOK = false;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR);
+ DLT_STRING("Semaphore");
+ DLT_STRING(PERSADMIN_ACCESSLIB_SYNC_SEMAPHORE);
+ DLT_STRING("created successfully."));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ mqdMsgQueueRequest = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST, O_CREAT|O_EXCL|O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO, &mq_attr_request);
+ if(OS_INVALID_HANDLE == mqdMsgQueueRequest)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("Failed to open request queue");
+ DLT_STRING(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST);
+ DLT_STRING(". Error :");
+ DLT_STRING(strerror(errno)));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ bEverythingOK = false;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR);
+ DLT_STRING("Request queue");
+ DLT_STRING(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST);
+ DLT_STRING("created successfully."));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ mqdMsgQueueResponse = mq_open(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE, O_CREAT|O_EXCL|O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO, &mq_attr_response);
+ if(OS_INVALID_HANDLE == mqdMsgQueueResponse)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("Failed to open response queue");
+ DLT_STRING(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE);
+ DLT_STRING(". Error :");
+ DLT_STRING(strerror(errno)));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ bEverythingOK = false;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR);
+ DLT_STRING("Response queue");
+ DLT_STRING(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE);
+ DLT_STRING("created successfully."));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ /* get watchdog retrigger rate */
+ u32RetriggerRate = persadmin_GetWdogRetriggerRate();
+
+ /* everything is initialized now, so we can process requests */
+ while(true == g_bRunAccessLibThread)
+ {
+ sint_t sErrCode;
+
+ if(OS_ERROR_CODE == gettimeofday(&timestamp, NULL))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("gettimeofday call failed. Error :");
+ DLT_INT(errno));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ break;
+ }
+ else
+ {
+ if(false == bWDogTimeoutSet)
+ {
+ /* determine timeout moment in time based on the re-trigger rate */
+ tsWdogTimestamp.tv_sec = timestamp.tv_sec + (__time_t)((u32RetriggerRate / ONE_SEC_IN_US) + ( (uint64_t)timestamp.tv_usec + (u32RetriggerRate % ONE_SEC_IN_US))/ONE_SEC_IN_US );
+ tsWdogTimestamp.tv_nsec = (((uint64_t)timestamp.tv_usec + (u32RetriggerRate % ONE_SEC_IN_US)) % ONE_SEC_IN_US) * 1000;
+ bWDogTimeoutSet = true;
+ }
+
+ /* determine access lib timeout moment in time */
+ tsTimestamp.tv_sec += (__time_t)((PAS_ACCESS_LIB_REQ_QUEUE_TIMEOUT / ONE_SEC_IN_US) + ( (uint64_t)timestamp.tv_usec + (PAS_ACCESS_LIB_REQ_QUEUE_TIMEOUT % ONE_SEC_IN_US))/ONE_SEC_IN_US );
+ tsTimestamp.tv_nsec = (((uint64_t)timestamp.tv_usec + (PAS_ACCESS_LIB_REQ_QUEUE_TIMEOUT % ONE_SEC_IN_US)) % ONE_SEC_IN_US) * 1000;
+
+
+ if( (tsTimestamp.tv_sec < tsWdogTimestamp.tv_sec) ||
+ ((tsTimestamp.tv_sec == tsWdogTimestamp.tv_sec) && (tsTimestamp.tv_nsec < tsWdogTimestamp.tv_nsec)))
+ {
+ pTimestamp = &tsTimestamp;
+ }
+ else
+ {
+ pTimestamp = &tsWdogTimestamp;
+ }
+ }
+
+ /* wait for request */
+ sErrCode = mq_timedreceive(mqdMsgQueueRequest, (char*)&sRequest, sizeof(sRequest), NIL, pTimestamp);
+
+ switch(sErrCode)
+ {
+ case OS_ERROR_CODE:
+ {
+ if(ETIMEDOUT == errno)/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ {
+ /* check if watchdog timeout was active */
+ if(pTimestamp == &tsWdogTimestamp)
+ {
+ /* re-trigger watchdog */
+ persadmin_RetriggerWatchdog();
+
+ /* reset watchdog timeout */
+ bWDogTimeoutSet = false;
+ }
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("Invalid request received.");
+ DLT_STRING("Expected");
+ DLT_INT(sizeof(sRequest));
+ DLT_STRING("bytes"));
+ g_bRunAccessLibThread = false;
+ }
+ }
+ break;
+
+ case sizeof(sRequest):
+ {
+ long requestResult = -1;
+ sint_t sFctRetVal;
+
+ /* re-trigger watchdog */
+ persadmin_RetriggerWatchdog();
+
+ /* reset watchdog timeout */
+ bWDogTimeoutSet = false;
+
+ /* request received in the right format */
+ sFctRetVal = persadmin_SendLockAndSyncRequestToPCL();
+ if(PERS_COM_SUCCESS != sFctRetVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("persadmin_SendLockAndSyncRequestToPCL call failed. Error :");
+ DLT_INT(sFctRetVal));
+ requestResult = PAS_FAILURE;
+ }
+ else
+ {
+ if(false == persadmin_ProcessRequest(&sRequest, &requestResult))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("persadmin_ProcessRequest call failed."));
+ }
+
+ (void)persadmin_SendUnlockRequestToPCL();
+ }
+
+ sResponse.result = requestResult;
+
+ if(OS_ERROR_CODE == mq_send(mqdMsgQueueResponse, (char*)&sResponse, sizeof(sResponse), 0))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("Failed to send response. Error :");
+ DLT_INT(errno));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+
+ g_bRunAccessLibThread = false;
+ }
+ }
+ break;
+
+ default:
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("Invalid request received. Returned");
+ DLT_INT(sErrCode);
+ DLT_STRING("bytes. Expected");
+ DLT_INT(sizeof(sRequest));
+ DLT_STRING("bytes"));
+ g_bRunAccessLibThread = false;
+ }
+ break;
+ }
+ }
+ }
+
+ /* close handles */
+ if(NIL != pSyncSem)
+ {
+ (void)sem_close(pSyncSem);
+ (void)sem_unlink(PERSADMIN_ACCESSLIB_SYNC_SEMAPHORE);
+ }
+
+ if(OS_INVALID_HANDLE != mqdMsgQueueRequest) /* && OS_ERROR_CODE != mqdMsgQueueRequest */
+ {
+ (void)mq_close(mqdMsgQueueRequest);
+ (void)mq_unlink(PERSADMIN_ACCESSLIB_MSG_QUEUE_REQUEST);
+ }
+
+ if(OS_INVALID_HANDLE != mqdMsgQueueResponse) /* && OS_ERROR_CODE != mqdMsgQueueResponse */
+ {
+ (void)mq_close(mqdMsgQueueResponse);
+ (void)mq_unlink(PERSADMIN_ACCESSLIB_MSG_QUEUE_RESPONSE);
+ }
+
+ return NIL;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static sint_t persadmin_DaemonizeProcess (pstr_t pProcessName)
+{
+ pid_t pid, sid;
+ sint_t sRetVal = DAEMONIZE_SUCCESS_RET_VAL;
+
+ if(NIL == pProcessName)
+ {
+ syslog(LOG_ERR, "PAS >> Invalid argument in persadmin_DaemonizeProcess call.");
+
+ sRetVal = DAEMONIZE_FAIL_RET_VAL;
+ }
+
+ if(DAEMONIZE_SUCCESS_RET_VAL == sRetVal)
+ {
+ syslog(LOG_INFO, "PAS >> Daemon process %s starting.", pProcessName);
+
+ /* Fork off the parent process */
+ pid = fork();
+ if (pid < 0)
+ {
+ syslog(LOG_ERR, "PAS >> Unable to fork, code=%d (%s).", errno, strerror(errno));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+
+ sRetVal = DAEMONIZE_FAIL_RET_VAL;
+ }
+ else
+ {
+ if(pid > 0)
+ {
+ syslog(LOG_ERR, "PAS >> Child(daemon) process created successfully with PID=%d.", pid);
+
+ sRetVal = DAEMONIZE_PARENT_RET_VAL;
+ }
+ }
+
+ if(DAEMONIZE_SUCCESS_RET_VAL == sRetVal)
+ {
+ /* Ignore or perform the default action for some of the signals in the child process */
+ (void)signal(SIGCHLD,SIG_DFL); /* A child process dies */
+ (void)signal(SIGTSTP,SIG_IGN); /* Various TTY signals */
+ (void)signal(SIGTTOU,SIG_IGN);
+ (void)signal(SIGTTIN,SIG_IGN);
+ (void)signal(SIGHUP, SIG_IGN); /* Ignore hangup signal */
+ (void)signal(SIGTERM,SIG_DFL); /* Die on SIGTERM */
+
+ syslog(LOG_INFO, "PAS >> Child signals ignored.");
+
+ /* Change the file mode mask */
+ (void)umask(0);
+
+ syslog(LOG_INFO, "PAS >> File mode mask changed.");
+
+ /* Get a unique Session ID from the kernel */
+ sid = setsid();
+ if (OS_ERROR_CODE == sid)
+ {
+ syslog(LOG_ERR, "PAS >> Unable to get a unique session id. Error code %d (%s).", errno, strerror(errno));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+
+ sRetVal = DAEMONIZE_FAIL_RET_VAL;
+ }
+ else
+ {
+ syslog(LOG_INFO, "PAS >> New SID for child process: %d.", sid);
+ }
+ }
+
+ if(DAEMONIZE_SUCCESS_RET_VAL == sRetVal)
+ {
+ /* Change the current working directory.
+ * This prevents the current directory from being locked; hence not being able to remove it.
+ * The root directory cannot be unmounted.
+ */
+ if ((chdir("/")) < 0)
+ {
+ syslog(LOG_ERR, "PAS >> Unable to change directory to root path. Error code %d (%s)", errno, strerror(errno));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+
+ sRetVal = DAEMONIZE_FAIL_RET_VAL;
+ }
+ else
+ {
+ syslog(LOG_INFO, "PAS >> Current working directory changed for child process.");
+ }
+ }
+
+ if(DAEMONIZE_SUCCESS_RET_VAL == sRetVal)
+ {
+ /* Redirect standard files to /dev/null */
+ (void)freopen( "/dev/null", "r", stdin);
+ (void)freopen( "/dev/null", "w", stdout);
+ (void)freopen( "/dev/null", "w", stderr);
+
+ syslog(LOG_INFO, "PAS >> Standard file descriptors redirected to /dev/null.");
+ }
+ }
+
+ return sRetVal;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static sint_t persadmin_RunDaemon(void)
+{
+ sint_t sRetVal = EXIT_SUCCESS;
+ sint_t retVal = PERS_COM_SUCCESS;
+ bool_t bSyncObjInitialized = false;
+ bool_t bLockedPIDFile = false;
+ struct sigaction action;
+
+ /* Initialize the logging interface */
+ DLT_REGISTER_APP("PERS", "Persistence Administration Service");
+ DLT_REGISTER_CONTEXT(persAdminSvcDLTCtx, "PADM", "Persistence Administration Service Context");
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(PERSISTENCE_ADMIN_PROC_NAME);
+ DLT_STRING(" starting..."));
+
+ /* Set SIGTERM handler */
+ (void)memset(&action, 0, sizeof(struct sigaction));
+ action.sa_handler = &persadmin_HandleTerm;
+ (void)sigaction(SIGTERM, &action, NULL);
+
+ /* Lock the PID file */
+ if(false == persadmin_LockPidFile())
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to lock the PID file."));
+
+ sRetVal = EXIT_FAILURE;
+ }
+ else
+ {
+ bLockedPIDFile = true;
+ }
+
+ if(EXIT_FAILURE != sRetVal)
+ {
+ /* Initialize synchronization objects */
+ if(OS_SUCCESS_CODE == pthread_mutex_init (&shutdownMtx, NULL))
+ {
+ if(OS_SUCCESS_CODE == pthread_cond_init (&shutdownCond, NULL))
+ {
+ bSyncObjInitialized = true;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to init shutdown sync. obj. (cond)"));
+
+ (void)pthread_mutex_destroy(&shutdownMtx);
+
+ sRetVal = EXIT_FAILURE;
+ }
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to init shutdown sync. obj. (mtx)"));
+
+ sRetVal = EXIT_FAILURE;
+ }
+
+ if(true == bSyncObjInitialized)
+ {
+ pthread_t g_hAccessLibThread = 0;
+
+ /* Create the AccessLib thread */
+ if(OS_SUCCESS_CODE != pthread_create(&g_hAccessLibThread, NIL, &persadmin_AccessLibThread, NIL))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to create AccessLib thread."));
+ }
+ else
+ {
+ /* Init PAS IPC protocol */
+ retVal = persadmin_InitIpc();
+ if(PERS_COM_SUCCESS != retVal)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to init PAS IPC component."));
+
+ sRetVal = EXIT_FAILURE;
+ }
+ else
+ {
+ /* Notify systemd that PAS is ready */
+ (void)sd_notify(0, "READY=1");
+
+ /* Init DBus connection and run the PAS main loop */
+ persadmin_RunDBusMainLoop();
+ }
+
+ /* signal the AccessLib thread to stop */
+ g_bRunAccessLibThread = false;
+
+ /* Wait for the AccessLib thread */
+ (void)pthread_join(g_hAccessLibThread, NIL);
+
+ /* Close synchronization objects */
+ (void)pthread_mutex_destroy(&shutdownMtx);
+ (void)pthread_cond_destroy(&shutdownCond);
+ }
+ }
+ }
+
+ if(true == bLockedPIDFile)
+ {
+ /* Unlock PID file and close handles */
+ persadmin_EndPASProcess();
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(PERSISTENCE_ADMIN_PROC_NAME);
+ DLT_STRING(" stopped."));
+ DLT_UNREGISTER_CONTEXT(persAdminSvcDLTCtx);
+ DLT_UNREGISTER_APP();
+
+ return sRetVal;
+
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static bool_t persadmin_LockPidFile(void)
+{
+ str_t strPid[PAS_PID_MAX_SIZE];
+ bool_t bRetVal = true;
+
+ g_hPASPidFile = open(PAS_PID_FILE_PATH, O_RDWR|O_CREAT, 0640);
+ if (OS_INVALID_HANDLE == g_hPASPidFile)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to create PID file:");
+ DLT_STRING(PAS_PID_FILE_PATH));
+ bRetVal = false;
+ }
+ else
+ {
+ if (OS_INVALID_HANDLE == lockf(g_hPASPidFile, F_TLOCK, 0))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to lock PID file:");
+ DLT_STRING(PAS_PID_FILE_PATH));
+ bRetVal = false;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Locked PID file:");
+ DLT_STRING(PAS_PID_FILE_PATH));
+
+ /* write PID to be used by systemd */
+ (void)sprintf(strPid, "%d", getpid());
+ (void)write(g_hPASPidFile, strPid, strlen(strPid));
+ }
+ }
+
+ return bRetVal;
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static void persadmin_EndPASProcess(void)
+{
+ /* unlock PID file */
+ if(OS_INVALID_HANDLE != g_hPASPidFile)
+ {
+ if(OS_INVALID_HANDLE == lockf(g_hPASPidFile, F_ULOCK, 0))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to unlock PID file:");
+ DLT_STRING(PAS_PID_FILE_PATH));
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Unlocked PID file:");
+ DLT_STRING(PAS_PID_FILE_PATH));
+ }
+ }
+
+ /* close PID file */
+ if(OS_INVALID_HANDLE == close(g_hPASPidFile))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to close PID file:");
+ DLT_STRING(PAS_PID_FILE_PATH));
+ }
+
+ g_hPASPidFile = OS_INVALID_HANDLE;
+
+ /* remove PID file */
+ if(OS_INVALID_HANDLE == remove(PAS_PID_FILE_PATH))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to remove PID file:");
+ DLT_STRING(PAS_PID_FILE_PATH));
+ }
+}
+
+
+static bool_t persadmin_IsAlreadyRunning(void)
+{
+ sint32_t hFile = OS_INVALID_HANDLE;
+ struct stat sStat;
+ str_t strPid[PAS_PID_MAX_SIZE];
+ str_t strProcPath[PAS_PID_PROC_PATH_MAX_SIZE];
+ uint32_t u32PidVal = 0;
+ bool_t bRetVal = true;
+
+ /* check PID file */
+ hFile = stat(PAS_PID_FILE_PATH, &sStat);
+ if (OS_INVALID_HANDLE == hFile)
+ {
+ /* PAS process not running. The PID file does not exists */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Failed to open PAS PID file. Process is not running already. errno =");
+ DLT_INT(errno));/*DG C8MR2R-MISRA-C:2004 Rule 20.5-SSW_Administrator_0003*/
+ bRetVal = false;
+ }
+ else
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Found PAS PID file");
+ DLT_STRING(PAS_PID_FILE_PATH));
+
+ /* PID file exists, check if the process with the specified PID is running */
+ hFile = open(PAS_PID_FILE_PATH, O_RDONLY);
+ if(OS_INVALID_HANDLE == hFile)
+ {
+ /* the process might be running */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING("Failed to open file");
+ DLT_STRING(PAS_PID_FILE_PATH));
+ }
+ else
+ {
+ /* read PID and check process status */
+ (void)memset(strPid, 0, sizeof(strPid));
+ (void)read(hFile, strPid, (PAS_PID_MAX_SIZE - 1));
+ (void)sscanf(strPid, "%d", &u32PidVal);
+ (void)close(hFile);
+
+ (void)sprintf(strProcPath, "%s/%d", PAS_SYSPROC_PATH, u32PidVal);
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("Checking status for process");
+ DLT_STRING(strProcPath));
+
+ hFile = stat(strProcPath, &sStat);
+ if (OS_INVALID_HANDLE == hFile)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING("File '");
+ DLT_STRING(strProcPath);
+ DLT_STRING("' exists, but process with PID:");
+ DLT_STRING(strPid);
+ DLT_STRING(" is not running."));
+ bRetVal = false;
+ }
+ }
+ }
+
+ return bRetVal;
+
+}/*DG C8ISQP-ISQP Metric 10-SSW_Administrator_0001*/
+
+
+static uint32_t persadmin_GetWdogRetriggerRate(void)
+{
+ const char *sWdogUSec = NIL;
+ uint32_t u32WdogUSec = 0;
+
+ sWdogUSec = getenv("WATCHDOG_USEC");
+ if(NIL == sWdogUSec)
+ {
+ /* use default watchdog re-trigger rate */
+ u32WdogUSec = PAS_WATCHDOG_USEC_DEFAULT_VALUE;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR);
+ DLT_STRING("Using default watchdog re-trigger rate :");
+ DLT_UINT32(u32WdogUSec / 1000);
+ DLT_STRING("ms."));
+ }
+ else
+ {
+ u32WdogUSec = strtoul(sWdogUSec, NULL, 10);
+
+ /* The min. valid value for systemd is 1 s => WATCHDOG_USEC at least needs to contain 1.000.000 us */
+ if(u32WdogUSec < ONE_SEC_IN_US)
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR);
+ DLT_STRING("Error: Invalid WDOG config: WATCHDOG_USEC:");
+ DLT_STRING(sWdogUSec);
+ DLT_STRING(".Using default watchdog re-trigger rate :");
+ DLT_UINT32(PAS_WATCHDOG_USEC_DEFAULT_VALUE / 1000);
+ DLT_STRING("ms"));
+
+ u32WdogUSec = PAS_WATCHDOG_USEC_DEFAULT_VALUE;
+ }
+ else
+ {
+ u32WdogUSec /= 2;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR);
+ DLT_STRING("WDOG retrigger rate [ms]:");
+ DLT_UINT32(u32WdogUSec/1000));
+ }
+ }
+
+ return u32WdogUSec;
+}
+
+
+void persadmin_RetriggerWatchdog(void)
+{
+
+ (void) sd_notify(0, "WATCHDOG=1");
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR);
+ DLT_STRING("Triggered systemd WDOG"));
+}
+
+
+static void persadmin_HandleTerm(int signum)
+{
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR);
+ DLT_STRING("SIGTERM received..."));
+
+ /* quit DBus main loop */
+ (void)persadmin_QuitDBusMainLoop();
+}
+
+
+int main(void)
+{
+ sint_t sRetVal = EXIT_SUCCESS;
+ sint_t sTmpRetVal;
+
+ /* Initialize syslog */
+ (void)setlogmask (LOG_UPTO (LOG_DEBUG));
+ openlog("PAS", LOG_PID, LOG_USER);
+
+ /* Check if the process is already running */
+ if(true == persadmin_IsAlreadyRunning())
+ {
+ syslog(LOG_INFO, "PAS >> PAS process is already running! Only one instance allowed!");
+
+ sRetVal = EXIT_FAILURE;
+ }
+
+ if(EXIT_FAILURE != sRetVal)
+ {
+ /* Daemonize the current process */
+ sTmpRetVal = persadmin_DaemonizeProcess((str_t*)PERSISTENCE_ADMIN_PROC_NAME);
+ if(DAEMONIZE_FAIL_RET_VAL == sTmpRetVal)
+ {
+ syslog(LOG_INFO, "PAS >> persadmin_DaemonizeProcess call failed.");
+
+ sRetVal = EXIT_FAILURE;
+
+ }else
+ {
+ if(DAEMONIZE_SUCCESS_RET_VAL == sTmpRetVal)
+ {
+ /* Run daemon actions */
+ sRetVal = persadmin_RunDaemon();
+
+ }/* exit with success for parent process */
+ }
+ }
+
+ /* De-initialize syslog */
+ closelog();
+
+ return sRetVal;
+}
diff --git a/Administrator/src/ssw_pers_admin_user_delete_data.c b/Administrator/src/ssw_pers_admin_user_delete_data.c
new file mode 100644
index 0000000..98f34d1
--- /dev/null
+++ b/Administrator/src/ssw_pers_admin_user_delete_data.c
@@ -0,0 +1,451 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Alin.Liteanu@continental-corporation.com
+*
+* Implementation of delete user data process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.12.22 uidv2833 CSP_WZ#1280: Corrected value if directory is missing
+* 2012.12.21 uidv2833 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+#include "string.h"
+#include "stdio.h"
+#include <stdlib.h>
+#include "ssw_pers_admin_files_helper.h"
+#include "ssw_pers_admin_database_helper.h"
+#include "persComDataOrg.h"
+#include "persistence_admin_service.h"
+
+#define MNT_C_PATH PERS_ORG_LOCAL_APP_CACHE_PATH_ // "/Data/mnt-c/"
+#define MNT_WT_PATH PERS_ORG_LOCAL_APP_WT_PATH_ // "/Data/mnt-wt/"
+
+//#define MNT_MAX_LENGTH 15
+#define SHARED_FOLDER PERS_ORG_SHARED_FOLDER_NAME //"shared"
+#define USER_FOLDER PERS_ORG_USER_FOLDER_NAME //"user"
+#define SEAT_FOLDER PERS_ORG_SEAT_FOLDER_NAME //"seat"
+#define PUBLIC_FOLDER PERS_ORG_PUBLIC_FOLDER_NAME //"public"
+#define GROUP_FOLDER PERS_ORG_GROUP_FOLDER_NAME //"group"
+#define CACHED_DATABASE PERS_ORG_SHARED_CACHE_DB_NAME //"cached.itz"
+#define WT_DATABASE PERS_ORG_SHARED_WT_DB_NAME //"wt.itz"
+
+long user_data_delete_from_folder (pstr_t folder_path, unsigned int user_no, unsigned int seat_no)
+{
+ bool_t bEverythingOK = true;
+ sint_t iBytesDeleted = 0; // return value
+ sint_t iLocalBytesDeleted;
+ pstr_t sFoldersAndFiles = NIL ; // list of the folders and files found in current folder path
+ sint_t iFoldersOrFilesBufSize; // size of the buffer containing the list of the folders and files found in current path
+ str_t sFolderOrFile[PERSADMIN_MAX_PATH_LENGHT]; // contains current path subfolder or file
+ str_t sAbsPath[PERSADMIN_MAX_PATH_LENGHT]; // absolute folder or file path that will be deleted
+ str_t seat_no_path[PERSADMIN_MAX_PATH_LENGHT];
+ pstr_t sSeatFolders = NIL;
+ sint_t iSeatFoldersBufSize;
+ str_t sBufferForSeat[PERSADMIN_MAX_PATH_LENGHT];
+
+ sint_t posInListBuffer;
+ sint_t posInListBufferForSeat;
+ sint_t len;
+ sint_t lenSeat;
+
+ printf("user_data_delete_from_folder: folder: %s\n", folder_path);
+
+ //get requierd buffer length
+ iFoldersOrFilesBufSize = persadmin_list_folder_get_size( folder_path, PersadminFilterAll, false );
+
+ printf("user_data_delete_from_folder: persadmin_list_folder_get_size returned : %d\n", iFoldersOrFilesBufSize);
+
+ if ( 0 <= iFoldersOrFilesBufSize )
+ {
+ //alocate required memory
+ sFoldersAndFiles = ( pstr_t )malloc( iFoldersOrFilesBufSize );
+ if ( NIL == sFoldersAndFiles )
+ {
+ bEverythingOK = false;
+ printf("user_data_delete_from_folder: malloc failed\n");
+ }
+ else
+ {
+ printf("user_data_delete_from_folder: malloc successful\n");
+ }
+
+ if ( bEverythingOK )
+ {
+ // get the files and folders inside the curent folder and store them in the sFoldersAndFiles buffer
+ if ( iFoldersOrFilesBufSize != persadmin_list_folder( folder_path, sFoldersAndFiles, iFoldersOrFilesBufSize, PersadminFilterAll, false) )
+ {
+ bEverythingOK = false;
+ printf("user_data_delete_from_folder: persadmin_list_folder failed\n");
+ }
+ else
+ {
+ printf("user_data_delete_from_folder: persadmin_list_folder successful\n");
+ }
+ }
+
+ if ( bEverythingOK )
+ {
+ posInListBuffer = 0;
+ len = 0;
+ while ( ( posInListBuffer < iFoldersOrFilesBufSize ) && ( bEverythingOK ) )
+ {
+ strcpy(sFolderOrFile, sFoldersAndFiles + posInListBuffer);
+ len = strlen(sFolderOrFile) + 1;
+
+ printf("user_data_delete_from_folder: entity: %s\n", sFolderOrFile);
+
+ // Folder - check if name = User
+ if ( 0 == strcmp( USER_FOLDER, sFolderOrFile ) )
+ {
+ // delete user data in .../user/user_no/seat/seat_no/
+ // seat_no_path = .../user/user_no/seat/seat_no/
+ sprintf( seat_no_path, "%s%s/%d/%s/%d/", folder_path, sFolderOrFile, user_no, SEAT_FOLDER, seat_no);
+
+ if ( 0 == persadmin_check_if_file_exists(seat_no_path, true) )
+ {
+ printf("user_data_delete_from_folder: persadmin_list_folder_get_size: %s\n", seat_no_path);
+
+ iSeatFoldersBufSize = persadmin_list_folder_get_size( seat_no_path, PersadminFilterAll, false );
+
+ printf("user_data_delete_from_folder: persadmin_list_folder_get_size returned : %d\n", iSeatFoldersBufSize);
+
+ if ( 0 > iSeatFoldersBufSize )
+ {
+ bEverythingOK = false;
+ }
+
+ if ( bEverythingOK )
+ {
+ //alocate required memory
+ sSeatFolders = ( pstr_t )malloc( iSeatFoldersBufSize );
+ if ( NIL == sSeatFolders )
+ {
+ bEverythingOK = false;
+ printf("user_data_delete_from_folder: malloc failed\n");
+ }
+ else
+ {
+ printf("user_data_delete_from_folder: malloc successful\n");
+ }
+ }
+
+ if ( bEverythingOK )
+ {
+ // get the files and folders inside the Seat_no folder and store them in the sSeatFolders buffer
+ if ( 0 > persadmin_list_folder( seat_no_path, sSeatFolders, iSeatFoldersBufSize, PersadminFilterAll, false) )
+ {
+ bEverythingOK = false;
+ printf("user_data_delete_from_folder: persadmin_list_folder failed\n");
+ }
+ else
+ {
+ printf("user_data_delete_from_folder: persadmin_list_folder successful\n");
+ }
+ }
+
+ if ( bEverythingOK )
+ {
+ posInListBufferForSeat = 0 ;
+ lenSeat = 0;
+ while ( ( posInListBufferForSeat < iSeatFoldersBufSize ) && ( bEverythingOK ) )
+ {
+ strcpy( sBufferForSeat, sSeatFolders + posInListBufferForSeat);
+ lenSeat = strlen( sBufferForSeat ) + 1;
+
+ // delete user data in Group subfolder
+ // sAbsPath = .../user/user_no/seat/seat_no
+ sprintf( sAbsPath, "%s%s", seat_no_path, sBufferForSeat);
+
+ printf("user_data_delete_from_folder: User entity: %s\n", sBufferForSeat);
+
+ if ( 0 == persadmin_check_if_file_exists(sAbsPath, true) )
+ {
+ //sAbsPath is a valid folder path
+ printf("user_data_delete_from_folder: persadmin_delete_folder: %s\n", sAbsPath);
+ iLocalBytesDeleted = persadmin_delete_folder(sAbsPath);
+ if ( 0 <= iLocalBytesDeleted )
+ {
+ iBytesDeleted += iLocalBytesDeleted;
+ printf("\nDeleted folder <%s> total size in bytes <%d>\n", sAbsPath, iLocalBytesDeleted);
+ }
+ else
+ {
+ printf("\nuser_data_delete_from_folder: persadmin_delete_folder(%s) failed\n", sAbsPath) ;
+ }
+ }
+ else
+ {
+ //sAbspath is a file
+ printf("user_data_delete_from_folder: persadmin_delete_file: %s\n", sAbsPath);
+ iLocalBytesDeleted = persadmin_delete_file(sAbsPath);
+ if ( 0 <= iLocalBytesDeleted )
+ {
+ iBytesDeleted += iLocalBytesDeleted;
+ printf("\nDeleted file <%s> total size in bytes <%d>\n", sAbsPath, iLocalBytesDeleted);
+ }
+ else
+ {
+ printf("\nuser_data_delete_from_folder: persadmin_delete_file(%s) failed\n", sAbsPath) ;
+ }
+ }
+
+ // position the index to the next entity in the Seat buffer
+ posInListBufferForSeat += lenSeat;
+ }
+ }
+
+ if ( NIL != sSeatFolders )
+ {
+ free( sSeatFolders );
+ sSeatFolders = NIL;
+ }
+ }
+ else
+ {
+ printf("user_data_delete_from_folder: folder does not exist: %s\n", seat_no_path);
+ }
+ }
+
+ // File - check if file name is cached.itz or wt.itz
+ if ( ( 0 == strcmp( CACHED_DATABASE, sFolderOrFile) ) || ( 0 == strcmp( WT_DATABASE, sFolderOrFile) ) )
+ {
+ sprintf( sAbsPath, "%s%s", folder_path, sFolderOrFile);
+ printf("user_data_delete_from_folder: persadmin_delete_keys_by_filter: %s\n", sAbsPath);
+ if ( 0 != persadmin_delete_keys_by_filter(PersASSelectionType_User, sAbsPath, user_no, seat_no) )
+ {
+ printf("\nuser_data_delete_from_folder: persadmin_delete_keys_by_filter(%s) failed\n", sAbsPath) ;
+ }
+ else
+ {
+ printf("\nuser_data_delete_from_folder: Deleted keys from table <%s> \n", sAbsPath);
+ }
+ }
+
+ // position the index to the next entity in the Group buffer
+ posInListBuffer += len;
+ }
+ }
+
+ if ( NIL != sFoldersAndFiles )
+ {
+ free( sFoldersAndFiles );
+ sFoldersAndFiles = NIL;
+ }
+
+ }
+
+ return iBytesDeleted;
+}
+
+/**
+ * @brief Delete the user related data from persistency containers
+ *
+ * @param user_no the user ID
+ * @param seat_no the seat number (seat 0 to 3)
+ *
+ * @return positive value: number of bytes deleted; negative value: error code
+ */
+long persadmin_user_data_delete (unsigned int user_no, unsigned int seat_no)
+{
+ bool_t bEverythingOK = true;
+ sint_t iBytesDeleted = 0; // return value
+
+ uint8_t i; // a switch used to select curent Mnt folder
+
+ str_t sUsedMnt[PERSADMIN_MAX_PATH_LENGHT];
+
+ pstr_t sMntFolders = NIL; // list of the folders found in current /Data/mnt path
+ pstr_t sGroupFolders = NIL; // list of the folders found in current Group path
+
+ sint_t iMntFoldersBufSize; // size of the buffer containing the list of the folders found in current /Data/mnt path
+ sint_t iGroupFoldersBufSize; // size of the buffer containing the list of the folders found in current Group folder
+
+ str_t sMntFolder[PERSADMIN_MAX_PATH_LENGHT]; // contains current mnt subfolder name
+ str_t sGroupFolder[PERSADMIN_MAX_PATH_LENGHT]; // contains current group subfolder name
+
+ str_t sAbsPath[PERSADMIN_MAX_PATH_LENGHT]; // absolute folder path that will be sent to user_data_delete_from_folder(...)
+
+ sint_t posInListBuffer;
+ sint_t posInListBufferGroup;
+ sint_t len;
+ sint_t lenGroup;
+
+ for ( i = 0; i < 2; i++ ) // 2 - cached and write through
+ {
+ // set path to current mnt folder
+ if ( 0 == i )
+ {
+ strcpy( sUsedMnt, MNT_C_PATH );
+ }
+ else
+ {
+ strcpy( sUsedMnt, MNT_WT_PATH );
+ }
+
+ printf("\n\npersadmin_user_data_delete: mnt = %s \n", sUsedMnt);
+
+ //get requierd buffer length
+ iMntFoldersBufSize = persadmin_list_folder_get_size( sUsedMnt, PersadminFilterFolders, false );
+ if ( 0 > iMntFoldersBufSize )
+ {
+ bEverythingOK = false;
+ }
+
+ printf("persadmin_user_data_delete: persadmin_list_folder_get_size returned: %d\n", iMntFoldersBufSize);
+
+ if ( bEverythingOK )
+ {
+ printf("persadmin_user_data_delete: try malloc\n");
+
+ //alocate required memory
+ sMntFolders = ( pstr_t )malloc( iMntFoldersBufSize );
+ if ( NIL == sMntFolders )
+ {
+ bEverythingOK = false;
+ printf("persadmin_user_data_delete: malloc failed\n");
+ }
+ else
+ {
+ printf("persadmin_user_data_delete: malloc successful\n");
+ }
+ }
+
+ if ( bEverythingOK )
+ {
+ // get the files and folders inside the curent mnt folder and store them in the sMntFolders buffer
+ if ( 0 > persadmin_list_folder( sUsedMnt, sMntFolders, iMntFoldersBufSize, PersadminFilterFolders, false) )
+ {
+ bEverythingOK = false;
+ printf("persadmin_user_data_delete: persadmin_list_folder failed\n");
+ }
+ else
+ {
+ printf("persadmin_user_data_delete: persadmin_list_folder successful\n");
+ }
+ }
+
+ if ( bEverythingOK )
+ {
+ posInListBuffer = 0;
+ len = 0;
+ while ( ( posInListBuffer < iMntFoldersBufSize ) && ( bEverythingOK ) )
+ {
+ strcpy(sMntFolder, sMntFolders + posInListBuffer);
+ len = strlen(sMntFolder) + 1;
+
+ printf("persadmin_user_data_delete: curent entity: %s\n", sMntFolder);
+
+ // check if fodler name = Shared
+ if ( 0 == strcmp( SHARED_FOLDER, sMntFolder) )
+ {
+ // delete user data in Public folder
+ sprintf( sAbsPath, "%s%s/%s/", sUsedMnt, SHARED_FOLDER, PUBLIC_FOLDER); // sAbsPath = /Data/mnt-?/shared/public/
+ printf("persadmin_user_data_delete: user_data_delete_from_folder: %s\n", sAbsPath);
+ iBytesDeleted += user_data_delete_from_folder(sAbsPath, user_no, seat_no);
+
+ // delete user data in Group folder
+ sprintf( sAbsPath, "%s%s/%s/", sUsedMnt, SHARED_FOLDER, GROUP_FOLDER); // sAbsPath = /Data/mnt-?/shared/group/
+ printf("persadmin_user_data_delete: user_data_delete_from_folder: %s\n", sAbsPath);
+ iBytesDeleted += user_data_delete_from_folder(sAbsPath, user_no, seat_no);
+
+ if ( 0 == persadmin_check_if_file_exists(sAbsPath, true) )
+ {
+ // delete user data in all folders from Group folder
+ // get requierd buffer length for files and folders inside the Group folder
+ iGroupFoldersBufSize = persadmin_list_folder_get_size( sAbsPath, PersadminFilterFolders, false );
+ if ( 0 > iGroupFoldersBufSize )
+ {
+ bEverythingOK = false;
+ }
+
+ if ( bEverythingOK )
+ {
+ //alocate required memory
+ sGroupFolders = ( pstr_t )malloc( iGroupFoldersBufSize );
+ if ( NIL == sGroupFolders )
+ {
+ bEverythingOK = false;
+ printf("persadmin_user_data_delete: group malloc failed!\n");
+ }
+ else
+ {
+ printf("persadmin_user_data_delete: group malloc successful!\n");
+ }
+ }
+
+ if ( bEverythingOK )
+ {
+ // get the files and folders inside the Group folder and store them in the sGroupFolders buffer
+ if ( 0 > persadmin_list_folder( sAbsPath, sGroupFolders, iGroupFoldersBufSize, PersadminFilterFolders, false) )
+ {
+ bEverythingOK = false;
+ printf("persadmin_user_data_delete: group persadmin_list_folder failed!\n");
+ }
+ else
+ {
+ printf("persadmin_user_data_delete: group persadmin_list_folder successful!\n");
+ }
+ }
+
+ if ( bEverythingOK )
+ {
+
+ posInListBufferGroup = 0;
+ lenGroup = 0;
+ while ( ( posInListBufferGroup < iGroupFoldersBufSize ) && ( bEverythingOK ) )
+ {
+ strcpy(sGroupFolder, sGroupFolders + posInListBufferGroup);
+ lenGroup = strlen(sGroupFolder) + 1;
+
+ printf("persadmin_user_data_delete: curent group entity: %s\n", sGroupFolder);
+
+ // delete user data in Group subfolder
+ // sAbsPath = /Data/mnt-?/shared/group/group_no/
+ sprintf( sAbsPath, "%s%s/%s/%s/", sUsedMnt, SHARED_FOLDER, GROUP_FOLDER, sGroupFolder);
+ printf("persadmin_user_data_delete: user_data_delete_from_folder: %s\n", sAbsPath);
+ iBytesDeleted += user_data_delete_from_folder(sAbsPath, user_no, seat_no);
+
+ // position the index to the next entity in the Group buffer
+ posInListBufferGroup += lenGroup;
+ }
+ }
+
+ if ( sGroupFolders )
+ {
+ free( sGroupFolders );
+ sGroupFolders = NIL;
+ }
+ }
+ }
+ else
+ {
+ // delete user data in Application folder
+ sprintf( sAbsPath, "%s%s/", sUsedMnt, sMntFolder); // sAbsPath = /Data/mnt-?/applicatioName/
+ printf("persadmin_user_data_delete: user_data_delete_from_folder: %s\n", sAbsPath);
+ iBytesDeleted += user_data_delete_from_folder(sAbsPath, user_no, seat_no);
+ }
+
+ // position the index to the next entity in the Mnt buffer
+ posInListBuffer += len;
+ }
+ }
+
+ if ( sMntFolders )
+ {
+ free( sMntFolders );
+ sMntFolders = NIL;
+ }
+ }
+
+ printf("persadmin_user_data_delete: returned : %d\n", iBytesDeleted);
+
+ return ( ( true == bEverythingOK ) ? iBytesDeleted : PAS_FAILURE ) ;
+}
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..14e2f77
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ChangeLog
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..a1e89e1
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,370 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
+Inc.
+
+ Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+ Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package. Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below. The lack of an optional feature in a given package is not
+necessarily a bug. More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+ The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system.
+
+ Running `configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package, generally using the just-built uninstalled binaries.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the `make install' phase executed with root
+ privileges.
+
+ 5. Optionally, type `make installcheck' to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior `make install' required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 7. Often, you can also type `make uninstall' to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide `make
+ distcheck', which can by used by developers to test that all other
+ targets like `make install' and `make uninstall' work correctly.
+ This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'. This
+is known as a "VPATH" build.
+
+ With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+ By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc. You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them. In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'. Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated. The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the `DESTDIR' variable. For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names. The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+ Some packages offer the ability to configure how verbose the
+execution of `make' will be. For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ HP-UX `make' updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as `configure' are involved. Use GNU `make'
+instead.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file. The option `-nodtk' can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don't put `/usr/ucb' early in your `PATH'. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+ On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS
+ KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug. Until the bug is fixed you can use this workaround:
+
+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+ Print a summary of the options unique to this package's
+ `configure', and exit. The `short' variant lists options used
+ only in the top level, while the `recursive' variant lists options
+ also present in any nested packages.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+ Use DIR as the installation prefix. *note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+`--no-create'
+`-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..5f17a2f
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,19 @@
+#######################################################################################################################
+#
+# Copyright (C) 2012 Continental Automotive Systems, Inc.
+#
+# Author: Ana.Chisca@continental-corporation.com
+#
+# Makefile template for the Persistence Administration Service
+#
+# Process this file with automake to produce a Makefile.in.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#######################################################################################################################
+
+# Build trough subfolders. Make sure "generated" is called before "Administrator".
+ACLOCAL_AMFLAGS=-I m4
+SUBDIRS = Administrator/generated Administrator test/pers_svc_test test/persadmin_tool
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..ef5e8fe
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,3 @@
+1.0.1
+=====
+* Initial release of the PersistenceAdministrationService
diff --git a/README b/README
new file mode 100644
index 0000000..ee94802
--- /dev/null
+++ b/README
@@ -0,0 +1,25 @@
+GENIVI PersistenceAdministrationService (PAS) README
+=====================================
+
+This is the official source of the GENIVI PersistenceAdministrationService. At present, all
+relevant documentation for this project is available in the GENIVI wiki on:
+
+https://collab.genivi.org/wiki/display/genivi/TODO
+
+Master location for GENIVI PersistenceAdministrationService
+http://git.projects.genivi.org/persistence/persistence-administration-service.git
+
+License
+-------
+
+For licensing information see the COPYING file,
+distributed along with this project.
+
+
+Build Dependencies and Instructions
+-----------------------------------
+
+The PersistenceAdministrationService(PAS) has dependencies
+on the .
+
+The PersAdminAccessLib is delivered within this package.
diff --git a/autogen.sh b/autogen.sh
new file mode 100644
index 0000000..daeaa51
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,19 @@
+#!/bin/sh -e
+#
+#
+# Copyright (C) 2012 Continental Automotive Systems, Inc.
+#
+# Author: Ana.Chisca@continental-corporation.com
+#
+# Script to create necessary files/folders from a fresh git check out.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+###############################################################################
+
+mkdir -p m4
+
+autoreconf --verbose --install --force
+./configure $@ \ No newline at end of file
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..f1fde52
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,153 @@
+#######################################################################################################################
+#
+# Copyright (C) 2012 Continental Automotive Systems, Inc.
+#
+# Author: Ana.Chisca@continental-corporation.com
+#
+# Configure template for the Persistence Administration Service
+#
+# Process this file with autoconf to produce a configure script.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#######################################################################################################################
+
+dnl **************************************************************************
+dnl *** First, define all of the version numbers up front ***
+dnl *** In particular, this allows the version macro to be used in AC_INIT ***
+dnl **************************************************************************
+m4_define([PERS_SERVICE_VERSION_S],[1.0.2])
+m4_define([PERS_SERVICE_VERSION_N],[1000001])
+
+dnl ***************************
+dnl *** Initialize autoconf ***
+dnl ***************************
+AC_INIT([persistence-administration-service],[PERS_SERVICE_VERSION_S])
+AC_COPYRIGHT([Copyright (c) 2012 Continental Automotive GmbH])
+AC_PREREQ([2.50])
+
+dnl ***************************
+dnl *** Initialize automake ***
+dnl ***************************
+AM_INIT_AUTOMAKE()
+AC_CONFIG_MACRO_DIR([m4])
+AC_SUBST([ACLOCAL_AMFLAGS], ["$ACLOCAL_FLAGS -I m4"])
+
+dnl *********************************
+dnl *** Shared library versioning ***
+dnl *********************************
+PERSADMINACCESS_MAJOR=$((((PERS_SERVICE_VERSION_N() / 1000) / 1000) % 1000 ))
+PERSADMINACCESS_MINOR=$(( (PERS_SERVICE_VERSION_N() / 1000) % 1000 ))
+PERSADMINACCESS_MICRO=$(( PERS_SERVICE_VERSION_N() % 1000 ))
+GENERIC_LIBRARY_VERSION=$PERSADMINACCESS_MAJOR:$PERSADMINACCESS_MINOR:$PERSADMINACCESS_MICRO
+AC_SUBST(GENERIC_LIBRARY_VERSION)
+
+dnl ********************************
+dnl *** Check for basic programs ***
+dnl ********************************
+AC_PROG_CC()
+AM_PROG_CC_C_O()
+AC_PROG_CXX()
+AC_PROG_INSTALL()
+
+dnl ***************************
+dnl *** Initialize lib tool ***
+dnl ***************************
+AC_DISABLE_STATIC()
+AC_PROG_LIBTOOL()
+
+dnl ***************************************
+dnl *** Check for standard header files ***
+dnl ***************************************
+AC_CHECK_HEADERS([string.h])
+AC_CHECK_HEADERS([fcntl.h])
+AC_CHECK_HEADERS([stddef.h])
+AC_CHECK_HEADERS([sys/file.h])
+
+dnl ************************************
+dnl *** Check for standard functions ***
+dnl ************************************
+AC_FUNC_FORK
+AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
+AC_FUNC_MALLOC
+AC_FUNC_MMAP
+AC_CHECK_FUNCS([memcpy])
+AC_CHECK_FUNCS([memmove])
+AC_CHECK_FUNCS([memset])
+AC_CHECK_FUNCS([mkdir])
+AC_CHECK_FUNCS([munmap])
+AC_CHECK_FUNCS([strerror])
+AC_CHECK_FUNCS([strstr])
+AC_CHECK_FUNCS([strrchr])
+
+AC_CHECK_FUNCS([ftruncate])
+AC_CHECK_FUNCS([strdup])
+AC_CHECK_FUNCS([strtol])
+
+dnl ********************************************************************
+dnl *** Check for typedefs, structures, and compiler characteristics ***
+dnl ********************************************************************
+AC_HEADER_STDBOOL
+AC_TYPE_MODE_T
+AC_TYPE_PID_T
+AC_TYPE_SIZE_T
+AC_TYPE_UINT8_T
+AC_TYPE_UINT16_T
+AC_TYPE_UINT32_T
+AC_TYPE_UINT64_T
+AC_TYPE_INT8_T
+AC_TYPE_INT16_T
+AC_TYPE_INT32_T
+AC_TYPE_INT64_T
+
+dnl ***********************************
+dnl *** Check for required packages ***
+dnl ***********************************
+PKG_CHECK_MODULES([GIO], [gio-2.0 >= 2.30.0])
+PKG_CHECK_MODULES([GIO_UNIX], [gio-unix-2.0 >= 2.30.0])
+PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.30.0])
+PKG_CHECK_MODULES([GOBJECT], [gobject-2.0 >= 2.30.0])
+PKG_CHECK_MODULES([DBUS], [dbus-1 >= 1.4.10])
+PKG_CHECK_MODULES([DLT], [automotive-dlt >= 2.2.0])
+PKG_CHECK_MODULES([ZLIB], [zlib >= 1.2.5])
+PKG_CHECK_MODULES([ARCHIVELIB], [libarchive >= 3.0.4])
+PKG_CHECK_MODULES([PERSCOMMON], [libperscommon >= 1.0.1])
+PKG_CHECK_MODULES([JSON], [json >= 0.9])
+PKG_CHECK_MODULES([NSM], [node-state-manager])
+PKG_CHECK_MODULES([SYSTEMD], [libsystemd-daemon >= 37 ])
+
+AC_SUBST(DEPS_CFLAGS)
+AC_SUBST(DEPS_LIBS)
+
+dnl *************************************
+dnl *** Define extra paths ***
+dnl *************************************
+AC_ARG_WITH([systemdsystemunitdir],
+ AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
+ [],
+ [with_systemdsystemunitdir=$(pkg-config --silence-errors --variable=systemdsystemunitdir systemd)])
+AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
+AC_ARG_WITH([dbuspolicydir],
+ AS_HELP_STRING([--with-dbuspolicydirdir=DIR], [Directory for D-Bus system policy files]),
+ [],
+ [with_dbuspolicydir=$(pkg-config --silence-errors --variable=sysconfdir dbus-1)/dbus-1/system.d])
+AC_SUBST([dbuspolicydir], [$with_dbuspolicydir])
+
+# Derive path of the NSM dbus xml models
+AC_SUBST([nsmdbusinterfacesdir], [$(pkg-config --silence-errors --variable=dbusinterfacesdir node-state-manager)])
+
+dnl ************************************
+dnl *** Define configure output ***
+dnl ************************************
+AC_CONFIG_FILES([ Makefile
+ Administrator/Makefile
+ Administrator/generated/Makefile
+ Administrator/config/pas-daemon.service
+ Administrator/pkgconfig/libpersadminaccess.pc
+ test/pers_svc_test/Makefile
+ test/persadmin_tool/Makefile])
+AC_OUTPUT
+
+
diff --git a/test/pers_svc_test/Makefile.am b/test/pers_svc_test/Makefile.am
new file mode 100644
index 0000000..14d846e
--- /dev/null
+++ b/test/pers_svc_test/Makefile.am
@@ -0,0 +1,79 @@
+#######################################################################################################################
+#
+# Copyright (C) 2012 Continental Automotive Systems, Inc.
+#
+# Author: Ana.Chisca@continental-corporation.com
+#
+# Makefile template for the Persistence Administration Service Test Framework
+#
+# Process this file with automake to produce a Makefile.in.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#######################################################################################################################
+
+bin_PROGRAMS = pers_admin_test_framework
+
+#
+#
+# persistence administration service test framework.
+#
+#
+
+pers_admin_test_framework_CFLAGS = \
+ -I $(top_srcdir)/Administrator/inc/private -I $(top_srcdir)/Administrator/inc/public -I inc -I generated \
+ $(DLT_CFLAGS) \
+ $(GIO_CFLAGS) \
+ $(GIO_UNIX_CFLAGS) \
+ $(GLIB_CFLAGS) \
+ $(GOBJECT_CFLAGS) \
+ $(DBUS_CFLAGS) \
+ $(PERSCOMMON_CFLAGS) \
+ $(ARCHIVELIB_CFLAGS)
+
+pers_admin_test_framework_LDFLAGS = \
+ $(PLATFORM_LDFLAGS)
+
+pers_admin_test_framework_LDADD = \
+ $(DLT_LIBS) \
+ $(GIO_LIBS) \
+ $(GIO_UNIX_LIBS) \
+ $(GLIB_LIBS) \
+ $(DBUS_LIBS) \
+ $(GOBJECT_LIBS) \
+ $(PERSCOMMON_LIBS) \
+ $(ARCHIVELIB_LIBS) \
+ $(top_srcdir)/Administrator/libpers_admin_access_lib.la
+
+pers_admin_test_framework_SOURCES = \
+ $(top_srcdir)/Administrator/src/ssw_pers_admin_files_helper.c \
+ generated/PasModuleTestGen.c \
+ src/test_PAS.c \
+ src/test_pas_check_data_after_backup_application.c \
+ src/test_pas_check_data_after_backup_create_all.c \
+ src/test_pas_check_data_after_backup_user_all.c \
+ src/test_pas_check_data_after_backup_user2_seat_all.c \
+ src/test_pas_check_data_after_delete_user2_data.c \
+ src/test_pas_check_data_after_reset.c \
+ src/test_PAS_dbus.c \
+ src/test_pas_import_all.c \
+ src/test_pas_import_app.c \
+ src/test_pas_import_source_content.c \
+ src/test_pas_import_user.c \
+ src/test_pas_recovery_All.c \
+ src/test_pas_recovery_AllInitialContent.c \
+ src/test_pas_recovery_App1.c \
+ src/test_pas_recovery_App1InitialContent.c \
+ src/test_pas_recovery_backup_content.c \
+ src/test_pas_recovery_User1.c \
+ src/test_pas_recovery_User1InitialContent.c \
+ src/test_pas_recovery_User2Seat1InitialContent.c \
+ src/test_pas_recovery_Users.c \
+ src/test_pas_resource_config_add.c \
+ src/test_pas_restore_default_All.c \
+ src/test_pas_restore_default_App1.c \
+ src/test_pas_restore_default_User1.c \
+ src/test_pas_restore_default_User2App1.c \
+ src/test_pas_restore_default_User2Seat1.c
diff --git a/test/pers_svc_test/dbus_specifications/OIPModuleTestPASCodeGeneration.txt b/test/pers_svc_test/dbus_specifications/OIPModuleTestPASCodeGeneration.txt
new file mode 100644
index 0000000..2e77971
--- /dev/null
+++ b/test/pers_svc_test/dbus_specifications/OIPModuleTestPASCodeGeneration.txt
@@ -0,0 +1 @@
+gdbus-codegen --interface-prefix="org.genivi.persistence." --c-namespace="OipPersistence" --generate-c-code="PasModuleTestGen" OIPModuleTestPASCodeGeneration.xml \ No newline at end of file
diff --git a/test/pers_svc_test/dbus_specifications/OIPModuleTestPASCodeGeneration.xml b/test/pers_svc_test/dbus_specifications/OIPModuleTestPASCodeGeneration.xml
new file mode 100644
index 0000000..12d7f10
--- /dev/null
+++ b/test/pers_svc_test/dbus_specifications/OIPModuleTestPASCodeGeneration.xml
@@ -0,0 +1,25 @@
+<!--
+*
+* Copyright (C) 2012-2013 Continental Automotive GmbH.
+*
+* Author: guy.sagnes@continental-corporation.com
+*
+* XML model of the dbus interfaces for the test NodeStateMachine
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+-->
+<node>
+ <interface name="org.genivi.persistence.admintestframework">
+ <method name="ExecuteTestCases">
+ <arg name="noOfTestCases" type="i" direction="out"/>
+ <arg name="noOfTestCasesSuccessful" type="i" direction="out"/>
+ <arg name="noOfTestCasesFailed" type="i" direction="out"/>
+ </method>
+ </interface>
+</node>
diff --git a/test/pers_svc_test/dbus_specifications/OIPModuleTestPASDBusCall.txt b/test/pers_svc_test/dbus_specifications/OIPModuleTestPASDBusCall.txt
new file mode 100644
index 0000000..c607a15
--- /dev/null
+++ b/test/pers_svc_test/dbus_specifications/OIPModuleTestPASDBusCall.txt
@@ -0,0 +1,3 @@
+dbus-send --system --dest=org.genivi.persistence.admintestframework --print-reply \
+--type=method_call /org/genivi/persistence/admintestframework \
+org.genivi.persistence.admintestframework.ExecuteTestCases \ No newline at end of file
diff --git a/test/pers_svc_test/inc/test_PAS.h b/test/pers_svc_test/inc/test_PAS.h
new file mode 100644
index 0000000..8b50cca
--- /dev/null
+++ b/test/pers_svc_test/inc/test_PAS.h
@@ -0,0 +1,172 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.04.15 uidu0250 CSP_WZ#3424: Add IF extension for "restore to default"
+* 2012.11.29 uidv2833 CSP_WZ#1280: Adapted implementation for the new test framework
+* 2012.11.28 uidl9757 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifndef SSW_TEST_PAS_H
+#define SSW_TEST_PAS_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "persComRct.h"
+#include "persComDataOrg.h"
+
+/* needed because of change in PCL (should be removed later) */
+#define TST_DEFAULT_CONTEXT {0xFF, 0xFF, 0xFF}
+#define PERSISTENCE_ADMIN_TF_BUS_TYPE 1 //G_BUS_TYPE_SYSTEM (see gioenums.h)
+#define PERSISTENCE_ADMIN_TF_BUS_NAME "org.genivi.persistence.admintestframework"
+#define PERSISTENCE_ADMIN_TF_OBJ_PATH "/org/genivi/persistence/admintestframework"
+#define PERSISTENCE_ADMIN_TF_IFACE "org.genivi.persistence.admintestframework"
+
+#define MAX_PATH_SIZE ( 256 )
+#define MAX_APPLICATION_NAME_SIZE ( 64 )
+
+/* backup */
+#define NO_BACKUP ""
+#define BACKUP_NAME "/tmp/backup"
+
+#define BACKUP_FOLDER "/tmp/backups"
+#define BACKUP_FOLDER_ BACKUP_FOLDER "/"
+#define BACKUP_CONTENT_FOLDER BACKUP_FOLDER PERS_ORG_ROOT_PATH
+#define BACKUP_FORMAT (".arch.tar.gz")
+
+/* application */
+#define NO_APPLICATION ""
+#define APPLICATION_NAME "App1"
+
+/* user */
+//#define USER_DONT_CARE 0xFF
+//#define SEAT_DONT_CARE 0xFF
+
+typedef struct
+{
+ pstr_t resourceID ;
+ bool_t bIsKey ;
+ PersistenceConfigurationKey_s sRctEntry ;
+}entryRctInit_s ;
+
+typedef struct
+{
+ str_t LDBID;
+ pstr_t resourceID ;
+ PersistencePolicy_e policy ;
+ str_t userID ;
+ str_t seatID ;
+ pstr_t data ;
+}entryDataInit_s ;
+
+typedef struct
+{
+ pstr_t pResourceID ;
+ pstr_t data ;
+}defaultDataInit_s ;
+
+typedef enum
+{
+ dbType_local = 0,
+ dbType_RCT
+}dbType_e ;
+
+typedef struct
+{
+ pstr_t installFolderPath ;
+ pstr_t RCT_pathname ;
+ dbType_e RctDBtype ;
+ pstr_t wtDBpathname ;
+ dbType_e wtDBtype ;
+ pstr_t wcDBpathname ;
+ dbType_e wcDBtype ;
+ entryRctInit_s* RctInitTab ;
+ sint_t noEntriesRctInitTab ;
+ entryDataInit_s* dataKeysInitTab ;
+ sint_t noEntriesDataKeysInitTab ;
+ entryDataInit_s* dataFilesInitTab ;
+ sint_t noEntriesDataFilesInitTab ;
+
+ pstr_t factoryDefaultDBpathname ;
+ defaultDataInit_s* factoryDefaultInitTab ;
+ sint_t noEntriesFactoryDefaultInitTab ;
+ pstr_t configurableDefaultDBpathname ;
+ defaultDataInit_s* configurableDefaultInitTab ;
+ sint_t noEntriesConfigurableDefaultInitTab ;
+}dataInit_s ;
+
+/**********************************************************************************************************************************************
+ ***************************************** Structures used for test cases ********************************************************************
+ *********************************************************************************************************************************************/
+typedef struct
+{
+ pstr_t key ; /* contains the complete name (with node, user,... prefix) */
+ pstr_t dbPath ; /* abs path to DB */
+ bool_t bExpectedToExist; /* if true, the key is expected to be found in the indicated DB */
+ pstr_t expectedData ;
+ sint_t expectedDataSize ;
+}expected_key_data_localDB_s ;
+
+typedef struct
+{
+ pstr_t key ; /* contains the complete name (with node, user,... prefix) */
+ pstr_t dbPath ; /* abs path to DB */
+ bool_t bExpectedToExist; /* if true, the key is expected to be found in the indicated DB */
+ PersistenceConfigurationKey_s sExpectedConfig ;
+}expected_key_data_RCT_s ;
+
+typedef struct
+{
+ pstr_t filename ; /* contains the complete name (with node, user,... prefix) */
+ bool_t bExpectedToExist; /* if true, the key is expected to be found in the indicated DB */
+ pstr_t expectedData ;
+ sint_t expectedDataSize ;
+}expected_file_data_s ;
+
+/* test case prototype */
+typedef bool_t (*pfTestCase) (sint_t, void*) ;
+
+typedef struct
+{
+ pfTestCase TestCaseFunction ;
+ sint_t iParam ;
+ void* pvoidParam ;
+ pstr_t testCaseDescription ;
+ expected_key_data_RCT_s* pExpectedKeyDataRCT ;
+ sint_t noItemsInExpectedKeyDataRCT ;
+ expected_key_data_localDB_s* pExpectedKeyDataLocalDB ;
+ sint_t noItemsInExpectedKeyDataLocalDB ;
+ expected_file_data_s* pExpectedFileData ;
+ sint_t noItemsInExpectedFileData ;
+ bool_t bSkipDataReset ;
+}testcase_s ;
+
+bool_t InitDataFolder(dataInit_s* psDataInit) ;
+sint_t DeleteFolderContent(pstr_t folderPath);
+sint_t DeleteFolder(pstr_t folderPath);
+sint_t CheckIfFileExists(pstr_t pathname, bool_t bIsFolder);
+bool_t ExecuteTestCases(sint_t *pNoOfTestCases,
+ sint_t *pNoOfTestCasesSuccessful,
+ sint_t *pNoOfTestCasesFailed );
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_TEST_PAS_H */
+
diff --git a/test/pers_svc_test/inc/test_pas_check_data_after_backup_application.h b/test/pers_svc_test/inc/test_pas_check_data_after_backup_application.h
new file mode 100644
index 0000000..13e80a6
--- /dev/null
+++ b/test/pers_svc_test/inc/test_pas_check_data_after_backup_application.h
@@ -0,0 +1,38 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifndef SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_APPLICATION_H
+#define SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_APPLICATION_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "test_PAS.h"
+
+extern expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterBackupApplication[16] ;
+extern expected_file_data_s expectedFileData_shared_public_AfterBackupApplication[10] ;
+
+bool_t Test_DataAfterBackupCreateApplication(int ceva, void* pAltceva) ;
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_APPLICATION_H*/
diff --git a/test/pers_svc_test/inc/test_pas_check_data_after_backup_create_all.h b/test/pers_svc_test/inc/test_pas_check_data_after_backup_create_all.h
new file mode 100644
index 0000000..bdd4dab
--- /dev/null
+++ b/test/pers_svc_test/inc/test_pas_check_data_after_backup_create_all.h
@@ -0,0 +1,39 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifndef SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_CREATE_ALL_H
+#define SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_CREATE_ALL_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "test_PAS.h"
+
+extern expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterBackupCreateAll[80] ;
+extern expected_file_data_s expectedFileData_shared_public_AfterBackupCreateAll[50] ;
+
+bool_t Test_DataAfterBackupCreateAll(int ceva, void* pAltceva) ;
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_CREATE_ALL_H */
diff --git a/test/pers_svc_test/inc/test_pas_check_data_after_backup_user2_seat_all.h b/test/pers_svc_test/inc/test_pas_check_data_after_backup_user2_seat_all.h
new file mode 100644
index 0000000..fecbd89
--- /dev/null
+++ b/test/pers_svc_test/inc/test_pas_check_data_after_backup_user2_seat_all.h
@@ -0,0 +1,38 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifndef SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_USER2_SEAT_ALL_H
+#define SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_USER2_SEAT_ALL_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "test_PAS.h"
+
+extern expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterBackupUser2SeatAll[80] ;
+extern expected_file_data_s expectedFileData_shared_public_AfterBackupUser2SeatAll[50] ;
+
+bool_t Test_DataAfterBackupCreateUser2SeatAll(int ceva, void* pAltceva) ;
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_USER2_SEAT_ALL_H*/
diff --git a/test/pers_svc_test/inc/test_pas_check_data_after_backup_user_all.h b/test/pers_svc_test/inc/test_pas_check_data_after_backup_user_all.h
new file mode 100644
index 0000000..75f25c7
--- /dev/null
+++ b/test/pers_svc_test/inc/test_pas_check_data_after_backup_user_all.h
@@ -0,0 +1,38 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifndef SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_USER_ALL_H
+#define SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_USER_ALL_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "test_PAS.h"
+
+extern expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterBackupUserAll[80] ;
+extern expected_file_data_s expectedFileData_shared_public_AfterBackupUserAll[50] ;
+
+bool_t Test_DataAfterBackupCreateUserAll(int ceva, void* pAltceva) ;
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_TEST_PAS_CHECK_DATA_AFTER_BACKUP_USER_ALL_H*/
diff --git a/test/pers_svc_test/inc/test_pas_check_data_after_delete_user2_data.h b/test/pers_svc_test/inc/test_pas_check_data_after_delete_user2_data.h
new file mode 100644
index 0000000..6c44380
--- /dev/null
+++ b/test/pers_svc_test/inc/test_pas_check_data_after_delete_user2_data.h
@@ -0,0 +1,39 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifndef SSW_TEST_PAS_CHECK_DATA_AFTER_DELETE_USER2_DATA_H
+#define SSW_TEST_PAS_CHECK_DATA_AFTER_DELETE_USER2_DATA_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "test_PAS.h"
+
+extern expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterDeleteUser2Data[80] ;
+extern expected_file_data_s expectedFileData_shared_public_AfterDeleteUser2Data[50] ;
+
+bool_t Test_DataAfterDeleteUser2Data(int ceva, void* pAltceva) ;
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_TEST_PAS_CHECK_DATA_AFTER_DELETE_USER2_DATA_H */
diff --git a/test/pers_svc_test/inc/test_pas_check_data_after_reset.h b/test/pers_svc_test/inc/test_pas_check_data_after_reset.h
new file mode 100644
index 0000000..64dd7c3
--- /dev/null
+++ b/test/pers_svc_test/inc/test_pas_check_data_after_reset.h
@@ -0,0 +1,41 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifndef SSW_TEST_PAS_CHECK_DATA_AFTER_RESET_H
+#define SSW_TEST_PAS_CHECK_DATA_AFTER_RESET_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "test_PAS.h"
+
+//extern const testcase_s const* pTC_testDataAfterReset;
+extern expected_key_data_RCT_s expectedKeyData_shared_public_RCT_AfterReset[13] ;
+extern expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterReset[18] ;
+extern expected_file_data_s expectedFileData_shared_public_AfterReset[11] ;
+
+bool_t Test_DataAfterReset(int ceva, void* pAltceva) ;
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_TEST_PAS_CHECK_DATA_AFTER_RESET_H */
diff --git a/test/pers_svc_test/inc/test_pas_data_backup_recovery.h b/test/pers_svc_test/inc/test_pas_data_backup_recovery.h
new file mode 100644
index 0000000..d4c9925
--- /dev/null
+++ b/test/pers_svc_test/inc/test_pas_data_backup_recovery.h
@@ -0,0 +1,131 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifndef SSW_TEST_PAS_DATA_BACKUP_RECOVERY_H
+#define SSW_TEST_PAS_DATA_BACKUP_RECOVERY_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "test_PAS.h"
+
+#define BACKUP_FOLDER "/tmp/backups"
+#define BACKUP_FOLDER_ BACKUP_FOLDER "/"
+#define BACKUP_CONTENT_FOLDER BACKUP_FOLDER PERS_ORG_ROOT_PATH
+
+#define PATH_ABS_MAX_SIZE ( 512)
+
+#define BACKUP_FORMAT (".arch.tar.gz")
+
+#define USER_DONT_CARE 0xFF
+#define SEAT_DONT_CARE 0xFF
+
+//===================================================================================================================
+// BACKUP CONTENT
+//===================================================================================================================
+bool_t ResetBackupContent(PersASSelectionType_e type, char* applicationID);
+
+//===================================================================================================================
+// RECOVER DATA - App1
+//===================================================================================================================
+
+extern expected_key_data_localDB_s expected_key_data_after_restore_App1[24];
+extern expected_file_data_s expected_file_data_after_restore_App1[16];
+
+bool_t Test_Recover_App1(sint_t type, void* pv);
+
+
+//===================================================================================================================
+// RECOVER DATA - User 1
+//===================================================================================================================
+extern expected_key_data_localDB_s expected_App1_key_data_after_restore_User1[24];
+extern expected_file_data_s expected_App1_file_data_after_restore_User1[16];
+
+bool_t Test_Recover_User1(sint_t type, void* pv);
+
+
+//===================================================================================================================
+// RECOVER DATA - All
+//===================================================================================================================
+
+extern expected_key_data_localDB_s expected_key_data_after_restore_All[23 + 24 + 48 + 44];
+extern expected_file_data_s expected_file_data_after_restore_All[16 + 16 + 16];
+
+bool_t Test_Recover_All(sint_t type, void* pv);
+
+
+//===================================================================================================================
+// RECOVER DATA - Users
+//===================================================================================================================
+
+extern expected_key_data_localDB_s expected_key_data_after_restore_Users[23 + 24 + 24 + 24 + 22];
+extern expected_file_data_s expected_file_data_after_restore_Users[16 + 16 + 16];
+
+bool_t Test_Recover_Users(sint_t type, void* pv);
+
+
+//===================================================================================================================
+// RECOVER DATA - All InitialContent
+//===================================================================================================================
+
+extern expected_key_data_localDB_s expected_key_data_after_restore_All_InitialContent[16 + 16 + 16 + 32 + 32];
+extern expected_file_data_s expected_file_data_after_restore_All_InitialContent[10 + 10 + 10 + 10 + 10];
+
+bool_t Test_Recover_All_InitialContent(sint_t type, void* pv);
+
+
+//===================================================================================================================
+// RECOVER DATA - App1 InitialContent
+//===================================================================================================================
+
+extern expected_key_data_localDB_s expected_key_data_after_restore_App1_InitialContent[16 + 16 + 16 + 32 + 32];
+extern expected_file_data_s expected_file_data_after_restore_App1_InitialContent[10 + 10 + 10 + 10 + 10];
+
+bool_t Test_Recover_App1_InitialContent_From_All(sint_t type, void* pv);
+bool_t Test_Recover_App1_InitialContent_From_App1(sint_t type, void* pv);
+
+
+//===================================================================================================================
+// RECOVER DATA - User1 InitialContent
+//===================================================================================================================
+
+extern expected_key_data_localDB_s expected_key_data_after_restore_User1_InitialContent[16 + 16 + 16 + 32 + 32];
+extern expected_file_data_s expected_file_data_after_restore_User1_InitialContent[10 + 10 + 10 + 10 + 10];
+
+bool_t Test_Recover_User1_InitialContent_From_All(sint_t type, void* pv);
+bool_t Test_Recover_User1_InitialContent_From_User1(sint_t type, void* pv);
+
+//===================================================================================================================
+// RECOVER DATA - User2 Seat1 InitialContent
+//===================================================================================================================
+
+extern expected_key_data_localDB_s expected_key_data_after_restore_User2_Seat1_InitialContent[16 + 16 + 16 + 32 + 32];
+extern expected_file_data_s expected_file_data_after_restore_User2_Seat1_InitialContent[10 + 10 + 10 + 10 + 10];
+
+bool_t Test_Recover_User2_Seat1_InitialContent_From_All(sint_t type, void* pv);
+bool_t Test_Recover_User2_Seat1_InitialContent_From_User2_Seat1(sint_t type, void* pv);
+
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_TEST_PAS_DATA_BACKUP_RECOVERY_H */
diff --git a/test/pers_svc_test/inc/test_pas_data_import.h b/test/pers_svc_test/inc/test_pas_data_import.h
new file mode 100644
index 0000000..314e13c
--- /dev/null
+++ b/test/pers_svc_test/inc/test_pas_data_import.h
@@ -0,0 +1,33 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+#include "test_PAS.h"
+
+bool_t ResetImportData(PersASSelectionType_e type);
+bool_t Test_import_all_app(sint_t type, void* pv);
+bool_t Test_import_all_all(sint_t type, void* pv);
+bool_t Test_import_all_user(sint_t type, void* pv);
+
+extern expected_key_data_localDB_s expected_key_data_after_import_app_all[22];
+extern expected_file_data_s expected_file_data_after_import_app_all[12];
+
+extern expected_key_data_localDB_s expected_key_data_after_import_all_all[57];
+extern expected_file_data_s expected_file_data_after_import_all_all[30];
+
+extern expected_key_data_localDB_s expected_key_data_after_import_all_user[57];
+extern expected_file_data_s expected_file_data_after_import_all_user[30];
diff --git a/test/pers_svc_test/inc/test_pas_data_restore_default.h b/test/pers_svc_test/inc/test_pas_data_restore_default.h
new file mode 100644
index 0000000..eb628e8
--- /dev/null
+++ b/test/pers_svc_test/inc/test_pas_data_restore_default.h
@@ -0,0 +1,89 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#ifndef SSW_TEST_PAS_DATA_RESTORE_DEFAULT_H
+#define SSW_TEST_PAS_DATA_RESTORE_DEFAULT_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "test_PAS.h"
+
+typedef struct
+{
+ pstr_t filename; /* contains the full path (with node, user,... prefix) */
+ bool_t bIsFolder; /* if true, the filename is a folder */
+ bool_t bExpectedToExist; /* if true, the key is expected to be found in the indicated DB */
+}expected_default_file_data_s;
+
+//===================================================================================================================
+// RESTORE DEFAULT - App1
+//===================================================================================================================
+
+extern expected_key_data_localDB_s expected_key_data_after_restore_default_App1[16 + 16 + 16 + 16 + 16];
+extern expected_file_data_s expected_file_data_after_restore_default_App1[10 + 10 + 10 + 10 + 10];
+
+bool_t Test_Restore_Factory_Default_App1(sint_t type, void* pv);
+bool_t Test_Restore_Configurable_Default_App1(sint_t type, void* pv);
+
+
+//===================================================================================================================
+// RESTORE DEFAULT - User 1
+//===================================================================================================================
+extern expected_key_data_localDB_s expected_key_data_after_restore_default_User1[16 + 16 + 16 + 16 + 16];
+extern expected_file_data_s expected_file_data_after_restore_default_User1[10 + 10 + 10 + 10 + 10];
+
+bool_t Test_Restore_Configurable_Default_User1(sint_t type, void* pv);
+
+
+//===================================================================================================================
+// RESTORE DEFAULT - All
+//===================================================================================================================
+extern expected_key_data_localDB_s expected_key_data_after_restore_default_All[16 + 16 + 16 + 16 + 16];
+extern expected_file_data_s expected_file_data_after_restore_default_All[10 + 10 + 10 + 10 + 10];
+
+bool_t Test_Restore_Factory_Default_All(sint_t type, void* pv);
+bool_t Test_Restore_Configurable_Default_All(sint_t type, void* pv);
+
+
+//===================================================================================================================
+// RESTORE DEFAULT - User2 Seat1
+//===================================================================================================================
+
+extern expected_key_data_localDB_s expected_key_data_after_restore_default_User2Seat1[16 + 16 + 16 + 16 + 16];
+extern expected_file_data_s expected_file_data_after_restore_default_User2Seat1[10 + 10 + 10 + 10 + 10];
+
+bool_t Test_Restore_Configurable_Default_User2Seat1(sint_t type, void* pv);
+
+//===================================================================================================================
+// RESTORE DEFAULT - User2 App1
+//===================================================================================================================
+
+extern expected_key_data_localDB_s expected_key_data_after_restore_default_User2App1[16 + 16 + 16 + 16 + 16];
+extern expected_file_data_s expected_file_data_after_restore_default_User2App1[10 + 10 + 10 + 10 + 10];
+
+bool_t Test_Restore_Configurable_Default_User2App1(sint_t type, void* pv);
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_TEST_PAS_DATA_RESTORE_DEFAULT_H*/
diff --git a/test/pers_svc_test/inc/test_pas_resource_config_add.h b/test/pers_svc_test/inc/test_pas_resource_config_add.h
new file mode 100644
index 0000000..d2ee86e
--- /dev/null
+++ b/test/pers_svc_test/inc/test_pas_resource_config_add.h
@@ -0,0 +1,49 @@
+/********************************************************************************************************************* * * Copyright (C) 2012 Continental Automotive Systems, Inc. * * Author: Petrica.Manoila@continental-corporation.com * * Implementation of backup process * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Date Author Reason * 2012.11.27 uidu0250 CSP_WZ#1280: Initial version * **********************************************************************************************************************/ #ifndef SSW_TEST_PAS_RESOURCE_CONFIG_ADD_H
+#define SSW_TEST_PAS_RESOURCE_CONFIG_ADD_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* #ifdef __cplusplus */
+
+#include "persComTypes.h"
+#include "test_PAS.h"
+
+extern expected_key_data_RCT_s expectedKeyData_RCT_resConfAdd_1[17] ;
+extern expected_key_data_localDB_s expectedKeyData_localDB_resConfAdd_1[41] ;
+expected_file_data_s expectedKeyData_files_resConfAdd_1[16] ;
+//extern expected_file_data_s expectedFileData_shared_public_AfterReset[11] ;
+
+extern expected_key_data_RCT_s expected_RCT_public[13] ;
+extern expected_key_data_localDB_s expectedKeyData_public[29] ;
+extern expected_file_data_s expectedFileData_public[18] ;
+
+extern expected_key_data_RCT_s expected_RCT_group_10[12] ;
+extern expected_key_data_localDB_s expectedKeyData_group_10[24] ;
+extern expected_file_data_s expectedFileData_group_10[18] ;
+
+extern expected_key_data_RCT_s expected_RCT_group_20[12] ;
+extern expected_key_data_localDB_s expectedKeyData_group_20[16] ;
+extern expected_file_data_s expectedFileData_group_20[10] ;
+
+extern expected_key_data_RCT_s expected_RCT_group_30[6] ;
+extern expected_key_data_localDB_s expectedKeyData_group_30[8] ;
+extern expected_file_data_s expectedFileData_group_30[4] ;
+
+extern expected_key_data_RCT_s expected_RCT_App30_Phase_1[6] ;
+extern expected_key_data_localDB_s expectedKeyData_App30_Phase_1[8] ;
+extern expected_file_data_s expectedFileData_App30_Phase_1[4] ;
+
+extern expected_key_data_RCT_s expected_RCT_public[13] ;
+extern expected_key_data_localDB_s expectedKeyData_public_phase2[29] ;
+extern expected_file_data_s expectedFileData_public_phase2[18] ;
+
+bool_t Test_ResourceConfigAdd_1(int ceva, void* pAltceva) ;
+bool_t Test_ResourceConfigAdd_2(int ceva, void* pAltceva) ;
+
+#ifdef __cplusplus
+}
+#endif /* extern "C" { */
+
+#endif /*SSW_TEST_PAS_RESOURCE_CONFIG_ADD_H */
diff --git a/test/pers_svc_test/src/test_PAS.c b/test/pers_svc_test/src/test_PAS.c
new file mode 100644
index 0000000..852c72b
--- /dev/null
+++ b/test/pers_svc_test/src/test_PAS.c
@@ -0,0 +1,1959 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+ 2013.04.15 uidu0250 CSP_WZ#3424: Add IF extension for "restore to default"
+ 2013.01.24 uidu0250 CSP_WZ#2246: Added additional test cases for persAdminDataBackupRecovery
+ 2012.12.11 uidu0250 CSP_WZ#1280: Added test cases for persAdminDataBackupRecovery
+ 2012.11.23 uidn3591, uidv2833 CSP_WZ#1280: Added test cases for persAdminDataBackupCreate & persAdminUserDataDelete
+ 2012.11.21 uidl9757 CSP_WZ#1280: Created (only framework and a dummy test case)
+*
+**********************************************************************************************************************/
+
+/* ---------------------- include files --------------------------------- */
+#include "persComTypes.h"
+#include "stdio.h"
+#include "string.h"
+#include "malloc.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "persComErrors.h"
+#include "persComDataOrg.h"
+#include "persComDbAccess.h"
+#include "persComRct.h"
+
+#include "ssw_pers_admin_files_helper.h"
+#include "ssw_pers_admin_dbus.h"
+
+#include "persistence_admin_service.h"
+
+#include "test_PAS.h"
+
+
+#include "test_pas_check_data_after_reset.h"
+#include "test_pas_data_backup_recovery.h"
+#include "test_pas_data_restore_default.h"
+#include "test_pas_resource_config_add.h"
+#include "test_pas_data_import.h"
+#include "test_pas_check_data_after_backup_application.h"
+#include "test_pas_check_data_after_delete_user2_data.h"
+#include "test_pas_check_data_after_backup_create_all.h"
+#include "test_pas_check_data_after_backup_user_all.h"
+#include "test_pas_check_data_after_backup_user2_seat_all.h"
+
+/* L&T context */
+#define LT_HDR "TEST_PAS >> "
+
+//static DLT_DECLARE_CONTEXT(testPersAdminDLTCtx);
+DLT_DECLARE_CONTEXT(persAdminSvcDLTCtx) ;
+#define testPersAdminDLTCtx persAdminSvcDLTCtx
+str_t g_msg[512] ;
+
+#define File_t PersistenceResourceType_file
+#define Key_t PersistenceResourceType_key
+
+
+static entryRctInit_s RCT_public_init[] =
+{
+ {"pubSettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared,File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared,File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared,File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared,File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeysPublicInit[] =
+{
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PersistencePolicy_wt, 0, 0, "Data>>/pubSettingA"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PersistencePolicy_wt, 2, 1, "Data>>/pubSettingB::user2::seat1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PersistencePolicy_wt, 2, 2, "Data>>/pubSettingB::user2:seat2"},
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PersistencePolicy_wt, 0, 0, "Data>>/pubSettingC"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PersistencePolicy_wt, 1, 0, "Data>>/pubSetting/ABC::user1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PersistencePolicy_wt, 2, 0, "Data>>/pubSetting/ABC::user2"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PersistencePolicy_wt, 3, 0, "Data>>/pubSetting/ABC::user3"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PersistencePolicy_wt, 4, 0, "Data>>/pubSetting/ABC::user4"},
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PersistencePolicy_wc, 0, 0, "Data>>/pubSettingD"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PersistencePolicy_wc, 2, 1, "Data>>/pubSettingE::user2:seat1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PersistencePolicy_wc, 2, 2, "Data>>/pubSettingE::user2:seat2"},
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PersistencePolicy_wc, 0, 0, "Data>>/pubSettingF"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/pubSetting/DEF::user1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/pubSetting/DEF::user2"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/pubSetting/DEF::user3"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/pubSetting/DEF::user4"}
+} ;
+
+
+static entryDataInit_s dataFilesPublicInit[] =
+{
+ {0, PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>/doc1.txt"},
+ {0, PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>/Docs/doc2.txt"},
+ {0, PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", PersistencePolicy_wc, 1, 0, "File>>/docA.txt::user1"},
+ {0, PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", PersistencePolicy_wc, 2, 0, "File>>/docA.txt::user2"},
+ {0, PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", PersistencePolicy_wc, 3, 0, "File>>/docA.txt::user3"},
+ {0, PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", PersistencePolicy_wc, 4, 0, "File>>/docA.txt::user4"},
+ {0, PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>/docB.txt::user2:seat1"},
+ {0, PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>/docB.txt::user2:seat2"},
+ {0, PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>/docB.txt::user2:seat3"},
+ {0, PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>/docB.txt::user2:seat4"}
+};
+
+static defaultDataInit_s factoryDefaultInitKey[] =
+{
+ {"pubSettingA", "FactoryDefault : pubSettingA : orig" },
+ {"pubSettingD", "FactoryDefault : pubSettingD : orig" },
+ {"pubSetting/ABC", "FactoryDefault : pubSetting/ABC : orig" }
+};
+
+static defaultDataInit_s configurableDefaultInitKey[] =
+{
+ {"pubSettingA", "ConfigurableDefault : pubSettingA : orig" },
+ {"pubSetting/ABC", "ConfigurableDefault : pubSetting/ABC : orig" }
+};
+
+static dataInit_s sSharedPubDataInit =
+{
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_public_init,
+ sizeof(RCT_public_init)/sizeof(RCT_public_init[0]),
+ dataKeysPublicInit,
+ sizeof(dataKeysPublicInit)/sizeof(dataKeysPublicInit[0]),
+ dataFilesPublicInit,
+ sizeof(dataFilesPublicInit)/sizeof(dataFilesPublicInit[0]),
+
+ "/Data/mnt-wt/shared/public"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_,
+ factoryDefaultInitKey,
+ sizeof(factoryDefaultInitKey)/sizeof(factoryDefaultInitKey[0]),
+ "/Data/mnt-wt/shared/public"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_,
+ configurableDefaultInitKey,
+ sizeof(configurableDefaultInitKey)/sizeof(configurableDefaultInitKey[0])
+} ;
+
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_group10_init[] =
+{
+ {"gr10_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"gr10_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"gr10_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"gr10_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"gr10_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"gr10_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"gr10_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"gr10_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"gr10_1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"Docs/gr10_A.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"gr10_2.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"Docs/gr10_B.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_Group10_Init[] =
+{
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PersistencePolicy_wt, 0, 0, "Data>>/gr10_SettingA"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/gr10_SettingB::user2::seat1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/gr10_SettingB::user2:seat2"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PersistencePolicy_wt, 0, 0, "Data>>/gr10_SettingC"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PersistencePolicy_wt, 1, 0, "Data>>/gr10_Setting/ABC::user1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PersistencePolicy_wt, 2, 0, "Data>>/gr10_Setting/ABC::user2"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PersistencePolicy_wt, 3, 0, "Data>>/gr10_Setting/ABC::user3"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PersistencePolicy_wt, 4, 0, "Data>>/gr10_Setting/ABC::user4"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/gr10_SettingD"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/gr10_SettingE::user2:seat1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/gr10_SettingE::user2:seat2"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/gr10_SettingF"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/gr10_Setting/DEF::user1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/gr10_Setting/DEF::user2"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/gr10_Setting/DEF::user3"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/gr10_Setting/DEF::user4"}
+} ;
+
+static defaultDataInit_s dataKeys_Group10_FactoryDefaultInit[] =
+{
+ {"gr10_SettingA", "FactoryDefault : gr10_SettingA : orig" },
+ {"gr10_SettingB", "FactoryDefault : gr10_SettingB : orig" },
+ {"gr10_SettingC", "FactoryDefault : gr10_SettingC : orig" },
+ {"gr10_Setting/ABC", "FactoryDefault : gr10_Setting/ABC : orig" }
+};
+
+static defaultDataInit_s dataKeys_Group10_ConfigurableDefaultInit[] =
+{
+ {"gr10_SettingA", "ConfigurableDefault : gr10_SettingA : orig" },
+ {"gr10_SettingB", "ConfigurableDefault : gr10_SettingB : orig" },
+ {"gr10_SettingC", "ConfigurableDefault : gr10_SettingC : orig" },
+ {"gr10_Setting/ABC", "ConfigurableDefault : gr10_Setting/ABC : orig" }
+};
+
+static entryDataInit_s dataFiles_Group10_Init[] =
+{
+ {0x10, PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/gr10_1.txt"},
+ {0x10, PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/Docs/gr10_A.txt"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", PersistencePolicy_wc, 1, 0, "File>>gr10_>>/gr10_2.txt::user1"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", PersistencePolicy_wc, 2, 0, "File>>gr10_>>/gr10_2.txt::user2"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", PersistencePolicy_wc, 3, 0, "File>>gr10_>>/gr10_2.txt::user3"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", PersistencePolicy_wc, 4, 0, "File>>gr10_>>/gr10_2.txt::user4"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 1, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 2, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 3, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 4, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4"},
+ /* factory-default data */
+ {0x10, PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/gr10_1.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/gr10_1.txt factory-default : orig"},
+ {0x10, PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/Docs/gr10_A.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/Docs/gr10_A.txt factory-default : orig"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/gr10_2.txt", PersistencePolicy_wc, 0, 0, "File>>gr10_>>/gr10_2.txt factory-default : orig"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/Docs/gr10_B.txt", PersistencePolicy_wc, 0, 0, "File>>gr10_>>/Docs/gr10_B.txt factory-default : orig"},
+ /* configurable-default data */
+ {0x10, PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/gr10_1.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/gr10_1.txt configurable-default : orig"},
+ {0x10, PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/Docs/gr10_A.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/Docs/gr10_A.txt configurable-default : orig"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/gr10_2.txt", PersistencePolicy_wc, 0, 0, "File>>gr10_>>/gr10_2.txt configurable-default : orig"},
+ {0x10, PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/Docs/gr10_B.txt", PersistencePolicy_wc, 0, 0, "File>>gr10_>>/Docs/gr10_B.txt configurable-default : orig"},
+};
+
+
+static dataInit_s sShared_Group10_DataInit =
+{
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group10_init,
+ sizeof(RCT_group10_init)/sizeof(RCT_group10_init[0]),
+ dataKeys_Group10_Init,
+ sizeof(dataKeys_Group10_Init)/sizeof(dataKeys_Group10_Init[0]),
+ dataFiles_Group10_Init,
+ sizeof(dataFiles_Group10_Init)/sizeof(dataFiles_Group10_Init[0]),
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_,
+ dataKeys_Group10_FactoryDefaultInit,
+ sizeof(dataKeys_Group10_FactoryDefaultInit)/sizeof(dataKeys_Group10_FactoryDefaultInit[0]),
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_,
+ dataKeys_Group10_ConfigurableDefaultInit,
+ sizeof(dataKeys_Group10_ConfigurableDefaultInit)/sizeof(dataKeys_Group10_ConfigurableDefaultInit[0])
+} ;
+
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_group20_init[] =
+{
+ {"gr20_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_Group20_Init[] =
+{
+ {0x20, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PersistencePolicy_wt, 0, 0, "Data>>/gr20_SettingA"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/gr20_SettingB::user2::seat1"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/gr20_SettingB::user2:seat2"},
+ {0x20, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PersistencePolicy_wt, 0, 0, "Data>>/gr20_SettingC"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PersistencePolicy_wt, 1, 0, "Data>>/gr20_Setting/ABC::user1"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PersistencePolicy_wt, 2, 0, "Data>>/gr20_Setting/ABC::user2"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PersistencePolicy_wt, 3, 0, "Data>>/gr20_Setting/ABC::user3"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PersistencePolicy_wt, 4, 0, "Data>>/gr20_Setting/ABC::user4"},
+ {0x20, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/gr20_SettingD"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/gr20_SettingE::user2:seat1"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/gr20_SettingE::user2:seat2"},
+ {0x20, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/gr20_SettingF"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/gr20_Setting/DEF::user1"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/gr20_Setting/DEF::user2"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/gr20_Setting/DEF::user3"},
+ {0x20, PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/gr20_Setting/DEF::user4"}
+};
+
+static entryDataInit_s dataFiles_Group20_Init[] =
+{
+ {0x20, PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>gr20_>>/doc1.txt"},
+ {0x20, PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>gr20_>>/Docs/doc2.txt"},
+ {0x20, PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", PersistencePolicy_wc, 1, 0, "File>>gr20_>>/docA.txt::user1"},
+ {0x20, PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", PersistencePolicy_wc, 2, 0, "File>>gr20_>>/docA.txt::user2"},
+ {0x20, PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", PersistencePolicy_wc, 3, 0, "File>>gr20_>>/docA.txt::user3"},
+ {0x20, PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", PersistencePolicy_wc, 4, 0, "File>>gr20_>>/docA.txt::user4"},
+ {0x20, PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>gr20_>>/docB.txt::user2:seat1"},
+ {0x20, PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>gr20_>>/docB.txt::user2:seat2"},
+ {0x20, PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>gr20_>>/docB.txt::user2:seat3"},
+ {0x20, PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>gr20_>>/docB.txt::user2:seat4"}
+};
+
+
+static dataInit_s sShared_Group20_DataInit =
+{
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group20_init,
+ sizeof(RCT_group20_init)/sizeof(RCT_group20_init[0]),
+ dataKeys_Group20_Init,
+ sizeof(dataKeys_Group20_Init)/sizeof(dataKeys_Group20_Init[0]),
+ dataFiles_Group20_Init,
+ sizeof(dataFiles_Group20_Init)/sizeof(dataFiles_Group20_Init[0]),
+ NIL,
+ NIL,
+ 0,
+ NIL,
+ NIL,
+ 0
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_App1_init[] =
+{
+ {"App1_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"App1_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"App1_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"App1_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"App1_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"App1_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"App1_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"App1_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"},{NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_App1_Init[] =
+{
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PersistencePolicy_wt, 0, 0, "Data>>/App1_SettingA"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/App1_SettingB::user2::seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/App1_SettingB::user2:seat2"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PersistencePolicy_wt, 0, 0, "Data>>/App1_SettingC"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PersistencePolicy_wt, 1, 0, "Data>>/App1_Setting/ABC::user1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PersistencePolicy_wt, 2, 0, "Data>>/App1_Setting/ABC::user2"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PersistencePolicy_wt, 3, 0, "Data>>/App1_Setting/ABC::user3"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PersistencePolicy_wt, 4, 0, "Data>>/App1_Setting/ABC::user4"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/App1_SettingD"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/App1_SettingE::user2:seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/App1_SettingE::user2:seat2"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/App1_SettingF"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/App1_Setting/DEF::user1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/App1_Setting/DEF::user2"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/App1_Setting/DEF::user3"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/App1_Setting/DEF::user4"}
+} ;
+
+static entryDataInit_s dataFiles_App1_Init[] =
+{
+ {0xFF, PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>App1>>/doc1.txt"},
+ {0xFF, PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>App1>>/Docs/doc2.txt"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", PersistencePolicy_wc, 1, 0, "File>>App1>>/docA.txt::user1"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", PersistencePolicy_wc, 2, 0, "File>>App1>>/docA.txt::user2"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", PersistencePolicy_wc, 3, 0, "File>>App1>>/docA.txt::user3"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", PersistencePolicy_wc, 4, 0, "File>>App1>>/docA.txt::user4"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>App1>>/docB.txt::user2:seat1"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>App1>>/docB.txt::user2:seat2"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>App1>>/docB.txt::user2:seat3"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docB.txt::user2:seat4"}
+};
+
+
+static dataInit_s s_App1_DataInit =
+{
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App1_init,
+ sizeof(RCT_App1_init)/sizeof(RCT_App1_init[0]),
+ dataKeys_App1_Init,
+ sizeof(dataKeys_App1_Init)/sizeof(dataKeys_App1_Init[0]),
+ dataFiles_App1_Init,
+ sizeof(dataFiles_App1_Init)/sizeof(dataFiles_App1_Init[0]),
+ NIL,
+ NIL,
+ 0,
+ NIL,
+ NIL,
+ 0
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_App2_init[] =
+{
+ {"App2_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"App2_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"App2_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"App2_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"App2_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"App2_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"App2_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"App2_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"},{NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_App2_Init[] =
+{
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PersistencePolicy_wt, 0, 0, "Data>>/App2_SettingA"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/App2_SettingB::user2::seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/App2_SettingB::user2:seat2"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PersistencePolicy_wt, 0, 0, "Data>>/App2_SettingC"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PersistencePolicy_wt, 1, 0, "Data>>/App2_Setting/ABC::user1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PersistencePolicy_wt, 2, 0, "Data>>/App2_Setting/ABC::user2"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PersistencePolicy_wt, 3, 0, "Data>>/App2_Setting/ABC::user3"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PersistencePolicy_wt, 4, 0, "Data>>/App2_Setting/ABC::user4"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/App2_SettingD"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/App2_SettingE::user2:seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/App2_SettingE::user2:seat2"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/App2_SettingF"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/App2_Setting/DEF::user1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/App2_Setting/DEF::user2"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/App2_Setting/DEF::user3"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/App2_Setting/DEF::user4"}
+} ;
+
+static entryDataInit_s dataFiles_App2_Init[] =
+{
+ {0xFF, PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>App2>>/doc1.txt"},
+ {0xFF, PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>App2>>/Docs/doc2.txt"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", PersistencePolicy_wc, 1, 0, "File>>App2>>/docA.txt::user1"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", PersistencePolicy_wc, 2, 0, "File>>App2>>/docA.txt::user2"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", PersistencePolicy_wc, 3, 0, "File>>App2>>/docA.txt::user3"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", PersistencePolicy_wc, 4, 0, "File>>App2>>/docA.txt::user4"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>App2>>/docB.txt::user2:seat1"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>App2>>/docB.txt::user2:seat2"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>App2>>/docB.txt::user2:seat3"},
+ {0xFF, PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docB.txt::user2:seat4"}
+};
+
+
+static dataInit_s s_App2_DataInit =
+{
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App2_init,
+ sizeof(RCT_App2_init)/sizeof(RCT_App2_init[0]),
+ dataKeys_App2_Init,
+ sizeof(dataKeys_App2_Init)/sizeof(dataKeys_App2_Init[0]),
+ dataFiles_App2_Init,
+ sizeof(dataFiles_App2_Init)/sizeof(dataFiles_App2_Init[0]),
+ NIL,
+ NIL,
+ 0,
+ NIL,
+ NIL,
+ 0
+} ;
+
+
+
+#if 0
+expected_key_data_localDB_s expectedKeyDataAfterExportAll[] =
+{
+ /* add here ... */
+};
+expected_file_data_s expectedFileDataAfterExportAll[] =
+{
+ /* add here ... */
+}
+#endif
+
+/**************************************************************************************************************
+***************************************** ADD TEST CASES HERE ********************************************
+**************************************************************************************************************/
+
+testcase_s tc_testDataAfterReset =
+{
+ Test_DataAfterReset,
+ 0,
+ NIL,
+ "Check reference data structure after initialization",
+ expectedKeyData_shared_public_RCT_AfterReset,
+ sizeof(expectedKeyData_shared_public_RCT_AfterReset)/sizeof(expectedKeyData_shared_public_RCT_AfterReset[0]),
+ expectedKeyData_shared_public_localDB_AfterReset,
+ sizeof(expectedKeyData_shared_public_localDB_AfterReset)/sizeof(expectedKeyData_shared_public_localDB_AfterReset[0]),
+ expectedFileData_shared_public_AfterReset,
+ sizeof(expectedFileData_shared_public_AfterReset)/sizeof(expectedFileData_shared_public_AfterReset[0])
+};
+
+testcase_s tc_testResourceConfigAdd_public =
+{
+ Test_ResourceConfigAdd_1,
+ 0,
+ NIL,
+ "Resource Config Add : Configure public",
+ expected_RCT_public,
+ sizeof(expected_RCT_public)/sizeof(expected_RCT_public[0]),
+ expectedKeyData_public,
+ sizeof(expectedKeyData_public)/sizeof(expectedKeyData_public[0]),
+ expectedFileData_public,
+ sizeof(expectedFileData_public)/sizeof(expectedFileData_public[0]),
+ false
+};
+
+testcase_s tc_testResourceConfigAdd_group_10 =
+{
+ NIL, //skip it
+ 0,
+ NIL,
+ "Resource Config Add : Configure group 10",
+ expected_RCT_group_10,
+ sizeof(expected_RCT_group_10)/sizeof(expected_RCT_group_10[0]),
+ expectedKeyData_group_10,
+ sizeof(expectedKeyData_group_10)/sizeof(expectedKeyData_group_10[0]),
+ expectedFileData_group_10,
+ sizeof(expectedFileData_group_10)/sizeof(expectedFileData_group_10[0]),
+ true //skip data reset
+};
+
+testcase_s tc_testResourceConfigAdd_group_20 =
+{
+ NIL, //skip it
+ 0,
+ NIL,
+ "Resource Config Add : Configure group 20",
+ expected_RCT_group_20,
+ sizeof(expected_RCT_group_20)/sizeof(expected_RCT_group_20[0]),
+ expectedKeyData_group_20,
+ sizeof(expectedKeyData_group_20)/sizeof(expectedKeyData_group_20[0]),
+ expectedFileData_group_20,
+ sizeof(expectedFileData_group_20)/sizeof(expectedFileData_group_20[0]),
+ true //skip data reset
+};
+
+testcase_s tc_testResourceConfigAdd_group_30 =
+{
+ NIL, //skip it
+ 0,
+ NIL,
+ "Resource Config Add : Configure new group 30",
+ expected_RCT_group_30,
+ sizeof(expected_RCT_group_30)/sizeof(expected_RCT_group_30[0]),
+ expectedKeyData_group_30,
+ sizeof(expectedKeyData_group_30)/sizeof(expectedKeyData_group_30[0]),
+ expectedFileData_group_30,
+ sizeof(expectedFileData_group_30)/sizeof(expectedFileData_group_30[0]),
+ true //skip data reset
+};
+
+testcase_s tc_testResourceConfigAdd_App30 =
+{
+ NIL, //skip it
+ 0,
+ NIL,
+ "Resource Config Add : Configure new App30",
+ expected_RCT_App30_Phase_1,
+ sizeof(expected_RCT_App30_Phase_1)/sizeof(expected_RCT_App30_Phase_1[0]),
+ expectedKeyData_App30_Phase_1,
+ sizeof(expectedKeyData_App30_Phase_1)/sizeof(expectedKeyData_App30_Phase_1[0]),
+ expectedFileData_App30_Phase_1,
+ sizeof(expectedFileData_App30_Phase_1)/sizeof(expectedFileData_App30_Phase_1[0]),
+ true //skip data reset
+};
+
+testcase_s tc_testResourceConfigAdd_public_phase_2 =
+{
+ Test_ResourceConfigAdd_2,
+ 0,
+ NIL,
+ "Resource Config Add : Configure public - Phase 2",
+ expected_RCT_public,
+ sizeof(expected_RCT_public)/sizeof(expected_RCT_public[0]),
+ expectedKeyData_public_phase2,
+ sizeof(expectedKeyData_public_phase2)/sizeof(expectedKeyData_public_phase2[0]),
+ expectedFileData_public_phase2,
+ sizeof(expectedFileData_public_phase2)/sizeof(expectedFileData_public_phase2[0]),
+ true //skip data reset
+};
+
+testcase_s tc_testDataAfterDeleteUser2Data =
+{
+ Test_DataAfterDeleteUser2Data,
+ 0,
+ NIL,
+ "Check user data delete for user 2 data",
+ NIL,
+ 0,
+ expectedKeyData_shared_public_localDB_AfterDeleteUser2Data,
+ sizeof(expectedKeyData_shared_public_localDB_AfterDeleteUser2Data)/sizeof(expectedKeyData_shared_public_localDB_AfterDeleteUser2Data[0]),
+ expectedFileData_shared_public_AfterDeleteUser2Data,
+ sizeof(expectedFileData_shared_public_AfterDeleteUser2Data)/sizeof(expectedFileData_shared_public_AfterDeleteUser2Data[0]),
+ false
+};
+
+testcase_s tc_testDataAfterBackupCreateAll =
+{
+ Test_DataAfterBackupCreateAll,
+ 0,
+ NIL,
+ "Check data backup create all",
+ NIL,
+ 0,
+ expectedKeyData_shared_public_localDB_AfterBackupCreateAll,
+ sizeof(expectedKeyData_shared_public_localDB_AfterBackupCreateAll)/sizeof(expectedKeyData_shared_public_localDB_AfterBackupCreateAll[0]),
+ expectedFileData_shared_public_AfterBackupCreateAll,
+ sizeof(expectedFileData_shared_public_AfterBackupCreateAll)/sizeof(expectedFileData_shared_public_AfterBackupCreateAll[0]),
+ false
+};
+
+testcase_s tc_testDataAfterBackupCreateApplication =
+{
+ Test_DataAfterBackupCreateApplication,
+ 0,
+ NIL,
+ "Check data backup create application",
+ NIL,
+ 0,
+ expectedKeyData_shared_public_localDB_AfterBackupApplication,
+ sizeof(expectedKeyData_shared_public_localDB_AfterBackupApplication)/sizeof(expectedKeyData_shared_public_localDB_AfterBackupApplication[0]),
+ expectedFileData_shared_public_AfterBackupApplication,
+ sizeof(expectedFileData_shared_public_AfterBackupApplication)/sizeof(expectedFileData_shared_public_AfterBackupApplication[0]),
+ false
+};
+
+testcase_s tc_testDataAfterBackupCreateUserAll =
+{
+ Test_DataAfterBackupCreateUserAll,
+ 0,
+ NIL,
+ "Check data backup create user all",
+ NIL,
+ 0,
+ expectedKeyData_shared_public_localDB_AfterBackupUserAll,
+ sizeof(expectedKeyData_shared_public_localDB_AfterBackupUserAll)/sizeof(expectedKeyData_shared_public_localDB_AfterBackupUserAll[0]),
+ expectedFileData_shared_public_AfterBackupUserAll,
+ sizeof(expectedFileData_shared_public_AfterBackupUserAll)/sizeof(expectedFileData_shared_public_AfterBackupUserAll[0]),
+ false
+};
+
+testcase_s tc_testDataAfterBackupCreateUser2SeatAll =
+{
+ Test_DataAfterBackupCreateUser2SeatAll,
+ 0,
+ NIL,
+ "Check data backup create user 2 seat all",
+ NIL,
+ 0,
+ expectedKeyData_shared_public_localDB_AfterBackupUser2SeatAll,
+ sizeof(expectedKeyData_shared_public_localDB_AfterBackupUser2SeatAll)/sizeof(expectedKeyData_shared_public_localDB_AfterBackupUser2SeatAll[0]),
+ expectedFileData_shared_public_AfterBackupUser2SeatAll,
+ sizeof(expectedFileData_shared_public_AfterBackupUser2SeatAll)/sizeof(expectedFileData_shared_public_AfterBackupUser2SeatAll[0]),
+ false
+};
+
+testcase_s tc_test_Recover_App1 =
+{
+ Test_Recover_App1,
+ 0,
+ NIL,
+ "Check reference data structure after App1 recovery",
+ NIL,
+ 0,
+ expected_key_data_after_restore_App1,
+ sizeof(expected_key_data_after_restore_App1)/sizeof(expected_key_data_after_restore_App1[0]),
+ expected_file_data_after_restore_App1,
+ sizeof(expected_file_data_after_restore_App1)/sizeof(expected_file_data_after_restore_App1[0]),
+ false
+};
+
+testcase_s tc_test_Recover_User1 =
+{
+ Test_Recover_User1,
+ 0,
+ NIL,
+ "Check reference data structure after User1 recovery",
+ NIL,
+ 0,
+ expected_App1_key_data_after_restore_User1,
+ sizeof(expected_App1_key_data_after_restore_User1)/sizeof(expected_App1_key_data_after_restore_User1[0]),
+ expected_App1_file_data_after_restore_User1,
+ sizeof(expected_App1_file_data_after_restore_User1)/sizeof(expected_App1_file_data_after_restore_User1[0]),
+ false
+};
+
+testcase_s tc_test_Recover_All =
+{
+ Test_Recover_All,
+ 0,
+ NIL,
+ "Check reference data structure after All recovery",
+ NIL,
+ 0,
+ expected_key_data_after_restore_All,
+ sizeof(expected_key_data_after_restore_All)/sizeof(expected_key_data_after_restore_All[0]),
+ expected_file_data_after_restore_All,
+ sizeof(expected_file_data_after_restore_All)/sizeof(expected_file_data_after_restore_All[0]),
+ false
+};
+
+testcase_s tc_test_Recover_Users =
+{
+ Test_Recover_Users,
+ 0,
+ NIL,
+ "Check reference data structure after All recovery",
+ NIL,
+ 0,
+ expected_key_data_after_restore_Users,
+ sizeof(expected_key_data_after_restore_Users)/sizeof(expected_key_data_after_restore_Users[0]),
+ expected_file_data_after_restore_Users,
+ sizeof(expected_file_data_after_restore_Users)/sizeof(expected_file_data_after_restore_Users[0]),
+ false
+};
+
+testcase_s tc_test_Recover_All_InitialContent =
+{
+ Test_Recover_All_InitialContent,
+ 0,
+ NIL,
+ "Check reference data structure after All InitialContent recovery",
+ NIL,
+ 0,
+ expected_key_data_after_restore_All_InitialContent,
+ sizeof(expected_key_data_after_restore_All_InitialContent)/sizeof(expected_key_data_after_restore_All_InitialContent[0]),
+ expected_file_data_after_restore_All_InitialContent,
+ sizeof(expected_file_data_after_restore_All_InitialContent)/sizeof(expected_file_data_after_restore_All_InitialContent[0]),
+ false
+};
+
+testcase_s tc_test_Recover_App1_InitialContent_From_All =
+{
+ Test_Recover_App1_InitialContent_From_All,
+ 0,
+ NIL,
+ "Check reference data structure after App1 InitialContent recovery from All",
+ NIL,
+ 0,
+ expected_key_data_after_restore_App1_InitialContent,
+ sizeof(expected_key_data_after_restore_App1_InitialContent)/sizeof(expected_key_data_after_restore_App1_InitialContent[0]),
+ expected_file_data_after_restore_App1_InitialContent,
+ sizeof(expected_file_data_after_restore_App1_InitialContent)/sizeof(expected_file_data_after_restore_App1_InitialContent[0]),
+ false
+};
+
+testcase_s tc_test_Recover_App1_InitialContent_From_App1 =
+{
+ Test_Recover_App1_InitialContent_From_App1,
+ 0,
+ NIL,
+ "Check reference data structure after App1 InitialContent recovery from App1",
+ NIL,
+ 0,
+ expected_key_data_after_restore_App1_InitialContent,
+ sizeof(expected_key_data_after_restore_App1_InitialContent)/sizeof(expected_key_data_after_restore_App1_InitialContent[0]),
+ expected_file_data_after_restore_App1_InitialContent,
+ sizeof(expected_file_data_after_restore_App1_InitialContent)/sizeof(expected_file_data_after_restore_App1_InitialContent[0]),
+ false
+};
+
+testcase_s tc_test_Recover_User1_InitialContent_From_All =
+{
+ Test_Recover_User1_InitialContent_From_All,
+ 0,
+ NIL,
+ "Check reference data structure after User1 InitialContent recovery from All",
+ NIL,
+ 0,
+ expected_key_data_after_restore_User1_InitialContent,
+ sizeof(expected_key_data_after_restore_User1_InitialContent)/sizeof(expected_key_data_after_restore_User1_InitialContent[0]),
+ expected_file_data_after_restore_User1_InitialContent,
+ sizeof(expected_file_data_after_restore_User1_InitialContent)/sizeof(expected_file_data_after_restore_User1_InitialContent[0]),
+ false
+};
+
+testcase_s tc_test_Recover_User1_InitialContent_From_User1 =
+{
+ Test_Recover_User1_InitialContent_From_User1,
+ 0,
+ NIL,
+ "Check reference data structure after User1 InitialContent recovery from User1",
+ NIL,
+ 0,
+ expected_key_data_after_restore_User1_InitialContent,
+ sizeof(expected_key_data_after_restore_User1_InitialContent)/sizeof(expected_key_data_after_restore_User1_InitialContent[0]),
+ expected_file_data_after_restore_User1_InitialContent,
+ sizeof(expected_file_data_after_restore_User1_InitialContent)/sizeof(expected_file_data_after_restore_User1_InitialContent[0]),
+ false
+};
+
+testcase_s tc_test_Recover_User2_Seat1_InitialContent_From_All =
+{
+ Test_Recover_User2_Seat1_InitialContent_From_All,
+ 0,
+ NIL,
+ "Check reference data structure after User2 Seat1 InitialContent recovery from All",
+ NIL,
+ 0,
+ expected_key_data_after_restore_User2_Seat1_InitialContent,
+ sizeof(expected_key_data_after_restore_User2_Seat1_InitialContent)/sizeof(expected_key_data_after_restore_User2_Seat1_InitialContent[0]),
+ expected_file_data_after_restore_User2_Seat1_InitialContent,
+ sizeof(expected_file_data_after_restore_User2_Seat1_InitialContent)/sizeof(expected_file_data_after_restore_User2_Seat1_InitialContent[0]),
+ false
+};
+
+testcase_s tc_test_Recover_User2_Seat1_InitialContent_From_User2_Seat1 =
+{
+ Test_Recover_User2_Seat1_InitialContent_From_User2_Seat1,
+ 0,
+ NIL,
+ "Check reference data structure after User2 Seat1 InitialContent recovery from User2 Seat1",
+ NIL,
+ 0,
+ expected_key_data_after_restore_User2_Seat1_InitialContent,
+ sizeof(expected_key_data_after_restore_User2_Seat1_InitialContent)/sizeof(expected_key_data_after_restore_User2_Seat1_InitialContent[0]),
+ expected_file_data_after_restore_User2_Seat1_InitialContent,
+ sizeof(expected_file_data_after_restore_User2_Seat1_InitialContent)/sizeof(expected_file_data_after_restore_User2_Seat1_InitialContent[0]),
+ false
+};
+
+testcase_s tc_test_Restore_Factory_Default_App1 =
+{
+ Test_Restore_Factory_Default_App1,
+ 0,
+ NIL,
+ "Check reference data structure after restore to factory default of App1",
+ NIL,
+ 0,
+ expected_key_data_after_restore_default_App1,
+ sizeof(expected_key_data_after_restore_default_App1)/sizeof(expected_key_data_after_restore_default_App1[0]),
+ expected_file_data_after_restore_default_App1,
+ sizeof(expected_file_data_after_restore_default_App1)/sizeof(expected_file_data_after_restore_default_App1[0]),
+ false
+};
+
+testcase_s tc_test_Restore_Configurable_Default_App1 =
+{
+ Test_Restore_Configurable_Default_App1,
+ 0,
+ NIL,
+ "Check reference data structure after restore to configurable default of App1",
+ NIL,
+ 0,
+ expected_key_data_after_restore_default_App1,
+ sizeof(expected_key_data_after_restore_default_App1)/sizeof(expected_key_data_after_restore_default_App1[0]),
+ expected_file_data_after_restore_default_App1,
+ sizeof(expected_file_data_after_restore_default_App1)/sizeof(expected_file_data_after_restore_default_App1[0]),
+ false
+};
+
+testcase_s tc_test_Restore_Configurable_Default_User1 =
+{
+ Test_Restore_Configurable_Default_User1,
+ 0,
+ NIL,
+ "Check reference data structure after restore to configurable default of User1",
+ NIL,
+ 0,
+ expected_key_data_after_restore_default_User1,
+ sizeof(expected_key_data_after_restore_default_User1)/sizeof(expected_key_data_after_restore_default_User1[0]),
+ expected_file_data_after_restore_default_User1,
+ sizeof(expected_file_data_after_restore_default_User1)/sizeof(expected_file_data_after_restore_default_User1[0]),
+ false
+};
+
+testcase_s tc_test_Restore_Configurable_Default_User2Seat1 =
+{
+ Test_Restore_Configurable_Default_User2Seat1,
+ 0,
+ NIL,
+ "Check reference data structure after restore to configurable default of User2 Seat1",
+ NIL,
+ 0,
+ expected_key_data_after_restore_default_User2Seat1,
+ sizeof(expected_key_data_after_restore_default_User2Seat1)/sizeof(expected_key_data_after_restore_default_User2Seat1[0]),
+ expected_file_data_after_restore_default_User2Seat1,
+ sizeof(expected_file_data_after_restore_default_User2Seat1)/sizeof(expected_file_data_after_restore_default_User2Seat1[0]),
+ false
+};
+
+testcase_s tc_test_Restore_Configurable_Default_User2App1 =
+{
+ Test_Restore_Configurable_Default_User2App1,
+ 0,
+ NIL,
+ "Check reference data structure after restore to configurable default of User2 App1",
+ NIL,
+ 0,
+ expected_key_data_after_restore_default_User2App1,
+ sizeof(expected_key_data_after_restore_default_User2App1)/sizeof(expected_key_data_after_restore_default_User2App1[0]),
+ expected_file_data_after_restore_default_User2App1,
+ sizeof(expected_file_data_after_restore_default_User2App1)/sizeof(expected_file_data_after_restore_default_User2App1[0]),
+ false
+};
+
+testcase_s tc_test_Restore_Factory_Default_All =
+{
+ Test_Restore_Factory_Default_All,
+ 0,
+ NIL,
+ "Check reference data structure after restore to factory default All content",
+ NIL,
+ 0,
+ expected_key_data_after_restore_default_All,
+ sizeof(expected_key_data_after_restore_default_All)/sizeof(expected_key_data_after_restore_default_All[0]),
+ expected_file_data_after_restore_default_All,
+ sizeof(expected_file_data_after_restore_default_All)/sizeof(expected_file_data_after_restore_default_All[0]),
+ false
+};
+
+testcase_s tc_test_Restore_Configurable_Default_All =
+{
+ Test_Restore_Configurable_Default_All,
+ 0,
+ NIL,
+ "Check reference data structure after restore to configurable default All content",
+ NIL,
+ 0,
+ expected_key_data_after_restore_default_All,
+ sizeof(expected_key_data_after_restore_default_All)/sizeof(expected_key_data_after_restore_default_All[0]),
+ expected_file_data_after_restore_default_All,
+ sizeof(expected_file_data_after_restore_default_All)/sizeof(expected_file_data_after_restore_default_All[0]),
+ false
+};
+
+
+testcase_s tc_testImportApp =
+{
+ Test_import_all_app,
+ 0,
+ NIL,
+ "Import all _ app",
+ NIL,
+ 0,
+ expected_key_data_after_import_app_all,
+ sizeof(expected_key_data_after_import_app_all)/sizeof(expected_key_data_after_import_app_all[0]),
+ expected_file_data_after_import_app_all,
+ sizeof(expected_file_data_after_import_app_all)/sizeof(expected_file_data_after_import_app_all[0]),
+ false
+};
+
+testcase_s tc_testImportAll =
+{
+ Test_import_all_all,
+ 0,
+ NIL,
+ "Import all _ all",
+ NIL,
+ 0,
+ expected_key_data_after_import_all_all,
+ sizeof(expected_key_data_after_import_all_all)/sizeof(expected_key_data_after_import_all_all[0]),
+ expected_file_data_after_import_all_all,
+ sizeof(expected_file_data_after_import_all_all)/sizeof(expected_file_data_after_import_all_all[0]),
+ false
+};
+
+testcase_s tc_testImportUser =
+{
+ Test_import_all_user,
+ 0,
+ NIL,
+ "Import all _ user",
+ NIL,
+ 0,
+ expected_key_data_after_import_all_user,
+ sizeof(expected_key_data_after_import_all_user)/sizeof(expected_key_data_after_import_all_user[0]),
+ expected_file_data_after_import_all_user,
+ sizeof(expected_file_data_after_import_all_user)/sizeof(expected_file_data_after_import_all_user[0]),
+ false
+};
+
+
+
+
+/**************************************************************************************************************
+***************************************** ADD TEST CASES HERE ********************************************
+**************************************************************************************************************/
+
+testcase_s* testCases[] =
+{
+ /* add here test cases */
+
+ /* ResourceConfigAdd */
+ /* don't change the order - start */
+ &tc_testResourceConfigAdd_public
+ ,&tc_testResourceConfigAdd_group_10
+ ,&tc_testResourceConfigAdd_group_20
+ ,&tc_testResourceConfigAdd_group_30
+ ,&tc_testResourceConfigAdd_App30
+ ,&tc_testResourceConfigAdd_public_phase_2
+ /* don't change the order - end */
+
+
+ /* Delete */
+ ,&tc_testDataAfterDeleteUser2Data
+
+ /* Backup */
+ ,&tc_testDataAfterBackupCreateAll
+ ,&tc_testDataAfterBackupCreateApplication
+ ,&tc_testDataAfterBackupCreateUserAll
+ ,&tc_testDataAfterBackupCreateUser2SeatAll
+
+ /* Recovery */
+ ,&tc_test_Recover_App1
+ ,&tc_test_Recover_User1
+ ,&tc_test_Recover_All
+ ,&tc_test_Recover_Users
+ ,&tc_test_Recover_All_InitialContent
+ ,&tc_test_Recover_App1_InitialContent_From_All
+ ,&tc_test_Recover_App1_InitialContent_From_App1
+ ,&tc_test_Recover_User1_InitialContent_From_All
+ ,&tc_test_Recover_User1_InitialContent_From_User1
+ ,&tc_test_Recover_User2_Seat1_InitialContent_From_All
+ ,&tc_test_Recover_User2_Seat1_InitialContent_From_User2_Seat1
+
+ /* Restore default */
+ ,&tc_test_Restore_Factory_Default_App1
+ ,&tc_test_Restore_Configurable_Default_App1
+ ,&tc_test_Restore_Configurable_Default_User1
+ ,&tc_test_Restore_Factory_Default_All
+ ,&tc_test_Restore_Configurable_Default_All
+ ,&tc_test_Restore_Configurable_Default_User2Seat1
+ ,&tc_test_Restore_Configurable_Default_User2App1
+
+ /* Import */
+ ,&tc_testImportApp
+ ,&tc_testImportAll
+ ,&tc_testImportUser
+} ;
+
+
+
+/**********************************************************************************************************************************************
+ *********************************************************************************************************************************************/
+
+
+
+typedef struct
+{
+ void* dbHandle ;
+ pstr_t dbPath ;
+ dbType_e dbType ;
+}db_handle_s;
+
+
+
+static bool_t ResetReferenceData(void) ;
+static bool_t CreateFileWithData(pstr_t filePath, pstr_t data, sint_t dataSize) ;
+static bool_t ExecuteTestCase(testcase_s* psTestCase) ;
+
+static sint_t persadmin_serialize_data(PersistenceConfigurationKey_s pc, char* buffer) ;
+
+static bool_t CreateFileWithData(pstr_t filePath, pstr_t data, sint_t dataSize)
+{
+ bool_t bEverythingOK = true ;
+ str_t folderPath[256] ;
+
+ if((NIL == filePath) || (NIL == data) || (dataSize < 0))
+ {
+ bEverythingOK = false ;
+ }
+
+ if(bEverythingOK)
+ {
+ sint_t result = persadmin_get_folder_path(filePath, folderPath, sizeof(folderPath)) ;
+ if(result >= 0)
+ {
+ result = persadmin_create_folder(folderPath) ;
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ FILE *pFile = fopen(filePath, "wb") ;
+ if(NIL != pFile)
+ {
+ if(dataSize != fwrite (data , 1 , dataSize , pFile ))
+ {
+ bEverythingOK = false ;
+ }
+ fclose (pFile);
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+bool_t InitDataFolder(dataInit_s* psDataInit)
+{
+ bool_t bEverythingOK = true ;
+ sint_t i = 0 ;
+
+ if(0 > persadmin_create_folder(psDataInit->installFolderPath))
+ {
+ bEverythingOK = false ;
+ }
+ #if 0
+ else
+ {
+ str_t buffer[1] ;
+ if(! CreateFileWithData(psDataInit->RCT_pathname, buffer, 0))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ #endif
+
+ if(bEverythingOK)
+ {
+ if( (NIL != psDataInit->RctInitTab)
+ && (NIL != psDataInit->RCT_pathname)
+ && (psDataInit->RctDBtype)
+ )
+ {
+ sint_t rctHandler = persComRctOpen(psDataInit->RCT_pathname, true) ;
+ if(rctHandler >= 0)
+ {
+ for(i = 0 ; i < psDataInit->noEntriesRctInitTab ; i++)
+ {
+ str_t buffer[64] ;
+ persadmin_serialize_data(psDataInit->RctInitTab[i].sRctEntry, buffer) ;
+ psDataInit->RctInitTab[i].sRctEntry.type =
+ psDataInit->RctInitTab[i].bIsKey ? PersistenceResourceType_key : PersistenceResourceType_file ;
+
+ if(0 > persComRctWrite(rctHandler, psDataInit->RctInitTab[i].resourceID, &psDataInit->RctInitTab[i].sRctEntry))
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "persComRctWrite(<%s> <%s> <%s>) FAILED", psDataInit->RCT_pathname, psDataInit->RctInitTab[i].resourceID, buffer) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ break ;
+ }
+ else
+ {
+ sprintf(g_msg, "persComRctWrite(<%s> <%s> <%s> type=%d) done",
+ psDataInit->RCT_pathname, psDataInit->RctInitTab[i].resourceID, buffer, psDataInit->RctInitTab[i].sRctEntry.type) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ persComRctClose(rctHandler) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "persComRctOpen(<<%s>>, true) FAILED", psDataInit->RCT_pathname) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ if(NIL != psDataInit->dataKeysInitTab)
+ {
+ sint_t wcDbHandler = persComDbOpen(psDataInit->wcDBpathname, true) ;
+ sint_t wtDbHandler = persComDbOpen(psDataInit->wtDBpathname, true) ;
+ sprintf(g_msg, "InitDataFolder: wcDbHandler=<%d> wtDbHandler=<%d>", wcDbHandler, wtDbHandler) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ for(i = 0 ; i < psDataInit->noEntriesDataKeysInitTab; i++)
+ {
+ pstr_t dbPath = ( PersistencePolicy_wc == psDataInit->dataKeysInitTab[i].policy) ? psDataInit->wcDBpathname : psDataInit->wtDBpathname ;
+ sint_t dbHandler = ( PersistencePolicy_wc == psDataInit->dataKeysInitTab[i].policy) ? wcDbHandler : wtDbHandler ;
+ if((dbHandler >= 0) && (psDataInit->dataKeysInitTab[i].data))
+ {
+
+ if(0 > persComDbWriteKey(dbHandler, psDataInit->dataKeysInitTab[i].resourceID, psDataInit->dataKeysInitTab[i].data, (strlen(psDataInit->dataKeysInitTab[i].data)+1)))
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "persComDbWriteKey(<%s> <%s> %d) FAILED", dbPath, psDataInit->dataKeysInitTab[i].resourceID, (strlen(psDataInit->dataKeysInitTab[i].data)+1)) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ break ;
+ }
+ else
+ {
+ sprintf(g_msg, "persComDbWriteKey(<%s> <%s> %d) done", dbPath, psDataInit->dataKeysInitTab[i].resourceID, (strlen(psDataInit->dataKeysInitTab[i].data)+1)) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+ persComDbClose(wcDbHandler) ;
+ persComDbClose(wtDbHandler) ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ if(NIL != psDataInit->dataFilesInitTab)
+ {
+ for(i = 0 ; i < psDataInit->noEntriesDataFilesInitTab; i++)
+ {
+ sprintf(g_msg, "CreateFileWithData(%s)...", psDataInit->dataFilesInitTab[i].resourceID) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(!CreateFileWithData(psDataInit->dataFilesInitTab[i].resourceID, psDataInit->dataFilesInitTab[i].data, (strlen(psDataInit->dataFilesInitTab[i].data)+1)))
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "CreateFileWithData(%s) FAILED", psDataInit->dataFilesInitTab[i].resourceID) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ break ;
+ }
+ }
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ typedef struct
+ {
+ pstr_t dbPathname ;
+ defaultDataInit_s* psDefaultData ;
+ sint_t iNoOfEntries ;
+ }defaultDataInfo_s ;
+
+ defaultDataInfo_s sDefaultDataTab[] =
+ {
+ {psDataInit->factoryDefaultDBpathname, psDataInit->factoryDefaultInitTab, psDataInit->noEntriesFactoryDefaultInitTab},
+ {psDataInit->configurableDefaultDBpathname, psDataInit->configurableDefaultInitTab, psDataInit->noEntriesConfigurableDefaultInitTab}
+ };
+
+ for(i = 0 ; i < sizeof(sDefaultDataTab)/sizeof(sDefaultDataTab[0]) ; i++)
+ {
+ if( (NIL != sDefaultDataTab[i].dbPathname) && (NIL != sDefaultDataTab[i].psDefaultData))
+ {
+ sint_t hDefaultDB = persComDbOpen(sDefaultDataTab[i].dbPathname, true) ;
+ if(hDefaultDB >= 0)
+ {
+ sint_t j = 0 ;
+ for(j = 0 ; j < sDefaultDataTab[i].iNoOfEntries ; j++)
+ {
+ if(0 > persComDbWriteKey(hDefaultDB, sDefaultDataTab[i].psDefaultData[j].pResourceID,
+ sDefaultDataTab[i].psDefaultData[j].data, (strlen(sDefaultDataTab[i].psDefaultData[j].data)+1)))
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "persComDbWriteKey(<%s> <%s> %d) FAILED",
+ sDefaultDataTab[i].dbPathname, sDefaultDataTab[i].psDefaultData[j].pResourceID, (strlen(sDefaultDataTab[i].psDefaultData[j].data)+1)) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ break ;
+ }
+ else
+ {
+ sprintf(g_msg, "persComDbWriteKey(<%s> <%s> %d) done",
+ sDefaultDataTab[i].dbPathname, sDefaultDataTab[i].psDefaultData[j].pResourceID, (strlen(sDefaultDataTab[i].psDefaultData[j].data)+1)) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ persComDbClose(hDefaultDB) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "InitDataFolder: persComDbOpen(%s) failed", sDefaultDataTab[i].dbPathname) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+ }
+
+
+ return bEverythingOK ;
+}
+
+sint_t DeleteFolderContent(pstr_t folderPath)
+{
+ bool_t bEverythingOK = true ;
+ sint_t bytesDeleted = 0 ;
+ pstr_t listingBuffer = NIL ;
+
+ sint_t neededBufferSize = persadmin_list_folder_get_size(folderPath, PersadminFilterAll, false) ;
+ if(neededBufferSize > 0)
+ {
+ listingBuffer = (pstr_t)malloc(neededBufferSize) ;
+ if(NIL != listingBuffer)
+ {
+ if(neededBufferSize != persadmin_list_folder(folderPath, listingBuffer, neededBufferSize, PersadminFilterAll, false))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ str_t completePath[256] ;
+ sint_t posInBuffer = 0 ;
+ sint_t posRelativePath ;
+ strcpy(completePath, folderPath) ;
+ posRelativePath = strlen(completePath) ;
+ if('/' != completePath[posRelativePath-1])
+ {
+ strcat(completePath, "/") ;
+ posRelativePath = strlen(completePath) ;
+ }
+ while(posInBuffer < neededBufferSize)
+ {
+ sint_t len = strlen(listingBuffer + posInBuffer) ;
+ sint_t bytesDeletedLocal = -1 ;
+ strcpy(completePath + posRelativePath, listingBuffer + posInBuffer) ;
+ if(0 == persadmin_check_if_file_exists(completePath, true))
+ {
+ bytesDeletedLocal = persadmin_delete_folder(completePath) ;
+ }
+ else
+ {
+ if(0 == persadmin_check_if_file_exists(completePath, false))
+ {
+ bytesDeletedLocal = persadmin_delete_file(completePath) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+ if(bytesDeletedLocal >= 0)
+ {
+ bytesDeleted += bytesDeletedLocal ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ posInBuffer += (len + 1) ;
+ }
+ }
+
+ if(NIL != listingBuffer)
+ {
+ free(listingBuffer) ;
+ }
+
+ return bEverythingOK ? bytesDeleted : (-1) ;
+}
+
+
+sint_t DeleteFolder(pstr_t folderPath)
+{
+ sint_t bytesDeleted;
+
+ bytesDeleted = DeleteFolderContent(folderPath);
+ if(bytesDeleted < 0)
+ {
+ sprintf(g_msg, "DeleteFolderContent(%s) returned %d", folderPath, bytesDeleted);
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ return bytesDeleted;
+ }
+
+ if(0 == remove(folderPath))
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "deleted >>%s<<", folderPath) ;
+ }
+ else
+ {
+ (void)snprintf(g_msg, sizeof(g_msg), "DeleteFolder: remove(%s) errno=<%s>", folderPath, strerror(errno));
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ return bytesDeleted;
+}
+
+sint_t CheckIfFileExists(pstr_t pathname, bool_t bIsFolder)
+{
+ bool_t bEverythingOK = true ;
+ if(NIL == pathname)
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_check_if_file_exist: NIL pathname") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ if('/' != pathname[0])
+ {
+ bEverythingOK = false ;
+ (void)snprintf(g_msg, sizeof(g_msg), "persadmin_check_if_file_exist: not an absolute path(%s)", pathname) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ struct stat sb;
+
+ if (0 == lstat(pathname, &sb))
+ {
+ /* pathname exist*/
+ if(bIsFolder)
+ {
+ /* check if it is a foler */
+ if( ! S_ISDIR(sb.st_mode))
+ {
+ /* not a folder */
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ /* check if it is a file */
+ if(S_ISDIR(sb.st_mode))
+ {
+ /* it is a folder */
+ bEverythingOK = false ;
+ }
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ return bEverythingOK ? 0 : PAS_FAILURE ;
+}
+
+static bool_t ResetReferenceData(void)
+{
+ bool_t bEverythingOK = true ;
+ pstr_t referenceDataPath = PERS_ORG_LOCAL_APP_WT_PATH_ ;
+
+ sint_t result = DeleteFolderContent(referenceDataPath) ;
+ sprintf(g_msg, "DeleteFolderContent(%s) returned %d", referenceDataPath, result) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+
+ if(bEverythingOK)
+ {
+ dataInit_s* sDataInit[] =
+ {
+ &sSharedPubDataInit,
+ &sShared_Group10_DataInit,
+ &sShared_Group20_DataInit,
+ &s_App1_DataInit,
+ &s_App2_DataInit
+ };
+
+ sint_t i = 0 ;
+ for(i = 0 ; i < sizeof(sDataInit)/sizeof(sDataInit[0]) ; i++)
+ {
+ if(! InitDataFolder(sDataInit[i]))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+
+static bool_t CheckExpectedDataKeyLocalDB(expected_key_data_localDB_s* pExpectedData)
+{
+ bool_t bEverythingOK = true ;
+
+ str_t dataBuffer[256] ;
+ sint_t readSize = sizeof(dataBuffer) ;
+
+ sint_t dbHandler = persComDbOpen(pExpectedData->dbPath, false) ;
+ if(dbHandler >= 0)
+ {
+ readSize = persComDbReadKey(dbHandler, pExpectedData->key, dataBuffer, sizeof(dataBuffer)) ;
+ persComDbClose(dbHandler) ;
+
+ if(readSize >= 0)
+ {
+ sprintf(g_msg, "Found <%s> in %s :: size = %d data=<%s>",
+ pExpectedData->key, pExpectedData->dbPath, readSize, dataBuffer) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(pExpectedData->bExpectedToExist)
+ {
+ if(readSize == pExpectedData->expectedDataSize)
+ {
+ if(0 == memcmp(dataBuffer, pExpectedData->expectedData, pExpectedData->expectedDataSize))
+ {
+ sprintf(g_msg, "\t\t...as expected") ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected size = %d data=<%s>", pExpectedData->expectedDataSize, pExpectedData->expectedData) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected size = %d data=<%s>", pExpectedData->expectedDataSize, pExpectedData->expectedData) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected to not find key") ;
+ }
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ sprintf(g_msg, "Failed to find <%s> in %s",
+ pExpectedData->key, pExpectedData->dbPath) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if( ! pExpectedData->bExpectedToExist)
+ {
+ sprintf(g_msg, "\t\t...as expected") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected size = %d data=<%s>", pExpectedData->expectedDataSize, pExpectedData->expectedData) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ }
+ }
+ else
+ {
+ sprintf(g_msg, "persComDbOpen(%s) returned <%d>", pExpectedData->dbPath, dbHandler) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bEverythingOK = false ;
+ }
+
+
+ return bEverythingOK ;
+}
+
+/* copied here from PCL */
+static sint_t persadmin_serialize_data(PersistenceConfigurationKey_s pc, char* buffer)
+{
+ sint_t rval = 0;
+ rval = snprintf(buffer, 128, "%d %d %d %s",
+ pc.policy, pc.storage, pc.max_size,
+ pc.reponsible);
+
+ //printf("persadmin_serialize_data: %s \n", buffer);
+ return rval;
+}
+
+
+static bool_t CheckExpectedDataKeyRCT(expected_key_data_RCT_s* pExpectedData)
+{
+ bool_t bEverythingOK = true ;
+ PersistenceConfigurationKey_s sFoundConfig ;
+ str_t serializedFound[256] ;
+ str_t serializedExpected[256] ;
+
+ sint_t rctHandler = persComRctOpen(pExpectedData->dbPath, false);
+ if(rctHandler >= 0)
+ {
+ if(sizeof(PersistenceConfigurationKey_s) == persComRctRead(rctHandler, pExpectedData->key, &sFoundConfig))
+ {
+ persadmin_serialize_data(sFoundConfig, serializedFound) ;
+ persadmin_serialize_data(pExpectedData->sExpectedConfig, serializedExpected) ;
+ sprintf(g_msg, "Found <%s> in %s :: config=<%s>",
+ pExpectedData->key, pExpectedData->dbPath, serializedFound) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(pExpectedData->bExpectedToExist)
+ {
+ if(0 == strcmp(serializedFound, serializedExpected))
+ {
+ sprintf(g_msg, "\t\t...as expected") ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected config=<%s>", serializedExpected) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected to not find key") ;
+ }
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ sprintf(g_msg, "Failed to find <%s> in %s",
+ pExpectedData->key, pExpectedData->dbPath) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if( ! pExpectedData->bExpectedToExist)
+ {
+ sprintf(g_msg, "\t\t...as expected") ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected config=<%s>", serializedExpected) ;
+ }
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ persComRctClose(rctHandler) ;
+ }
+
+ return bEverythingOK ;
+}
+
+static bool_t GetFileContent(pstr_t absPath, pstr_t dataBuffer_out, sint_t* pSize_inout)
+{
+ bool_t bEverythingOK = true ;
+
+ FILE* pFile = fopen(absPath, "rb") ;
+
+ if(NIL != pFile)
+ {
+ sint_t readSize = fread(dataBuffer_out, 1, *pSize_inout, pFile);
+ if( (readSize >= 0) && (readSize < *pSize_inout))
+ {
+ *pSize_inout = readSize ;
+ }
+ else
+ {
+ if(readSize >= *pSize_inout)
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "GetFileContent(%s) buffer too small (%d)", absPath, *pSize_inout) ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ }
+ }
+
+ fclose(pFile) ;
+ }
+
+ return bEverythingOK ;
+}
+
+static bool_t CheckExpectedDataFile(expected_file_data_s* pExpectedData)
+{
+ bool_t bEverythingOK = true ;
+
+ str_t dataBuffer[256] ;
+ sint_t size = sizeof(dataBuffer) ;
+
+ if(0 <= persadmin_check_if_file_exists(pExpectedData->filename, false))
+ {
+ /* file found */
+ memset(dataBuffer, 0x0, sizeof(dataBuffer)) ;
+ if(GetFileContent(pExpectedData->filename, dataBuffer, &size))
+ {
+ sprintf(g_msg, "Found <%s> :: size = %d data=<%s>",
+ pExpectedData->filename, size, dataBuffer) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(pExpectedData->bExpectedToExist)
+ {
+ if(size == pExpectedData->expectedDataSize)
+ {
+ if(0 == memcmp(dataBuffer, pExpectedData->expectedData, pExpectedData->expectedDataSize))
+ {
+ sprintf(g_msg, "\t\t...as expected") ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected size = %d data=<%s>", pExpectedData->expectedDataSize, pExpectedData->expectedData) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected size = %d data=<%s>", pExpectedData->expectedDataSize, pExpectedData->expectedData) ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected to not find file") ;
+ }
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "GetFileContent(%s) failed", pExpectedData->filename) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ sprintf(g_msg, "Failed to find <%s>", pExpectedData->filename) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if( ! pExpectedData->bExpectedToExist)
+ {
+ sprintf(g_msg, "\t\t...as expected") ;
+ }
+ else
+ {
+ bEverythingOK = false ;
+ sprintf(g_msg, "\t\t...FAILURE - expected size = %d data=<%s>", pExpectedData->expectedDataSize, pExpectedData->expectedData) ;
+ }
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ return bEverythingOK ;
+}
+
+
+static bool_t ExecuteTestCase(testcase_s* psTestCase)
+{
+ bool_t bTestResult = true ;
+ sprintf(g_msg, "ExecuteTestCase: %s", psTestCase->testCaseDescription) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ if( ! psTestCase->bSkipDataReset)
+ {
+ sprintf(g_msg, "First init reference data...") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(ResetReferenceData())
+ {
+ sprintf(g_msg, "ResetReferenceData - Done") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ bTestResult = false ;
+ sprintf(g_msg, "ResetReferenceData - Failed") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ else
+ {
+ sprintf(g_msg, "Skip ResetReferenceData") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+
+ if(bTestResult)
+ {
+ if(NIL != psTestCase->TestCaseFunction)
+ {
+ sprintf(g_msg, "Call test case function...") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ bTestResult = psTestCase->TestCaseFunction(psTestCase->iParam, psTestCase->pvoidParam) ;
+ sprintf(g_msg, "Test case function returned with %s", bTestResult ? "SUCCESS" : "FAILURE") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ sprintf(g_msg, "Skip calling test case function...") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+
+ if(bTestResult)
+ {
+ sint_t i = 0 ;
+ sint_t noOfFailedTests = 0 ;
+ sint_t noOfSuccessfulTests = 0 ;
+
+ sprintf(g_msg, "+++++++++++++++++++++ Check data key RCT START ... +++++++++++++++++++++++++++") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ for(i = 0 ; i < psTestCase->noItemsInExpectedKeyDataRCT; i++)
+ {
+ if( ! CheckExpectedDataKeyRCT(&psTestCase->pExpectedKeyDataRCT[i]))
+ {
+ noOfFailedTests++ ;
+ bTestResult = false ;
+ }
+ else
+ {
+ noOfSuccessfulTests++ ;
+ }
+ }
+ sprintf(g_msg, "++++++++ Check data key RCT SUMMARY: tests ; %d executed %d success %d failed +++++++++++++",
+ noOfFailedTests + noOfSuccessfulTests, noOfSuccessfulTests, noOfFailedTests) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ noOfFailedTests = 0 ;
+ noOfSuccessfulTests = 0 ;
+ sprintf(g_msg, "+++++++++++++++++++++ Check data key localDB START ... +++++++++++++++++++++++++++") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ for(i = 0 ; i < psTestCase->noItemsInExpectedKeyDataLocalDB ; i++)
+ {
+ if( ! CheckExpectedDataKeyLocalDB(&psTestCase->pExpectedKeyDataLocalDB[i]))
+ {
+ noOfFailedTests++ ;
+ bTestResult = false ;
+ }
+ else
+ {
+ noOfSuccessfulTests++ ;
+ }
+ }
+ sprintf(g_msg, "++++++++ Check data key localDB SUMMARY: tests ; %d executed %d success %d failed +++++++++++++",
+ noOfFailedTests + noOfSuccessfulTests, noOfSuccessfulTests, noOfFailedTests) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+ noOfFailedTests = 0 ;
+ noOfSuccessfulTests = 0 ;
+ sprintf(g_msg, "+++++++++++++++++++++ Check data file START ... +++++++++++++++++++++++++++") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ for(i = 0 ; i < psTestCase->noItemsInExpectedFileData; i++)
+ {
+ if( ! CheckExpectedDataFile(&psTestCase->pExpectedFileData[i]))
+ {
+ noOfFailedTests++ ;
+ bTestResult = false ;
+ }
+ else
+ {
+ noOfSuccessfulTests++ ;
+ }
+ }
+ sprintf(g_msg, "++++++++ Check data file SUMMARY: tests ; %d executed %d success %d failed +++++++++++++",
+ noOfFailedTests + noOfSuccessfulTests, noOfSuccessfulTests, noOfFailedTests) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ return bTestResult ;
+}
+
+
+bool_t ExecuteTestCases(sint_t *pNoOfTestCases,
+ sint_t *pNoOfTestCasesSuccessful,
+ sint_t *pNoOfTestCasesFailed )
+{
+ bool_t bTestsResult = true ;
+ sint_t noOfTestCasesSuccessful = 0 ;
+ sint_t noOfTestCasesFailed = 0 ;
+ sint_t i = 0 ;
+ for(i = 0 ; i < sizeof(testCases)/sizeof(testCases[0]) ; i++)
+ {
+ bool_t bCurrentTestcaseResult = true ;
+ sprintf(g_msg, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ sprintf(g_msg, "++++++++++++++++++++++++ Test Case No %d Started... +++++++++++++++++++++++++++++++++++++++", i) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ sprintf(g_msg, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(ExecuteTestCase(testCases[i]))
+ {
+ noOfTestCasesSuccessful++ ;
+ }
+ else
+ {
+ bCurrentTestcaseResult = false ;
+ noOfTestCasesFailed++ ;
+ bTestsResult = false ;
+ }
+ sprintf(g_msg, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ sprintf(g_msg, "++++++++++++++++++++++++ Test Case No %d Completed %s +++++++++++++++++++++++++++++++++++++++", i, bCurrentTestcaseResult ? "OK" : "with EROORS") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ sprintf(g_msg, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ sprintf(g_msg, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ sprintf(g_msg, "++++++++ SUMMARY: Test cases <%d executed> <%d ok> <%d failed> ++++++++++++++++++++++++++++", noOfTestCasesSuccessful+noOfTestCasesFailed, noOfTestCasesSuccessful, noOfTestCasesFailed) ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ sprintf(g_msg, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(NULL != pNoOfTestCases)
+ {
+ *pNoOfTestCases = sizeof(testCases)/sizeof(testCases[0]);
+ }
+
+ if(NULL != pNoOfTestCasesSuccessful)
+ {
+ *pNoOfTestCasesSuccessful = noOfTestCasesSuccessful;
+ }
+
+ if(NULL != pNoOfTestCasesFailed)
+ {
+ *pNoOfTestCasesFailed = noOfTestCasesFailed;
+ }
+
+ return bTestsResult ;
+}
+
+
+
+
+
+// ===============================
+
+
+
+// ===============================
+
+
+int main(void)
+{
+ char context[16] ;
+ char contextID[16] ;
+ char appID[16] ;
+ pid_t pid = getpid() ;
+
+ sprintf(context, "ID_%d", pid) ;
+ sprintf(contextID, "CONTEXT_%d", pid) ;
+ sprintf(appID, "APP_%d", pid) ;
+ DLT_REGISTER_APP(appID,"PAS");
+ //DLT_REGISTER_CONTEXT(testPersAdminDLTCtx,"TestPAS", contextID);
+ DLT_REGISTER_CONTEXT(persAdminSvcDLTCtx,"TestPAS", contextID);
+
+
+ //sprintf(g_msg, "\n\n++++++++++ Test PAS - START +++++++++++++++++\n\n") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("++++++++++ Test PAS - START +++++++++++++++++"));
+
+ ExecuteTestCases(NULL, NULL, NULL) ;
+
+ //sprintf(g_msg, "\n\n++++++++++ Test PAS - FINISH ++++++++++++++++\n\n") ;
+ DLT_LOG(testPersAdminDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("++++++++++ Test PAS - FINISH ++++++++++++++++"));
+ /* Init and run the main DBus loop */
+ persadmin_RunDBusMainLoop();
+
+ return 1 ;
+}
diff --git a/test/pers_svc_test/src/test_PAS_dbus.c b/test/pers_svc_test/src/test_PAS_dbus.c
new file mode 100644
index 0000000..550ca76
--- /dev/null
+++ b/test/pers_svc_test/src/test_PAS_dbus.c
@@ -0,0 +1,233 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "stdio.h"
+#include <stdlib.h>
+#include <string.h>
+#include <gio/gio.h>
+#include <pthread.h>
+
+#include "test_PAS.h"
+#include "PasModuleTestGen.h"
+
+
+
+/**********************************************************************************************************************
+*
+* Global variables. Initialization of global contexts.
+*
+**********************************************************************************************************************/
+static GMainLoop *g_pMainLoop = NULL;
+static GDBusConnection *g_pBusConnection = NULL;
+static OipPersistenceAdmintestframeworkSkeleton *g_pTFSkeleton = NULL;
+static volatile bool_t g_bDBusConnInit = false;
+
+static pthread_mutex_t testOpMtx; // run test cases - operation mutex
+
+
+
+/**********************************************************************************************************************
+*
+* Prototypes for local functions (see implementation for description)
+*
+**********************************************************************************************************************/
+
+static void OnBusAcquired_cb(GDBusConnection *pConnection, const gchar* sName, gpointer pUserData);
+static void OnNameAcquired_cb(GDBusConnection *pConnection, const gchar* sName, gpointer pUserData);
+static void OnNameLost_cb(GDBusConnection *pConnection, const gchar* sName, gpointer pUserData);
+
+/* ExecuteTestCases */
+static gboolean OnHandleExecuteTestCases ( OipPersistenceAdmintestframework *object,
+ GDBusMethodInvocation *invocation);
+
+
+
+/**********************************************************************************************************************
+*
+* The function is called when a connection to the D-Bus could be established.
+* According to the documentation the objects should be exported here.
+*
+* @param pConnection: Connection, which was acquired
+* @param sName: Bus name
+* @param pUserData: Optionally user data
+*
+* @return void
+*
+**********************************************************************************************************************/
+static void OnBusAcquired_cb(GDBusConnection *pConnection, const gchar* sName, gpointer pUserData)
+{
+ GError *pError = NULL;
+
+ /* Store the connection. */
+ g_pBusConnection = pConnection;
+
+ /* Create real object to offer on the DBus */
+ g_pTFSkeleton = (OipPersistenceAdmintestframeworkSkeleton*) oip_persistence_admintestframework_skeleton_new();
+
+ g_signal_connect(g_pTFSkeleton, "handle-execute-test-cases", G_CALLBACK(OnHandleExecuteTestCases), pUserData);
+
+ /* Attach interfaces to the objects and export them */
+ if(TRUE == g_dbus_interface_skeleton_export( G_DBUS_INTERFACE_SKELETON(g_pTFSkeleton),
+ g_pBusConnection,
+ PERSISTENCE_ADMIN_TF_OBJ_PATH,
+ &pError))
+ {
+ printf("Successfully connected to D-Bus and exported object.\n");
+ }
+ else
+ {
+ /* Error: the PersistenceAdminService TF interface could not be exported. */
+ printf("Failed to export PersistenceAdminService TF object.\n");
+ g_main_loop_quit(g_pMainLoop);
+ }
+ fflush(stdout);
+}
+
+
+
+/**********************************************************************************************************************
+*
+* The function is called when the "bus name" could be acquired on the D-Bus.
+*
+* @param pConnection: Connection over which the bus name was acquired
+* @param sName: Acquired bus name
+* @param pUserData: Optionally user data
+*
+* @return void
+*
+**********************************************************************************************************************/
+static void OnNameAcquired_cb(GDBusConnection *pConnection, const gchar* sName, gpointer pUserData)
+{
+ printf("Successfully obtained D-Bus name: %s\n", sName);
+
+ /* DBus connection initialized */
+ g_bDBusConnInit = true;
+
+ fflush(stdout);
+}
+
+
+
+/**********************************************************************************************************************
+*
+* The function is called if either no connection to D-Bus could be established or
+* the bus name could not be acquired.
+*
+* @param pConnection: Connection. If it is NULL, no D-Bus connection could be established.
+* Otherwise the bus name was lost.
+* @param sName: Bus name
+* @param pUserData: Optionally user data
+*
+* @return void
+*
+**********************************************************************************************************************/
+static void OnNameLost_cb(GDBusConnection *pConnection, const gchar* sName, gpointer pUserData)
+{
+ if(pConnection == NULL)
+ {
+ /* Error: the connection could not be established. */
+ printf("Failed to establish D-Bus connection.");
+ }
+ else
+ {
+ /* Error: connection established, but name not obtained. This might be a second instance of the application */
+ printf("Failed to obtain bus name %s\n", sName);
+ }
+ fflush(stdout);
+
+ /* In both cases leave the main loop. */
+ g_main_loop_quit(g_pMainLoop);
+}
+
+
+
+/**********************************************************************************************************************
+*
+* Handler for ExecuteTestCases.
+* Signature based on generated code.
+*
+**********************************************************************************************************************/
+static gboolean OnHandleExecuteTestCases ( OipPersistenceAdmintestframework *object,
+ GDBusMethodInvocation *invocation)
+{
+ sint_t noOfTestCases = 0;
+ sint_t noOfTestCasesSuccessful = 0;
+ sint_t noOfTestCasesFailed = 0;
+
+ // Acquire op mutex
+ pthread_mutex_lock (&testOpMtx);
+
+ ExecuteTestCases( &noOfTestCases,
+ &noOfTestCasesSuccessful,
+ &noOfTestCasesFailed );
+
+ // Release list mutex
+ pthread_mutex_unlock (&testOpMtx);
+
+ oip_persistence_admintestframework_complete_execute_test_cases( object,
+ invocation,
+ noOfTestCases,
+ noOfTestCasesSuccessful,
+ noOfTestCasesFailed);
+
+ return(TRUE);
+}
+
+
+/**********************************************************************************************************************
+*
+* Initialize DBus registration mechanism
+*
+**********************************************************************************************************************/
+void persadmin_RunDBusMainLoop()
+{
+ uint u32ConnectionId = 0;
+
+ /* Initialize glib */
+ g_type_init();
+
+ /* Init synchronization objects */
+ pthread_mutex_init (&testOpMtx, NULL);
+
+ /* Create the main loop */
+ g_pMainLoop = g_main_loop_new(NULL, FALSE);
+
+
+ /* Connect to the D-Bus. Obtain a bus name to offer PAS objects */
+ u32ConnectionId = g_bus_own_name( PERSISTENCE_ADMIN_TF_BUS_TYPE
+ , PERSISTENCE_ADMIN_TF_BUS_NAME
+ , G_BUS_NAME_OWNER_FLAGS_NONE
+ , &OnBusAcquired_cb
+ , &OnNameAcquired_cb
+ , &OnNameLost_cb
+ , NULL
+ , NULL);
+
+ /* The main loop is only canceled if the Node is completely shut down or the D-Bus connection fails */
+ g_main_loop_run(g_pMainLoop);
+
+ /* If the main loop returned, clean up. Release bus name and main loop */
+ g_bus_unown_name(u32ConnectionId);
+ g_main_loop_unref(g_pMainLoop);
+
+
+ /* Release the (created) skeleton object */
+ if(NULL != g_pTFSkeleton)
+ {
+ g_object_unref(g_pTFSkeleton);
+ }
+}
diff --git a/test/pers_svc_test/src/test_pas_check_data_after_backup_application.c b/test/pers_svc_test/src/test_pas_check_data_after_backup_application.c
new file mode 100644
index 0000000..783dd1d
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_check_data_after_backup_application.c
@@ -0,0 +1,100 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+#include "string.h"
+#include "stdio.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include "test_PAS.h"
+#include "ssw_pers_admin_files_helper.h"
+#include "test_pas_check_data_after_backup_application.h"
+#include "persistence_admin_service.h"
+
+expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterBackupApplication[16] =
+{
+/* App1 */
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingA" , sizeof("Data>>/App1_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1" , sizeof("Data>>/App1_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2" , sizeof("Data>>/App1_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingC" , sizeof("Data>>/App1_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user1" , sizeof("Data>>/App1_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user2" , sizeof("Data>>/App1_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user3" , sizeof("Data>>/App1_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user4" , sizeof("Data>>/App1_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD" , sizeof("Data>>/App1_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1" , sizeof("Data>>/App1_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2" , sizeof("Data>>/App1_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF" , sizeof("Data>>/App1_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1" , sizeof("Data>>/App1_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2" , sizeof("Data>>/App1_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3" , sizeof("Data>>/App1_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4" , sizeof("Data>>/App1_Setting/DEF::user4" )}
+};
+
+expected_file_data_s expectedFileData_shared_public_AfterBackupApplication[10] =
+{
+/* App1 */
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )}
+} ;
+
+/**************************************************************************************************************
+***************************************** ADD TEST CASES HERE ********************************************
+**************************************************************************************************************/
+bool_t Test_DataAfterBackupCreateApplication(int ceva, void* pAltceva)
+{
+ long sResult = 0;
+ PersASSelectionType_e eSelection = PersASSelectionType_LastEntry;
+ char pchBackupName [MAX_PATH_SIZE];
+ char pchApplicationID [MAX_APPLICATION_NAME_SIZE];
+ int iBackupNameSize = sizeof(pchBackupName);
+ int iApplicationNameSize = sizeof(pchApplicationID);
+
+ // reset;
+ memset(pchBackupName, 0, iBackupNameSize);
+ memset(pchApplicationID, 0, iApplicationNameSize);
+
+ // selection application : valid application, all users, all seats;
+
+ // create input data;
+ snprintf(pchBackupName, iBackupNameSize, "%s", BACKUP_NAME);
+ snprintf(pchApplicationID, iApplicationNameSize, "%s", APPLICATION_NAME);
+ eSelection = PersASSelectionType_Application;
+
+ persadmin_delete_folder(BACKUP_NAME);
+ // persAdminDataBackupCreate(PersASSelectionType_Application, "/tmp/backup", "App1", 0xFF, 0xFF);
+ sResult = persAdminDataBackupCreate(eSelection, pchBackupName, pchApplicationID, PERSIST_SELECT_ALL_USERS, PERSIST_SELECT_ALL_SEATS);
+ // expected result : backup is created for the specified application, all users & seats (local);
+
+ // some info;
+ printf("\n Test_DataAfterBackupCreateApplication: persAdminDataBackupCreate(application) - %ld \n", sResult) ;
+
+ return true ;
+}
diff --git a/test/pers_svc_test/src/test_pas_check_data_after_backup_create_all.c b/test/pers_svc_test/src/test_pas_check_data_after_backup_create_all.c
new file mode 100644
index 0000000..f5ee203
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_check_data_after_backup_create_all.c
@@ -0,0 +1,195 @@
+#include "persComTypes.h"
+#include "stdio.h"
+#include "string.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include "ssw_pers_admin_files_helper.h"
+#include "test_PAS.h"
+#include "test_pas_check_data_after_backup_create_all.h"
+#include "persistence_admin_service.h"
+
+expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterBackupCreateAll[80] =
+{
+/* shared public */
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA" , sizeof("Data>>/pubSettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1" , sizeof("Data>>/pubSettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2" , sizeof("Data>>/pubSettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingC" , sizeof("Data>>/pubSettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user1" , sizeof("Data>>/pubSetting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user2" , sizeof("Data>>/pubSetting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user3" , sizeof("Data>>/pubSetting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user4" , sizeof("Data>>/pubSetting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD" , sizeof("Data>>/pubSettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1" , sizeof("Data>>/pubSettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2" , sizeof("Data>>/pubSettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF" , sizeof("Data>>/pubSettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1" , sizeof("Data>>/pubSetting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2" , sizeof("Data>>/pubSetting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3" , sizeof("Data>>/pubSetting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4" , sizeof("Data>>/pubSetting/DEF::user4" )},
+/* shared group 10 */
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingA" , sizeof("Data>>/gr10_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB" , "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1" , sizeof("Data>>/gr10_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB" , "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2" , sizeof("Data>>/gr10_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingC" , sizeof("Data>>/gr10_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user1" , sizeof("Data>>/gr10_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2" , sizeof("Data>>/gr10_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user3" , sizeof("Data>>/gr10_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user4" , sizeof("Data>>/gr10_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD" , sizeof("Data>>/gr10_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1" , sizeof("Data>>/gr10_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2" , sizeof("Data>>/gr10_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF" , sizeof("Data>>/gr10_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1" , sizeof("Data>>/gr10_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2" , sizeof("Data>>/gr10_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3" , sizeof("Data>>/gr10_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4" , sizeof("Data>>/gr10_Setting/DEF::user4" )},
+/* shared group 20 */
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingA" , sizeof("Data>>/gr20_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1" , sizeof("Data>>/gr20_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2" , sizeof("Data>>/gr20_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingC" , sizeof("Data>>/gr20_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user1" , sizeof("Data>>/gr20_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user2" , sizeof("Data>>/gr20_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user3" , sizeof("Data>>/gr20_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user4" , sizeof("Data>>/gr20_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingD" , sizeof("Data>>/gr20_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE" , "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1" , sizeof("Data>>/gr20_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE" , "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2" , sizeof("Data>>/gr20_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingF" , sizeof("Data>>/gr20_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1" , sizeof("Data>>/gr20_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2" , sizeof("Data>>/gr20_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3" , sizeof("Data>>/gr20_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4" , sizeof("Data>>/gr20_Setting/DEF::user4" )},
+/* App1 */
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingA" , sizeof("Data>>/App1_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1" , sizeof("Data>>/App1_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2" , sizeof("Data>>/App1_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingC" , sizeof("Data>>/App1_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user1" , sizeof("Data>>/App1_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user2" , sizeof("Data>>/App1_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user3" , sizeof("Data>>/App1_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user4" , sizeof("Data>>/App1_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD" , sizeof("Data>>/App1_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1" , sizeof("Data>>/App1_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2" , sizeof("Data>>/App1_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF" , sizeof("Data>>/App1_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1" , sizeof("Data>>/App1_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2" , sizeof("Data>>/App1_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3" , sizeof("Data>>/App1_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4" , sizeof("Data>>/App1_Setting/DEF::user4" )},
+/* App2*/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingA" , sizeof( "Data>>/App2_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1" , sizeof( "Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2" , sizeof( "Data>>/App2_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingC" , sizeof( "Data>>/App2_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user1" , sizeof( "Data>>/App2_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user2" , sizeof( "Data>>/App2_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user3" , sizeof( "Data>>/App2_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user4" , sizeof( "Data>>/App2_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD" , sizeof( "Data>>/App2_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1" , sizeof( "Data>>/App2_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2" , sizeof( "Data>>/App2_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF" , sizeof( "Data>>/App2_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1" , sizeof( "Data>>/App2_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2" , sizeof( "Data>>/App2_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3" , sizeof( "Data>>/App2_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4" , sizeof( "Data>>/App2_Setting/DEF::user4" )}
+};
+
+expected_file_data_s expectedFileData_shared_public_AfterBackupCreateAll[50] =
+{
+/* shared public */
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>/doc1.txt" , sizeof("File>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4" )},
+/* shared group 10 */
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+/* shared group 20 */
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt" , true, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>gr20_>>/docA.txt::user1" , sizeof("File>>gr20_>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>gr20_>>/docA.txt::user2" , sizeof("File>>gr20_>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>gr20_>>/docA.txt::user3" , sizeof("File>>gr20_>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>gr20_>>/docA.txt::user4" , sizeof("File>>gr20_>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4" )},
+/* App1 */
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+/* App2*/
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App2>>/docA.txt::user1", sizeof("File>>App2>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App2>>/docA.txt::user2", sizeof("File>>App2>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App2>>/docA.txt::user3", sizeof("File>>App2>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App2>>/docA.txt::user4", sizeof("File>>App2>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4" )}
+} ;
+
+/**************************************************************************************************************
+***************************************** ADD TEST CASES HERE ********************************************
+**************************************************************************************************************/
+bool_t Test_DataAfterBackupCreateAll(int ceva, void* pAltceva)
+{
+ long sResult = 0;
+ PersASSelectionType_e eSelection = PersASSelectionType_LastEntry;
+ char pchBackupName [MAX_PATH_SIZE];
+ char pchApplicationID [MAX_APPLICATION_NAME_SIZE];
+ int iBackupNameSize = sizeof(pchBackupName);
+ int iApplicationNameSize = sizeof(pchApplicationID);
+
+ // reset;
+ memset(pchBackupName, 0, iBackupNameSize);
+ memset(pchApplicationID, 0, iApplicationNameSize);
+
+ // selection all : all applications, all users, all seats;
+
+ // create input data;
+ snprintf(pchBackupName, iBackupNameSize, "%s", BACKUP_NAME);
+ snprintf(pchApplicationID, iApplicationNameSize, "%s", NO_APPLICATION);
+ eSelection = PersASSelectionType_All;
+
+ persadmin_delete_folder(BACKUP_NAME);
+ // persAdminDataBackupCreate(PersASSelectionType_All, "/tmp/backup", "", 0xFF, 0xFF);
+ sResult = persAdminDataBackupCreate(eSelection, pchBackupName, pchApplicationID, PERSIST_SELECT_ALL_USERS, PERSIST_SELECT_ALL_SEATS);
+ // expected result : backup is created for all applications, users & seats (local + shared);
+
+ // some info;
+ printf("\n Test_BackupCreateAll: persAdminDataBackupCreate(all) - %ld \n", sResult) ;
+
+ return true ;
+}
diff --git a/test/pers_svc_test/src/test_pas_check_data_after_backup_user2_seat_all.c b/test/pers_svc_test/src/test_pas_check_data_after_backup_user2_seat_all.c
new file mode 100644
index 0000000..1ce28dc
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_check_data_after_backup_user2_seat_all.c
@@ -0,0 +1,212 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+#include "persComTypes.h"
+#include "stdio.h"
+#include "string.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include "ssw_pers_admin_files_helper.h"
+#include "test_PAS.h"
+#include "test_pas_check_data_after_backup_user2_seat_all.h"
+#include "persistence_admin_service.h"
+
+expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterBackupUser2SeatAll[80] =
+{
+/* shared public */
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingA" , sizeof("Data>>/pubSettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1" , sizeof("Data>>/pubSettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2" , sizeof("Data>>/pubSettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingC" , sizeof("Data>>/pubSettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user1" , sizeof("Data>>/pubSetting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user2" , sizeof("Data>>/pubSetting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user3" , sizeof("Data>>/pubSetting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user4" , sizeof("Data>>/pubSetting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingD" , sizeof("Data>>/pubSettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1" , sizeof("Data>>/pubSettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2" , sizeof("Data>>/pubSettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingF" , sizeof("Data>>/pubSettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user1" , sizeof("Data>>/pubSetting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2" , sizeof("Data>>/pubSetting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user3" , sizeof("Data>>/pubSetting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user4" , sizeof("Data>>/pubSetting/DEF::user4" )},
+/* shared group 10 */
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingA" , sizeof("Data>>/gr10_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1" , sizeof("Data>>/gr10_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2" , sizeof("Data>>/gr10_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC" , "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingC" , sizeof("Data>>/gr10_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user1" , sizeof("Data>>/gr10_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2" , sizeof("Data>>/gr10_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user3" , sizeof("Data>>/gr10_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user4" , sizeof("Data>>/gr10_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingD" , sizeof("Data>>/gr10_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1" , sizeof("Data>>/gr10_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2" , sizeof("Data>>/gr10_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingF" , sizeof("Data>>/gr10_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user1" , sizeof("Data>>/gr10_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2" , sizeof("Data>>/gr10_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user3" , sizeof("Data>>/gr10_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user4" , sizeof("Data>>/gr10_Setting/DEF::user4" )},
+/* shared group 20 */
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingA" , sizeof("Data>>/gr20_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1" , sizeof("Data>>/gr20_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2" , sizeof("Data>>/gr20_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingC" , sizeof("Data>>/gr20_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user1" , sizeof("Data>>/gr20_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user2" , sizeof("Data>>/gr20_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user3" , sizeof("Data>>/gr20_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user4" , sizeof("Data>>/gr20_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingD" , sizeof("Data>>/gr20_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1" , sizeof("Data>>/gr20_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2" , sizeof("Data>>/gr20_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingF" , sizeof("Data>>/gr20_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user1" , sizeof("Data>>/gr20_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2" , sizeof("Data>>/gr20_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user3" , sizeof("Data>>/gr20_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user4" , sizeof("Data>>/gr20_Setting/DEF::user4" )},
+/* App1 */
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingA" , sizeof("Data>>/App1_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1" , sizeof("Data>>/App1_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2" , sizeof("Data>>/App1_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingC" , sizeof("Data>>/App1_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user1" , sizeof("Data>>/App1_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user2" , sizeof("Data>>/App1_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user3" , sizeof("Data>>/App1_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user4" , sizeof("Data>>/App1_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingD" , sizeof("Data>>/App1_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1" , sizeof("Data>>/App1_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2" , sizeof("Data>>/App1_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingF" , sizeof("Data>>/App1_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user1" , sizeof("Data>>/App1_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2" , sizeof("Data>>/App1_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user3" , sizeof("Data>>/App1_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user4" , sizeof("Data>>/App1_Setting/DEF::user4" )},
+/* App2*/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingA" , sizeof( "Data>>/App2_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1" , sizeof( "Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2" , sizeof( "Data>>/App2_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingC" , sizeof( "Data>>/App2_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user1" , sizeof( "Data>>/App2_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user2" , sizeof( "Data>>/App2_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user3" , sizeof( "Data>>/App2_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user4" , sizeof( "Data>>/App2_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingD" , sizeof( "Data>>/App2_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1" , sizeof( "Data>>/App2_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2" , sizeof( "Data>>/App2_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingF" , sizeof( "Data>>/App2_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user1" , sizeof( "Data>>/App2_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2" , sizeof( "Data>>/App2_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user3" , sizeof( "Data>>/App2_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user4" , sizeof( "Data>>/App2_Setting/DEF::user4" )}
+};
+
+expected_file_data_s expectedFileData_shared_public_AfterBackupUser2SeatAll[50] =
+{
+/* shared public */
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>/doc1.txt" , sizeof("File>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4" )},
+/* shared group 10 */
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", false, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", false, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+/* shared group 20 */
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>gr20_>>/docA.txt::user1" , sizeof("File>>gr20_>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>gr20_>>/docA.txt::user2" , sizeof("File>>gr20_>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>gr20_>>/docA.txt::user3" , sizeof("File>>gr20_>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>gr20_>>/docA.txt::user4" , sizeof("File>>gr20_>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4" )},
+/* App1 */
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+/* App2*/
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>App2>>/doc1.txt", sizeof("File>>App2>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>App2>>/Docs/doc2.txt", sizeof("File>>App2>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>App2>>/docA.txt::user1", sizeof("File>>App2>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App2>>/docA.txt::user2", sizeof("File>>App2>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>App2>>/docA.txt::user3", sizeof("File>>App2>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>App2>>/docA.txt::user4", sizeof("File>>App2>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4" )}
+} ;
+
+/**************************************************************************************************************
+***************************************** ADD TEST CASES HERE ********************************************
+**************************************************************************************************************/
+bool_t Test_DataAfterBackupCreateUser2SeatAll(int ceva, void* pAltceva)
+{
+ long sResult = 0;
+ PersASSelectionType_e eSelection = PersASSelectionType_LastEntry;
+ char pchBackupName [MAX_PATH_SIZE];
+ char pchApplicationID [MAX_APPLICATION_NAME_SIZE];
+ int iBackupNameSize = sizeof(pchBackupName);
+ int iApplicationNameSize = sizeof(pchApplicationID);
+
+ // reset;
+ memset(pchBackupName, 0, iBackupNameSize);
+ memset(pchApplicationID, 0, iApplicationNameSize);
+
+ // selection user : valid application, 1 user, all seats;
+
+ // create input data;
+ snprintf(pchBackupName, iBackupNameSize, "%s", BACKUP_NAME);
+ snprintf(pchApplicationID, iApplicationNameSize, "%s", APPLICATION_NAME);
+ eSelection = PersASSelectionType_User;
+
+ persadmin_delete_folder(BACKUP_NAME);
+ // persAdminDataBackupCreate(PersASSelectionType_User, "/tmp/backup", "", 0xFF, 0xFF);
+ sResult = persAdminDataBackupCreate(eSelection, pchBackupName, pchApplicationID, 0x2, PERSIST_SELECT_ALL_SEATS);
+ // check data;
+ // expected result : backup is created for all applications, the specified user & all seats (local + shared);
+
+ // some info;
+ printf("\n Test_DataAfterBackupCreateUser2SeatAll: persAdminDataBackupCreate(user 2seat all) - %ld \n", sResult) ;
+
+ return true ;
+}
diff --git a/test/pers_svc_test/src/test_pas_check_data_after_backup_user_all.c b/test/pers_svc_test/src/test_pas_check_data_after_backup_user_all.c
new file mode 100644
index 0000000..7be666f
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_check_data_after_backup_user_all.c
@@ -0,0 +1,212 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+#include "persComTypes.h"
+#include "stdio.h"
+#include "string.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include "ssw_pers_admin_files_helper.h"
+#include "test_PAS.h"
+#include "test_pas_check_data_after_backup_user_all.h"
+#include "persistence_admin_service.h"
+
+expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterBackupUserAll[80] =
+{
+/* shared public */
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingA" , sizeof("Data>>/pubSettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1" , sizeof("Data>>/pubSettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2" , sizeof("Data>>/pubSettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC" , "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingC" , sizeof("Data>>/pubSettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user1" , sizeof("Data>>/pubSetting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user2" , sizeof("Data>>/pubSetting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user3" , sizeof("Data>>/pubSetting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user4" , sizeof("Data>>/pubSetting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingD" , sizeof("Data>>/pubSettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1" , sizeof("Data>>/pubSettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2" , sizeof("Data>>/pubSettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF" , "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingF" , sizeof("Data>>/pubSettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1" , sizeof("Data>>/pubSetting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2" , sizeof("Data>>/pubSetting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3" , sizeof("Data>>/pubSetting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", "/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4" , sizeof("Data>>/pubSetting/DEF::user4" )},
+/* shared group 10 */
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingA" , sizeof("Data>>/gr10_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1" , sizeof("Data>>/gr10_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2" , sizeof("Data>>/gr10_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingC" , sizeof("Data>>/gr10_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user1" , sizeof("Data>>/gr10_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2" , sizeof("Data>>/gr10_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user3" , sizeof("Data>>/gr10_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user4" , sizeof("Data>>/gr10_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingD" , sizeof("Data>>/gr10_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1" , sizeof("Data>>/gr10_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2" , sizeof("Data>>/gr10_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingF" , sizeof("Data>>/gr10_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1" , sizeof("Data>>/gr10_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2" , sizeof("Data>>/gr10_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3" , sizeof("Data>>/gr10_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4" , sizeof("Data>>/gr10_Setting/DEF::user4" )},
+/* shared group 20 */
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingA" , sizeof("Data>>/gr20_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1" , sizeof("Data>>/gr20_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2" , sizeof("Data>>/gr20_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingC" , sizeof("Data>>/gr20_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user1" , sizeof("Data>>/gr20_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user2" , sizeof("Data>>/gr20_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user3" , sizeof("Data>>/gr20_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user4" , sizeof("Data>>/gr20_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingD" , sizeof("Data>>/gr20_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1" , sizeof("Data>>/gr20_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2" , sizeof("Data>>/gr20_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingF" , sizeof("Data>>/gr20_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1" , sizeof("Data>>/gr20_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2" , sizeof("Data>>/gr20_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3" , sizeof("Data>>/gr20_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", "/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4" , sizeof("Data>>/gr20_Setting/DEF::user4" )},
+/* App1 */
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingA" , sizeof("Data>>/App1_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1" , sizeof("Data>>/App1_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2" , sizeof("Data>>/App1_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingC" , sizeof("Data>>/App1_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user1" , sizeof("Data>>/App1_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user2" , sizeof("Data>>/App1_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user3" , sizeof("Data>>/App1_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user4" , sizeof("Data>>/App1_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingD" , sizeof("Data>>/App1_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1" , sizeof("Data>>/App1_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2" , sizeof("Data>>/App1_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingF" , sizeof("Data>>/App1_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1" , sizeof("Data>>/App1_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2" , sizeof("Data>>/App1_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3" , sizeof("Data>>/App1_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4" , sizeof("Data>>/App1_Setting/DEF::user4" )},
+/* App2*/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingA" , sizeof( "Data>>/App2_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1" , sizeof( "Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2" , sizeof( "Data>>/App2_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingC" , sizeof( "Data>>/App2_SettingC" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user1" , sizeof( "Data>>/App2_Setting/ABC::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user2" , sizeof( "Data>>/App2_Setting/ABC::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user3" , sizeof( "Data>>/App2_Setting/ABC::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user4" , sizeof( "Data>>/App2_Setting/ABC::user4" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingD" , sizeof( "Data>>/App2_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1" , sizeof( "Data>>/App2_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2" , sizeof( "Data>>/App2_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingF" , sizeof( "Data>>/App2_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1" , sizeof( "Data>>/App2_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2" , sizeof( "Data>>/App2_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3" , sizeof( "Data>>/App2_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", "/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4" , sizeof( "Data>>/App2_Setting/DEF::user4" )}
+};
+
+expected_file_data_s expectedFileData_shared_public_AfterBackupUserAll[50] =
+{
+/* shared public */
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false,"File>>/doc1.txt" , sizeof("File>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false,"File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_PUBLIC_WT_PATH PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4" )},
+/* shared group 10 */
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", false, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", false, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+/* shared group 20 */
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false,"File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false,"File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>gr20_>>/docA.txt::user1" , sizeof("File>>gr20_>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>gr20_>>/docA.txt::user2" , sizeof("File>>gr20_>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>gr20_>>/docA.txt::user3" , sizeof("File>>gr20_>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>gr20_>>/docA.txt::user4" , sizeof("File>>gr20_>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4" )},
+/* App1 */
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false,"File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false,"File>>App1>>/Docs/doc2.txt", sizeof("File>>App1>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App1>>/docA.txt::user1", sizeof("File>>App1>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2", sizeof("File>>App1>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>/docA.txt::user3", sizeof("File>>App1>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4", sizeof("File>>App1>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1", sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2", sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3", sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4", sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+/* App2*/
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false,"File>>App2>>/doc1.txt", sizeof("File>>App2>>/doc1.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false,"File>>App2>>/Docs/doc2.txt", sizeof("File>>App2>>/Docs/doc2.txt" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App2>>/docA.txt::user1", sizeof("File>>App2>>/docA.txt::user1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App2>>/docA.txt::user2", sizeof("File>>App2>>/docA.txt::user2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App2>>/docA.txt::user3", sizeof("File>>App2>>/docA.txt::user3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App2>>/docA.txt::user4", sizeof("File>>App2>>/docA.txt::user4" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1", sizeof("File>>App2>>/docB.txt::user2:seat1" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2", sizeof("File>>App2>>/docB.txt::user2:seat2" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3", sizeof("File>>App2>>/docB.txt::user2:seat3" )},
+ {"/tmp/backup"PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4", sizeof("File>>App2>>/docB.txt::user2:seat4" )}
+} ;
+
+/**************************************************************************************************************
+***************************************** ADD TEST CASES HERE ********************************************
+**************************************************************************************************************/
+bool_t Test_DataAfterBackupCreateUserAll(int ceva, void* pAltceva)
+{
+ long sResult = 0;
+ PersASSelectionType_e eSelection = PersASSelectionType_LastEntry;
+ char pchBackupName [MAX_PATH_SIZE];
+ char pchApplicationID [MAX_APPLICATION_NAME_SIZE];
+ int iBackupNameSize = sizeof(pchBackupName);
+ int iApplicationNameSize = sizeof(pchApplicationID);
+
+ // reset;
+ memset(pchBackupName, 0, iBackupNameSize);
+ memset(pchApplicationID, 0, iApplicationNameSize);
+
+ // selection user : no application, all users, all seats;
+
+ // create input data;
+ snprintf(pchBackupName, iBackupNameSize, "%s", BACKUP_NAME);
+ snprintf(pchApplicationID, iApplicationNameSize, "%s", NO_APPLICATION);
+ eSelection = PersASSelectionType_User;
+
+ persadmin_delete_folder(BACKUP_NAME);
+ // persAdminDataBackupCreate(PersASSelectionType_User, "/tmp/backup", "", 0xFF, 0xFF);
+ sResult = persAdminDataBackupCreate(eSelection, pchBackupName, pchApplicationID, PERSIST_SELECT_ALL_USERS, PERSIST_SELECT_ALL_SEATS);
+ // check data;
+ // expected result : backup is created for all applications, users & seats (local + shared);
+
+ // some info;
+ printf("\n Test_DataAfterBackupCreateUserAll: persAdminDataBackupCreate(user all) - %ld \n", sResult) ;
+
+ return true ;
+}
diff --git a/test/pers_svc_test/src/test_pas_check_data_after_delete_user2_data.c b/test/pers_svc_test/src/test_pas_check_data_after_delete_user2_data.c
new file mode 100644
index 0000000..fb0ec03
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_check_data_after_delete_user2_data.c
@@ -0,0 +1,226 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+#include "persComTypes.h"
+#include "stdio.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include "persistence_admin_service.h"
+
+#include "test_PAS.h"
+#include "test_pas_check_data_after_delete_user2_data.h"
+
+expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterDeleteUser2Data[80] =
+{
+ //public
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+ //GR10
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+
+ //GR20
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+
+ //App1
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user4")},
+
+ //App2
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingA", sizeof("Data>>/App2_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")}
+};
+
+expected_file_data_s expectedFileData_shared_public_AfterDeleteUser2Data[50] =
+{
+ //public
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true, "File>>/doc1.txt", sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt", sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", true, "File>>/docA.txt::user1", sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", true, "File>>/docA.txt::user2", sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", true, "File>>/docA.txt::user3", sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", true, "File>>/docA.txt::user4", sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>/docB.txt::user2:seat1", sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>/docB.txt::user2:seat2", sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>/docB.txt::user2:seat3", sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>/docB.txt::user2:seat4", sizeof("File>>/docB.txt::user2:seat4")},
+
+ //group10
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+
+
+ //group20
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>gr20_>>/doc1.txt", sizeof("File>>gr20_>>/doc1.txt")},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>gr20_>>/Docs/doc2.txt", sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat1", sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat2", sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat3", sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat4", sizeof("File>>gr20_>>/docB.txt::user2:seat4")},
+
+ //Appl1
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt", sizeof("File>>App1>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt", sizeof("File>>App1>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App1>>/docA.txt::user1", sizeof("File>>App1>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2", sizeof("File>>App1>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>/docA.txt::user3", sizeof("File>>App1>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4", sizeof("File>>App1>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat1", sizeof("File>>App1>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat2", sizeof("File>>App1>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat3", sizeof("File>>App1>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat4", sizeof("File>>App1>>/docB.txt::user2:seat4")},
+
+ //Appl2
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt", sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt", sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App2>>/docA.txt::user1", sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App2>>/docA.txt::user2", sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App2>>/docA.txt::user3", sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App2>>/docA.txt::user4", sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat1", sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat2", sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat3", sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat4", sizeof("File>>App2>>/docB.txt::user2:seat4")}
+} ;
+
+/**************************************************************************************************************
+***************************************** ADD TEST CASES HERE ********************************************
+**************************************************************************************************************/
+bool_t Test_DataAfterDeleteUser2Data(int ceva, void* pAltceva)
+{
+ bool_t bEverythingOK = true ;
+
+ if ( 0 > persAdminUserDataDelete(2, 1) )
+ {
+ bEverythingOK = false;
+ }
+
+ if ( bEverythingOK )
+ {
+ if ( 0 > persAdminUserDataDelete(2, 2) )
+ {
+ bEverythingOK = false;
+ }
+ }
+
+ if ( bEverythingOK )
+ {
+ if ( 0 > persAdminUserDataDelete(2, 3) )
+ {
+ bEverythingOK = false;
+ }
+ }
+
+ if ( bEverythingOK )
+ {
+ if ( 0 > persAdminUserDataDelete(2, 4) )
+ {
+ bEverythingOK = false;
+ }
+ }
+
+ printf("\nTest_DataAfterDeleteUser2Data: DeleteUser2Data() - %s \n", bEverythingOK ? "OK" : "FAILED") ;
+
+ return bEverythingOK ;
+}
diff --git a/test/pers_svc_test/src/test_pas_check_data_after_reset.c b/test/pers_svc_test/src/test_pas_check_data_after_reset.c
new file mode 100644
index 0000000..2608105
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_check_data_after_reset.c
@@ -0,0 +1,118 @@
+/********************************************************************************************************************* * * Copyright (C) 2012 Continental Automotive Systems, Inc. * * Author: Petrica.Manoila@continental-corporation.com * * Implementation of backup process * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Date Author Reason * 2012.11.27 uidu0250 CSP_WZ#1280: Initial version * **********************************************************************************************************************/ #include "persComTypes.h"
+#include "stdio.h"
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include "ssw_pers_admin_files_helper.h"
+
+#include "test_PAS.h"
+#include "test_pas_check_data_after_reset.h"
+
+#define File_t PersistenceResourceType_file
+#define Key_t PersistenceResourceType_key
+
+expected_key_data_RCT_s expectedKeyData_shared_public_RCT_AfterReset[13] =
+{
+ {"pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingD", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"doc1.txt", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"docA.txt", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, true,
+ {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/DEE", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME, false,
+ {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}}
+};
+
+expected_key_data_localDB_s expectedKeyData_shared_public_localDB_AfterReset[18] =
+{
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, NIL, 0},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, NIL, 0}
+};
+
+expected_file_data_s expectedFileData_shared_public_AfterReset[11] =
+{
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true, "File>>/doc1.txt", sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt", sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", true, "File>>/docA.txt::user1", sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", true, "File>>/docA.txt::user2", sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", true, "File>>/docA.txt::user3", sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", true, "File>>/docA.txt::user4", sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1", sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2", sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3", sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4", sizeof("File>>/docB.txt::user2:seat4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false,NIL, 0},
+} ;
+
+#if 0
+bool_t Test_DataAfterReset(int ceva, void* pAltceva) ;
+
+testcase_s tc_testDataAfterReset =
+{
+ Test_DataAfterReset,
+ 0,
+ NIL,
+ "Check reference data structure after initialization",
+ expectedKeyData_shared_public_RCT_AfterReset,
+ sizeof(expectedKeyData_shared_public_RCT_AfterReset)/sizeof(expectedKeyData_shared_public_RCT_AfterReset[0]),
+ expectedKeyData_shared_public_localDB_AfterReset,
+ sizeof(expectedKeyData_shared_public_localDB_AfterReset)/sizeof(expectedKeyData_shared_public_localDB_AfterReset[0]),
+ expectedFileData_shared_public_AfterReset,
+ sizeof(expectedFileData_shared_public_AfterReset)/sizeof(expectedFileData_shared_public_AfterReset[0])
+};
+
+const testcase_s const* pTC_testDataAfterReset = &tc_testDataAfterReset ;
+#endif
+
+/**************************************************************************************************************
+***************************************** ADD TEST CASES HERE ********************************************
+**************************************************************************************************************/
+bool_t Test_DataAfterReset(int ceva, void* pAltceva)
+{
+ bool_t bEverythingOK = true ;
+
+ //bEverythingOK = ResetReferenceData() ;
+ //printf("\nTest_DataAfterReset: ResetReferenceData() - %s \n", bEverythingOK ? "OK" : "FAILED") ;
+ printf("\nTest_DataAfterReset: Data was reset... \n") ;
+
+ return bEverythingOK ;
+}
diff --git a/test/pers_svc_test/src/test_pas_import_all.c b/test/pers_svc_test/src/test_pas_import_all.c
new file mode 100644
index 0000000..dbf0d46
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_import_all.c
@@ -0,0 +1,237 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+#include "stdio.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_import.h"
+
+#define LT_HDR "TEST_PAS >> "
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define PATH_ABS_MAX_SIZE ( 512)
+
+expected_key_data_localDB_s expected_key_data_after_import_all_all[] =
+{
+// TO BE USED WHEN RCT logic is implemented
+// { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingK", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME , true, "Data>>/pubSettingK" , sizeof ("Data>>/pubSettingK" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingL", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME , true, "Data>>/pubSettingL" , sizeof ("Data>>/pubSettingL" )},
+// { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME , true, "Data>>/pubSetting/KBL::user1" , sizeof ("Data>>/pubSetting/KBL::user1" )},
+// { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME , true, "Data>>/pubSetting/KBL::user2" , sizeof ("Data>>/pubSetting/KBL::user2" )},
+// { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME , true, "Data>>/pubSetting/KBL::user3" , sizeof ("Data>>/pubSetting/KBL::user3" )},
+// { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME , true, "Data>>/pubSetting/KBL::user4" , sizeof ("Data>>/pubSetting/KBL::user4" )},
+// { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/XYZ", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME , true, "Data>>/pubSetting/XYZ::user4" , sizeof ("Data>>/pubSetting/XYZ::user4" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingK", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingK" , sizeof ("Data>>/gr10_SettingK" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingL", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingL" , sizeof ("Data>>/gr10_SettingL" )},
+// { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user1" , sizeof ("Data>>/gr10_Setting/KBL::user1" )},
+// { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user2" , sizeof ("Data>>/gr10_Setting/KBL::user2" )},
+// { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user3" , sizeof ("Data>>/gr10_Setting/KBL::user3" )},
+// { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user4" , sizeof ("Data>>/gr10_Setting/KBL::user4" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingZ", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingZ" , sizeof ("Data>>/gr10_SettingZ" )},
+// { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/PRT", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/PRT::user4" , sizeof ("Data>>/gr10_Setting/PRT::user4" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingK", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingK" , sizeof ("Data>>/gr20_SettingK" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingL", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingL" , sizeof ("Data>>/gr20_SettingL" )},
+// { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/KBL", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/KBL::user1" , sizeof ("Data>>/gr20_Setting/KBL::user1" )},
+// { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/KBL", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/KBL::user2" , sizeof ("Data>>/gr20_Setting/KBL::user2" )},
+// { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/KBL", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/KBL::user3" , sizeof ("Data>>/gr20_Setting/KBL::user3" )},
+// { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/KBL", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/KBL::user4" , sizeof ("Data>>/gr20_Setting/KBL::user4" )},
+// { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/PRT", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/PRT::user4" , sizeof ("Data>>/gr20_Setting/PRT::user4" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingK", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_SettingK" , sizeof("Data>>/App1_SettingK" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_SettingL" , sizeof("Data>>/App1_SettingL" )},
+// { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_Setting/KBL::user1" , sizeof("Data>>/App1_Setting/KBL::user1" )},
+// { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_Setting/KBL::user2" , sizeof("Data>>/App1_Setting/KBL::user2" )},
+// { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_Setting/KBL::user3" , sizeof("Data>>/App1_Setting/KBL::user3" )},
+// { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_Setting/KBL::user4" , sizeof("Data>>/App1_Setting/KBL::user4" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingK", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_SettingK" , sizeof("Data>>/App2_SettingK" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_SettingL" , sizeof("Data>>/App2_SettingL" )},
+// { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_Setting/KBL::user1" , sizeof("Data>>/App2_Setting/KBL::user1" )},
+// { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_Setting/KBL::user2" , sizeof("Data>>/App2_Setting/KBL::user2" )},
+// { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_Setting/KBL::user3" , sizeof("Data>>/App2_Setting/KBL::user3" )},
+// { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_Setting/KBL::user4" , sizeof("Data>>/App2_Setting/KBL::user4" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingZ", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingZ" , sizeof ("Data>>/gr20_SettingZ" )},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingB", sizeof("Data>>/pubSettingB")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1" , sizeof ("Data>>/pubSettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2" , sizeof ("Data>>/pubSettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD" , sizeof ("Data>>/pubSettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1" , sizeof ("Data>>/pubSettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2" , sizeof ("Data>>/pubSettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF" , sizeof ("Data>>/pubSettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1" , sizeof ("Data>>/pubSetting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2" , sizeof ("Data>>/pubSetting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3" , sizeof ("Data>>/pubSetting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4" , sizeof ("Data>>/pubSetting/DEF::user4" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1" , sizeof ("Data>>/gr10_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user1:seat1" , sizeof ("Data>>/gr10_SettingB::user1:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2" , sizeof ("Data>>/gr10_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD" , sizeof ("Data>>/gr10_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1" , sizeof ("Data>>/gr10_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2" , sizeof ("Data>>/gr10_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF" , sizeof ("Data>>/gr10_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1" , sizeof ("Data>>/gr10_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2" , sizeof ("Data>>/gr10_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3" , sizeof ("Data>>/gr10_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4" , sizeof ("Data>>/gr10_Setting/DEF::user4" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1" , sizeof ("Data>>/gr20_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2" , sizeof ("Data>>/gr20_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingD" , sizeof ("Data>>/gr20_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1" , sizeof ("Data>>/gr20_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2" , sizeof ("Data>>/gr20_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingF" , sizeof ("Data>>/gr20_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1" , sizeof ("Data>>/gr20_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2" , sizeof ("Data>>/gr20_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3" , sizeof ("Data>>/gr20_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4" , sizeof ("Data>>/gr20_Setting/DEF::user4" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1" , sizeof("Data>>/App1_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2" , sizeof("Data>>/App1_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD" , sizeof("Data>>/App1_SettingD" )},
+ //key in original data, not present in import set
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingD" , sizeof("Data>>/App1_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1" , sizeof("Data>>/App1_SettingE::user2:seat1" )},
+ //key in original data, not present in import set
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingB::user2:seat1" , sizeof("Data>>/App1_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2" , sizeof("Data>>/App1_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF" , sizeof("Data>>/App1_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1" , sizeof("Data>>/App1_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2" , sizeof("Data>>/App1_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3" , sizeof("Data>>/App1_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4" , sizeof("Data>>/App1_Setting/DEF::user4" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1" , sizeof("Data>>/App2_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2" , sizeof("Data>>/App2_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD" , sizeof("Data>>/App2_SettingD" )},
+ //key in original data, not present in import set
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingD" , sizeof("Data>>/App2_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1" , sizeof("Data>>/App2_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2" , sizeof("Data>>/App2_SettingE::user2:seat2" )},
+ //key in original data, not present in import set
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2" , sizeof("Data>>/App2_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF" , sizeof("Data>>/App2_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1" , sizeof("Data>>/App2_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2" , sizeof("Data>>/App2_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3" , sizeof("Data>>/App2_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4" , sizeof("Data>>/App2_Setting/DEF::user4" )}
+};
+
+expected_file_data_s expected_file_data_after_import_all_all[] =
+{
+// TO BE USED WHEN RCT logic is implemented
+// { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docK.txt", true , "File>>/docK.txt::user1" , sizeof( "File>>/docK.txt::user1" ) },
+// { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docK.txt", true , "File>>/docK.txt::user2" , sizeof( "File>>/docK.txt::user2" ) },
+// { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docT.txt", false , "File>>/docT.txt::user2" , sizeof( "File>>/docT.txt::user2" ) },
+// { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docK.txt", true , "File>>/docK.txt::user3" , sizeof( "File>>/docK.txt::user3" ) },
+// { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docK.txt", true , "File>>/docK.txt::user4" , sizeof( "File>>/docK.txt::user4" ) },
+// { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", false , "File>>/docC.txt::user2:seat4" , sizeof( "File>>/docC.txt::user2:seat4" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>gr10_>>/docK.txt::user1" , sizeof ( "File>>gr10_>>/docK.txt::user1" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>gr10_>>/docK.txt::user2" , sizeof ( "File>>gr10_>>/docK.txt::user2" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docT.txt", false, "File>>gr10_>>/docK.txt::user2" , sizeof ( "File>>gr10_>>/docK.txt::user2" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>gr10_>>/docK.txt::user3" , sizeof ( "File>>gr10_>>/docK.txt::user3" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>gr10_>>/docK.txt::user4" , sizeof ( "File>>gr10_>>/docK.txt::user4" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docT.txt", false, "File>>gr10_>>/docB.txt::user2:seat4" , sizeof ( "File>>gr10_>>/docB.txt::user2:seat4" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docT.txt", false, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof ( "File>>gr20_>>/docB.txt::user2:seat4" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>gr20_>>/docK.txt::user1" , sizeof ( "File>>gr20_>>/docK.txt::user1" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>gr20_>>/docK.txt::user2" , sizeof ( "File>>gr20_>>/docK.txt::user2" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docT.txt", false, "File>>gr20_>>/docK.txt::user2" , sizeof ( "File>>gr20_>>/docK.txt::user2" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>gr20_>>/docK.txt::user3" , sizeof ( "File>>gr20_>>/docK.txt::user3" ) },
+// { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>gr20_>>/docK.txt::user4" , sizeof ( "File>>gr20_>>/docK.txt::user4" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>App1>>/docK.txt::user1" , sizeof("File>>App1>>/docK.txt::user1" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>App1>>/docK.txt::user2" , sizeof("File>>App1>>/docK.txt::user2" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>App1>>/docK.txt::user3" , sizeof("File>>App1>>/docK.txt::user3" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>App1>>/docK.txt::user4" , sizeof("File>>App1>>/docK.txt::user4" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", true, "File>>App1>>/docC.txt::user2:seat4" , sizeof("File>>App1>>/docC.txt::user2:seat4" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", false, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docD.txt::user2:seat4" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>App2>>/docK.txt::user1" , sizeof("File>>App2>>/docK.txt::user1" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>App2>>/docK.txt::user2" , sizeof("File>>App2>>/docK.txt::user2" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>App2>>/docK.txt::user3" , sizeof("File>>App2>>/docK.txt::user3" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>App2>>/docK.txt::user4" , sizeof("File>>App2>>/docK.txt::user4" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", true, "File>>App2>>/docC.txt::user2:seat4" , sizeof("File>>App2>>/docC.txt::user2:seat4" ) }
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", false, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docD.txt::user2:seat4" ) }
+
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true , "File>>/doc1.txt" , sizeof( "File>>/doc1.txt" ) },
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true , "File>>/Docs/doc2.txt" , sizeof( "File>>/Docs/doc2.txt" ) },
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true , "File>>/docB.txt::user2:seat1" , sizeof( "File>>/docB.txt::user2:seat1" ) },
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true , "File>>/docB.txt::user2:seat2" , sizeof( "File>>/docB.txt::user2:seat2" ) },
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true , "File>>/docB.txt::user2:seat3" , sizeof( "File>>/docB.txt::user2:seat3" ) },
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true , "File>>/docB.txt::user2:seat4" , sizeof( "File>>/docB.txt::user2:seat4" ) },
+
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt" , sizeof ( "File>>gr10_>>/gr10_1.txt" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof ( "File>>gr10_>>/Docs/gr10_A.txt" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof ( "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof ( "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof ( "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof ( "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" ) },
+
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>gr20_>>/doc1.txt" , sizeof ( "File>>gr20_>>/doc1.txt" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>gr20_>>/Docs/doc2.txt" , sizeof ( "File>>gr20_>>/Docs/doc2.txt" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof ( "File>>gr20_>>/docB.txt::user2:seat1" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof ( "File>>gr20_>>/docB.txt::user2:seat2" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof ( "File>>gr20_>>/docB.txt::user2:seat3" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof ( "File>>gr20_>>/docB.txt::user2:seat4" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" ) },
+
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4" ) },
+
+
+};
+
+bool_t Test_import_all_all(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long impBytes =-1;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ bEverythingOK = ResetImportData(PersASSelectionType_All);
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "all", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Import from:"),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ impBytes = persAdminDataFolderImport(PersASSelectionType_All, pchBackupFilePath);
+
+ bEverythingOK = (impBytes >= 0)?true:false;
+ }
+
+ printf("\nTest_import_all - %s \n", bEverythingOK ? "OK" : "FAILED") ;
+
+ return bEverythingOK ;
+}
+
diff --git a/test/pers_svc_test/src/test_pas_import_app.c b/test/pers_svc_test/src/test_pas_import_app.c
new file mode 100644
index 0000000..7979807
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_import_app.c
@@ -0,0 +1,141 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_import.h"
+
+#define LT_HDR "TEST_PAS >> "
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define PATH_ABS_MAX_SIZE ( 512)
+
+expected_key_data_localDB_s expected_key_data_after_import_app_all[] =
+{
+// TO BE USED WHEN RCT logic is implemented
+// { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingK", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_SettingK" , sizeof("Data>>/App1_SettingK" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_SettingL" , sizeof("Data>>/App1_SettingL" )},
+// { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_Setting/KBL::user1" , sizeof("Data>>/App1_Setting/KBL::user1" )},
+// { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_Setting/KBL::user2" , sizeof("Data>>/App1_Setting/KBL::user2" )},
+// { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_Setting/KBL::user3" , sizeof("Data>>/App1_Setting/KBL::user3" )},
+// { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App1_Setting/KBL::user4" , sizeof("Data>>/App1_Setting/KBL::user4" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingK", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_SettingK" , sizeof("Data>>/App2_SettingK" )},
+// { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_SettingL" , sizeof("Data>>/App2_SettingL" )},
+// { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_Setting/KBL::user1" , sizeof("Data>>/App2_Setting/KBL::user1" )},
+// { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_Setting/KBL::user2" , sizeof("Data>>/App2_Setting/KBL::user2" )},
+// { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_Setting/KBL::user3" , sizeof("Data>>/App2_Setting/KBL::user3" )},
+// { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME , true, "Data>>/App2_Setting/KBL::user4" , sizeof("Data>>/App2_Setting/KBL::user4" )},
+
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1" , sizeof("Data>>/App1_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2" , sizeof("Data>>/App1_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD" , sizeof("Data>>/App1_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1" , sizeof("Data>>/App1_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2" , sizeof("Data>>/App1_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF" , sizeof("Data>>/App1_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1" , sizeof("Data>>/App1_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2" , sizeof("Data>>/App1_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3" , sizeof("Data>>/App1_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4" , sizeof("Data>>/App1_Setting/DEF::user4" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1" , sizeof("Data>>/App2_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2" , sizeof("Data>>/App2_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD" , sizeof("Data>>/App2_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1" , sizeof("Data>>/App2_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2" , sizeof("Data>>/App2_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF" , sizeof("Data>>/App2_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1" , sizeof("Data>>/App2_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2" , sizeof("Data>>/App2_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3" , sizeof("Data>>/App2_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4" , sizeof("Data>>/App2_Setting/DEF::user4" )},
+
+ //common data, not imported for type "application"
+ //public key
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingB", sizeof("Data>>/pubSettingB")},
+ //group key
+ { PERS_ORG_USER_FOLDER_NAME_"1"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingB::user1::seat1" , sizeof ("Data>>/gr10_SettingB::user1::seat1" )},
+};
+
+expected_file_data_s expected_file_data_after_import_app_all[] =
+{
+// TO BE USED WHEN RCT logic is implemented
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>App1>>/docK.txt::user1" , sizeof("File>>App1>>/docK.txt::user1" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>App1>>/docK.txt::user2" , sizeof("File>>App1>>/docK.txt::user2" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>App1>>/docK.txt::user3" , sizeof("File>>App1>>/docK.txt::user3" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>App1>>/docK.txt::user4" , sizeof("File>>App1>>/docK.txt::user4" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", true, "File>>App1>>/docC.txt::user2:seat4" , sizeof("File>>App1>>/docC.txt::user2:seat4" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", false, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docD.txt::user2:seat4" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>App2>>/docK.txt::user1" , sizeof("File>>App2>>/docK.txt::user1" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>App2>>/docK.txt::user2" , sizeof("File>>App2>>/docK.txt::user2" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>App2>>/docK.txt::user3" , sizeof("File>>App2>>/docK.txt::user3" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>App2>>/docK.txt::user4" , sizeof("File>>App2>>/docK.txt::user4" ) },
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", true, "File>>App2>>/docC.txt::user2:seat4" , sizeof("File>>App2>>/docC.txt::user2:seat4" ) }
+// { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", false, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docD.txt::user2:seat4" ) }
+
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4" ) }
+
+
+};
+
+bool_t Test_import_all_app(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long impBytes =-1;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ bEverythingOK = ResetImportData(PersASSelectionType_Application);
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "all", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Import from:"),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ impBytes = persAdminDataFolderImport(PersASSelectionType_Application, pchBackupFilePath);
+
+ bEverythingOK = (impBytes >= 0)?true:false;
+ }
+
+ printf("\nTest_import_all - %s \n", bEverythingOK ? "OK" : "FAILED") ;
+
+ return bEverythingOK ;
+}
diff --git a/test/pers_svc_test/src/test_pas_import_source_content.c b/test/pers_svc_test/src/test_pas_import_source_content.c
new file mode 100644
index 0000000..b0aeaa4
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_import_source_content.c
@@ -0,0 +1,1011 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+#include "stdio.h"
+#include "string.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "persistence_admin_service.h"
+#include "test_PAS.h"
+#include "test_pas_data_import.h"
+
+/* compress/uncompress */
+#include <archive.h>
+#include <archive_entry.h>
+
+
+#define READ_BUFFER_LENGTH (16384)
+
+#define PATH_ABS_MAX_SIZE ( 512)
+
+
+#define LT_HDR "TEST_PAS >> "
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define File_t PersistenceResourceType_file
+#define Key_t PersistenceResourceType_key
+
+#define USE_REF_RCT
+
+#ifndef USE_REF_RCT
+entryRctInit_s RCT_public_init_import[] =
+{
+ {"/pubSettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/pubSettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/pubSettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/pubSettingK", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/pubSettingL", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/pubSetting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/pubSetting/KBL", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/pubSettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/pubSettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/pubSettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/pubSetting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/docT.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"/Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}}
+} ;
+#else
+static entryRctInit_s RCT_public_init_import[] =
+{
+ {"pubSettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}}
+} ;
+#endif
+
+entryDataInit_s dataKeysPublicInit_import[] =
+{
+// {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingK", PersistencePolicy_wt, 0, 0, "Data>>/pubSettingK"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PersistencePolicy_wt, 2, 1, "Data>>/pubSettingB::user2::seat1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PersistencePolicy_wt, 2, 2, "Data>>/pubSettingB::user2:seat2"},
+// {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingL", PersistencePolicy_wt, 0, 0, "Data>>/pubSettingL"},
+// {0, PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/KBL", PersistencePolicy_wt, 1, 0, "Data>>/pubSetting/KBL::user1"},
+// {0, PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/KBL", PersistencePolicy_wt, 2, 0, "Data>>/pubSetting/KBL::user2"},
+// {0, PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/KBL", PersistencePolicy_wt, 3, 0, "Data>>/pubSetting/KBL::user3"},
+// {0, PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/KBL", PersistencePolicy_wt, 4, 0, "Data>>/pubSetting/KBL::user4"},
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PersistencePolicy_wc, 0, 0, "Data>>/pubSettingD"},
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingB", PersistencePolicy_wc, 0, 0, "Data>>/pubSettingB"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PersistencePolicy_wc, 2, 1, "Data>>/pubSettingE::user2:seat1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PersistencePolicy_wc, 2, 2, "Data>>/pubSettingE::user2:seat2"},
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PersistencePolicy_wc, 0, 0, "Data>>/pubSettingF"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/pubSetting/DEF::user1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/pubSetting/DEF::user2"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/pubSetting/DEF::user3"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/pubSetting/DEF::user4"}
+// {0, PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/XYZ", PersistencePolicy_wc, 4, 0, "Data>>/pubSetting/XYZ::user4"}
+} ;
+
+
+entryDataInit_s dataFilesPublicInit_import[] =
+{
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>/doc1.txt"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>/Docs/doc2.txt"},
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>/docK.txt::user1"},
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>/docK.txt::user2"},
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docT.txt", PersistencePolicy_wc, 2, 0, "File>>/docT.txt::user2"},
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>/docK.txt::user3"},
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>/docK.txt::user4"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>/docB.txt::user2:seat1"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>/docB.txt::user2:seat2"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>/docB.txt::user2:seat3"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>/docB.txt::user2:seat4"}
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>/docC.txt::user2:seat4"}
+};
+
+entryDataInit_s dataFilesPublicInit_import_wt[] =
+{
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>/doc1.txt"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>/Docs/doc2.txt"},
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>/docK.txt::user1"},
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>/docK.txt::user2"},
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docT.txt", PersistencePolicy_wc, 2, 0, "File>>/docT.txt::user2"},
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>/docK.txt::user3"},
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>/docK.txt::user4"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>/docB.txt::user2:seat1"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>/docB.txt::user2:seat2"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>/docB.txt::user2:seat3"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>/docB.txt::user2:seat4"}
+// {0, IMPORT_LOCATION PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>/docC.txt::user2:seat4"}
+};
+
+dataInit_s sSharedPubDataInit_import =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ ,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_public_init_import,
+ sizeof(RCT_public_init_import)/sizeof(RCT_public_init_import[0]),
+ dataKeysPublicInit_import,
+ sizeof(dataKeysPublicInit_import)/sizeof(dataKeysPublicInit_import[0]),
+ dataFilesPublicInit_import,
+ sizeof(dataFilesPublicInit_import)/sizeof(dataFilesPublicInit_import[0])
+} ;
+
+dataInit_s sSharedPubDataInit_import_wt =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ ,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_public_init_import,
+ sizeof(RCT_public_init_import)/sizeof(RCT_public_init_import[0]),
+ dataKeysPublicInit_import,
+ sizeof(dataKeysPublicInit_import)/sizeof(dataKeysPublicInit_import[0]),
+ dataFilesPublicInit_import_wt,
+ sizeof(dataFilesPublicInit_import_wt)/sizeof(dataFilesPublicInit_import_wt[0])
+} ;
+
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+#ifndef USE_REF_RCT
+entryRctInit_s RCT_group10_init_import[] =
+{
+ {"/gr10_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_SettingK", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_SettingL", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_Setting/KBL", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_SettingZ", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/gr10_Setting/PRT", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"Docs/gr10_A.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"/docK.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"/docT.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_B.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}}
+} ;
+#else
+ static entryRctInit_s RCT_group10_init_import[] =
+ {
+ {"gr10_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"Docs/gr10_A.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"gr10_2.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}},
+ {"Docs/gr10_B.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"},{NIL},{NIL}}}
+ } ;
+#endif
+
+entryDataInit_s dataKeys_Group10_Init_import[] =
+{
+// {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingK", PersistencePolicy_wt, 0, 0, "Data>>/gr10_SettingK"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/gr10_SettingB::user2::seat1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/gr10_SettingB::user2:seat2"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"1"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PersistencePolicy_wt, 1, 1, "Data>>/gr10_SettingB::user1:seat1"},
+// {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingL", PersistencePolicy_wt, 0, 0, "Data>>/gr10_SettingL"},
+// {0x10, PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/KBL", PersistencePolicy_wt, 1, 0, "Data>>/gr10_Setting/KBL::user1"},
+// {0x10, PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/KBL", PersistencePolicy_wt, 2, 0, "Data>>/gr10_Setting/KBL::user2"},
+// {0x10, PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/KBL", PersistencePolicy_wt, 3, 0, "Data>>/gr10_Setting/KBL::user3"},
+// {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/KBL", PersistencePolicy_wt, 4, 0, "Data>>/gr10_Setting/KBL::user4"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/gr10_SettingD"},
+// {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingZ", PersistencePolicy_wc, 0, 0, "Data>>/gr10_SettingZ"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/gr10_SettingE::user2:seat1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/gr10_SettingE::user2:seat2"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/gr10_SettingF"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/gr10_Setting/DEF::user1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/gr10_Setting/DEF::user2"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/gr10_Setting/DEF::user3"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/gr10_Setting/DEF::user4"}
+// {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/PRT", PersistencePolicy_wc, 4, 0, "Data>>/gr10_Setting/PRT::user4"}
+} ;
+
+
+entryDataInit_s dataFiles_Group10_Init_import[] =
+{
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/gr10_1.txt"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/Docs/gr10_A.txt"},
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>gr10_>>/docK.txt::user1"},
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>gr10_>>/docK.txt::user2"},
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docT.txt", PersistencePolicy_wc, 2, 0, "File>>gr10_>>/docK.txt::user2"},
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>gr10_>>/docK.txt::user3"},
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>gr10_>>/docK.txt::user4"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 1, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 2, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 3, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 4, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4"},
+
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/gr10_1.txt", PersistencePolicy_wc, 2, 4, "File>>gr10_>>/gr10_1.txt::user2:seat4"}
+
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docT.txt", PersistencePolicy_wc, 2, 4, "File>>gr10_>>/docB.txt::user2:seat4"}
+};
+
+
+entryDataInit_s dataFiles_Group10_Init_import_wt[] =
+{
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/doc1.txt"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/Docs/doc2.txt"},
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>gr10_>>/docK.txt::user1"},
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>gr10_>>/docK.txt::user2"},
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docT.txt", PersistencePolicy_wc, 2, 0, "File>>gr10_>>/docK.txt::user2"},
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>gr10_>>/docK.txt::user3"},
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>gr10_>>/docK.txt::user4"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>gr10_>>/docB.txt::user2:seat1"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>gr10_>>/docB.txt::user2:seat2"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>gr10_>>/docB.txt::user2:seat3"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>gr10_>>/docB.txt::user2:seat4"}
+// {0x10, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docT.txt", PersistencePolicy_wc, 2, 4, "File>>gr10_>>/docB.txt::user2:seat4"}
+};
+
+
+dataInit_s sShared_Group10_DataInit_import =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/",
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group10_init_import,
+ sizeof(RCT_group10_init_import)/sizeof(RCT_group10_init_import[0]),
+ dataKeys_Group10_Init_import,
+ sizeof(dataKeys_Group10_Init_import)/sizeof(dataKeys_Group10_Init_import[0]),
+ dataFiles_Group10_Init_import,
+ sizeof(dataFiles_Group10_Init_import)/sizeof(dataFiles_Group10_Init_import[0])
+} ;
+
+dataInit_s sShared_Group10_DataInit_import_wt =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10/",
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group10_init_import,
+ sizeof(RCT_group10_init_import)/sizeof(RCT_group10_init_import[0]),
+ dataKeys_Group10_Init_import,
+ sizeof(dataKeys_Group10_Init_import)/sizeof(dataKeys_Group10_Init_import[0]),
+ dataFiles_Group10_Init_import_wt,
+ sizeof(dataFiles_Group10_Init_import_wt)/sizeof(dataFiles_Group10_Init_import_wt[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+#ifndef USE_REF_RCT
+entryRctInit_s RCT_group20_init_import[] =
+{
+ {"/gr20_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_SettingK", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_SettingL", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_Setting/KBL", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_SettingZ", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/gr20_Setting/PRT", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/docK.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/docT.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"/Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}}
+} ;
+#else
+ static entryRctInit_s RCT_group20_init_import[] =
+ {
+ {"gr20_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}}
+ } ;
+#endif
+
+entryDataInit_s dataKeys_Group20_Init_import[] =
+{
+// {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingK", PersistencePolicy_wt, 0, 0, "Data>>/gr20_SettingK"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/gr20_SettingB::user2::seat1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/gr20_SettingB::user2:seat2"},
+// {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingL", PersistencePolicy_wt, 0, 0, "Data>>/gr20_SettingL"},
+// {0x10, PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/KBL", PersistencePolicy_wt, 1, 0, "Data>>/gr20_Setting/KBL::user1"},
+// {0x10, PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/KBL", PersistencePolicy_wt, 2, 0, "Data>>/gr20_Setting/KBL::user2"},
+// {0x10, PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/KBL", PersistencePolicy_wt, 3, 0, "Data>>/gr20_Setting/KBL::user3"},
+// {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/KBL", PersistencePolicy_wt, 4, 0, "Data>>/gr20_Setting/KBL::user4"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/gr20_SettingD"},
+// {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingZ", PersistencePolicy_wc, 0, 0, "Data>>/gr20_SettingZ"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/gr20_SettingE::user2:seat1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/gr20_SettingE::user2:seat2"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/gr20_SettingF"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/gr20_Setting/DEF::user1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/gr20_Setting/DEF::user2"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/gr20_Setting/DEF::user3"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/gr20_Setting/DEF::user4"}
+// {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/PRT", PersistencePolicy_wc, 4, 0, "Data>>/gr20_Setting/PRT::user4"}
+} ;
+
+entryDataInit_s dataFiles_Group20_Init_import[] =
+{
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>gr20_>>/doc1.txt"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>gr20_>>/Docs/doc2.txt"},
+// {0x20, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>gr20_>>/docK.txt::user1"},
+// {0x20, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>gr20_>>/docK.txt::user2"},
+// {0x20, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>gr20_>>/docK.txt::user3"},
+// {0x20, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>gr20_>>/docK.txt::user4"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>gr20_>>/docB.txt::user2:seat1"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>gr20_>>/docB.txt::user2:seat2"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>gr20_>>/docB.txt::user2:seat3"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>gr20_>>/docB.txt::user2:seat4"}
+};
+
+entryDataInit_s dataFiles_Group20_Init_import_wt[] =
+{
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>gr20_>>/doc1.txt"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>gr20_>>/Docs/doc2.txt"},
+// {0x20, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>gr20_>>/docK.txt::user1"},
+// {0x20, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>gr20_>>/docK.txt::user2"},
+// {0x20, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>gr20_>>/docK.txt::user3"},
+// {0x20, IMPORT_LOCATION PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>gr20_>>/docK.txt::user4"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>gr20_>>/docB.txt::user2:seat1"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>gr20_>>/docB.txt::user2:seat2"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>gr20_>>/docB.txt::user2:seat3"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>gr20_>>/docB.txt::user2:seat4"}
+};
+
+dataInit_s sShared_Group20_DataInit_import =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/",
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group20_init_import,
+ sizeof(RCT_group20_init_import)/sizeof(RCT_group20_init_import[0]),
+ dataKeys_Group20_Init_import,
+ sizeof(dataKeys_Group20_Init_import)/sizeof(dataKeys_Group20_Init_import[0]),
+ dataFiles_Group20_Init_import,
+ sizeof(dataFiles_Group20_Init_import)/sizeof(dataFiles_Group20_Init_import[0])
+} ;
+
+dataInit_s sShared_Group20_DataInit_import_wt =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20/",
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group20_init_import,
+ sizeof(RCT_group20_init_import)/sizeof(RCT_group20_init_import[0]),
+ dataKeys_Group20_Init_import,
+ sizeof(dataKeys_Group20_Init_import)/sizeof(dataKeys_Group20_Init_import[0]),
+ dataFiles_Group20_Init_import_wt,
+ sizeof(dataFiles_Group20_Init_import_wt)/sizeof(dataFiles_Group20_Init_import_wt[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+#ifndef USE_REF_RCT
+entryRctInit_s RCT_App1_init_import[] =
+{
+ {"/App1_SettingK", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/App1_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/App1_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/App1_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/App1_SettingL", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/App1_Setting/KBL", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/App1_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/App1_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/App1_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/App1_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/App1_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/docK.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"/Docs/docC.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}}
+} ;
+#else
+ static entryRctInit_s RCT_App1_init_import[] =
+ {
+ {"App1_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}}
+ } ;
+#endif
+
+entryDataInit_s dataKeys_App1_Init_import[] =
+{
+// {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingK", PersistencePolicy_wt, 0, 0, "Data>>/App1_SettingK"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/App1_SettingB::user2::seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/App1_SettingB::user2:seat2"},
+// {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingL", PersistencePolicy_wt, 0, 0, "Data>>/App1_SettingL"},
+// {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/KBL", PersistencePolicy_wt, 1, 0, "Data>>/App1_Setting/KBL::user1"},
+// {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KBL", PersistencePolicy_wt, 2, 0, "Data>>/App1_Setting/KBL::user2"},
+// {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/KBL", PersistencePolicy_wt, 3, 0, "Data>>/App1_Setting/KBL::user3"},
+// {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/KBL", PersistencePolicy_wt, 4, 0, "Data>>/App1_Setting/KBL::user4"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/App1_SettingD"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/App1_SettingE::user2:seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/App1_SettingE::user2:seat2"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/App1_SettingF"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/App1_Setting/DEF::user1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/App1_Setting/DEF::user2"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/App1_Setting/DEF::user3"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/App1_Setting/DEF::user4"}
+} ;
+
+entryDataInit_s dataFiles_App1_Init_import[] =
+{
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>App1>>/doc1.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>App1>>/Docs/doc2.txt"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>App1>>/docK.txt::user1"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>App1>>/docK.txt::user2"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>App1>>/docK.txt::user3"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>App1>>/docK.txt::user4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>App1>>/docB.txt::user2:seat1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>App1>>/docB.txt::user2:seat2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>App1>>/docB.txt::user2:seat3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docB.txt::user2:seat4"}
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docC.txt::user2:seat4"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docD.txt::user2:seat4"}
+};
+
+entryDataInit_s dataFiles_App1_Init_import_wt[] =
+{
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>App1>>/doc1.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>App1>>/Docs/doc2.txt"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>App1>>/docK.txt::user1"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>App1>>/docK.txt::user2"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>App1>>/docK.txt::user3"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>App1>>/docK.txt::user4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>App1>>/docB.txt::user2:seat1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>App1>>/docB.txt::user2:seat2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>App1>>/docB.txt::user2:seat3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docB.txt::user2:seat4"}
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docC.txt::user2:seat4"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docD.txt::user2:seat4"}
+};
+
+dataInit_s s_App1_DataInit_import =
+{
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/",
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App1_init_import,
+ sizeof(RCT_App1_init_import)/sizeof(RCT_App1_init_import[0]),
+ dataKeys_App1_Init_import,
+ sizeof(dataKeys_App1_Init_import)/sizeof(dataKeys_App1_Init_import[0]),
+ dataFiles_App1_Init_import,
+ sizeof(dataFiles_App1_Init_import)/sizeof(dataFiles_App1_Init_import[0])
+} ;
+
+dataInit_s s_App1_DataInit_import_wt =
+{
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1/",
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App1_init_import,
+ sizeof(RCT_App1_init_import)/sizeof(RCT_App1_init_import[0]),
+ dataKeys_App1_Init_import,
+ sizeof(dataKeys_App1_Init_import)/sizeof(dataKeys_App1_Init_import[0]),
+ dataFiles_App1_Init_import_wt,
+ sizeof(dataFiles_App1_Init_import_wt)/sizeof(dataFiles_App1_Init_import_wt[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+#ifndef USE_REF_RCT
+entryRctInit_s RCT_App2_init_import[] =
+{
+ {"/App2_SettingK", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/App2_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/App2_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/App2_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/App2_SettingL", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/App2_Setting/KBL", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/App2_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/App2_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/App2_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/App2_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/App2_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/docK.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"/Docs/docC.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}}
+} ;
+#else
+ static entryRctInit_s RCT_App2_init_import[] =
+ {
+ {"App2_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}}
+ } ;
+#endif
+
+entryDataInit_s dataKeys_App2_Init_import[] =
+{
+// {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingK", PersistencePolicy_wt, 0, 0, "Data>>/App2_SettingK"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/App2_SettingB::user2::seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/App2_SettingB::user2:seat2"},
+// {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingL", PersistencePolicy_wt, 0, 0, "Data>>/App2_SettingL"},
+// {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/KBL", PersistencePolicy_wt, 1, 0, "Data>>/App2_Setting/KBL::user1"},
+// {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/KBL", PersistencePolicy_wt, 2, 0, "Data>>/App2_Setting/KBL::user2"},
+// {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/KBL", PersistencePolicy_wt, 3, 0, "Data>>/App2_Setting/KBL::user3"},
+// {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/KBL", PersistencePolicy_wt, 4, 0, "Data>>/App2_Setting/KBL::user4"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/App2_SettingD"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/App2_SettingE::user2:seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/App2_SettingE::user2:seat2"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/App2_SettingF"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/App2_Setting/DEF::user1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/App2_Setting/DEF::user2"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/App2_Setting/DEF::user3"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/App2_Setting/DEF::user4"}
+} ;
+
+entryDataInit_s dataFiles_App2_Init_import[] =
+{
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>App2>>/doc1.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>App2>>/Docs/doc2.txt"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>App2>>/docK.txt::user1"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>App2>>/docK.txt::user2"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>App2>>/docK.txt::user3"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>App2>>/docK.txt::user4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>App2>>/docB.txt::user2:seat1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>App2>>/docB.txt::user2:seat2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>App2>>/docB.txt::user2:seat3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docB.txt::user2:seat4"}
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docC.txt::user2:seat4"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docD.txt::user2:seat4"}
+};
+
+entryDataInit_s dataFiles_App2_Init_import_wt[] =
+{
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>App2>>/doc1.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>App2>>/Docs/doc2.txt"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>App2>>/docK.txt::user1"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>App2>>/docK.txt::user2"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>App2>>/docK.txt::user3"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>App2>>/docK.txt::user4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>App2>>/docB.txt::user2:seat1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>App2>>/docB.txt::user2:seat2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>App2>>/docB.txt::user2:seat3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docB.txt::user2:seat4"}
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docC.txt::user2:seat4"},
+// {0xFF, IMPORT_LOCATION PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docD.txt::user2:seat4"}
+};
+
+dataInit_s s_App2_DataInit_import =
+{
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/",
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App2_init_import,
+ sizeof(RCT_App2_init_import)/sizeof(RCT_App2_init_import[0]),
+ dataKeys_App2_Init_import,
+ sizeof(dataKeys_App2_Init_import)/sizeof(dataKeys_App2_Init_import[0]),
+ dataFiles_App2_Init_import,
+ sizeof(dataFiles_App2_Init_import)/sizeof(dataFiles_App2_Init_import[0])
+} ;
+
+dataInit_s s_App2_DataInit_import_wt =
+{
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2/",
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App2_init_import,
+ sizeof(RCT_App2_init_import)/sizeof(RCT_App2_init_import[0]),
+ dataKeys_App2_Init_import,
+ sizeof(dataKeys_App2_Init_import)/sizeof(dataKeys_App2_Init_import[0]),
+ dataFiles_App2_Init_import_wt,
+ sizeof(dataFiles_App2_Init_import_wt)/sizeof(dataFiles_App2_Init_import_wt[0])
+} ;
+
+
+/**
+ * @brief Saves files together into a single archive.
+ * @usage persadmin_compress("/path/to/compress/to/archive_name.tgz", "/path/from/where/to/compress")
+ * @return 0 for success, negative value otherwise.
+ */
+static sint_t persadmin_compress(pstr_t compressTo, pstr_t compressFrom)
+{
+ uint8_t buffer [READ_BUFFER_LENGTH];
+ str_t pchParentPath [PATH_ABS_MAX_SIZE];
+ pstr_t pchStrPos = NIL;
+ struct archive *psArchive = NIL;
+ struct archive *psDisk = NIL;
+ struct archive_entry *psEntry = NIL;
+ sint_t s32Result = ARCHIVE_OK;
+ sint_t s32Length = 0;
+ sint_t fd;
+ sint_t s32ParentPathLength = 0;
+
+
+ if( (NIL == compressTo) ||
+ (NIL == compressFrom) )
+ {
+ s32Result = ARCHIVE_FAILED;
+ printf("persadmin_compress - invalid parameters \n");
+ }
+
+ if( ARCHIVE_OK == s32Result )
+ {
+ printf("persadmin_compress - create <%s> from <%s>\n", compressTo, compressFrom);
+ psArchive = archive_write_new();
+ if( NIL == psArchive )
+ {
+ s32Result = ARCHIVE_FAILED;
+ printf("persadmin_compress - archive_write_new ERR\n");
+ }
+ }
+
+ if( ARCHIVE_OK == s32Result )
+ {
+ /* this in turn calls archive_write_add_filter_gzip; */
+ s32Result = archive_write_set_compression_gzip(psArchive);
+ if( ARCHIVE_OK != s32Result )
+ {
+ printf("persadmin_compress - archive_write_set_compression_gzip ERR %d\n", s32Result);
+ }
+ }
+
+ if( ARCHIVE_OK == s32Result )
+ {
+ /* portable archive exchange; */
+ archive_write_set_format_pax(psArchive);
+ compressTo = (strcmp(compressTo, "-") == 0) ? NIL : compressTo;
+ s32Result = archive_write_open_filename(psArchive, compressTo);
+ if( ARCHIVE_OK != s32Result )
+ {
+ printf("persadmin_compress - archive_write_open_filename ERR %d\n", s32Result);
+ }
+ }
+
+ if( ARCHIVE_OK == s32Result )
+ {
+ psDisk = archive_read_disk_new();
+ if( NIL == psDisk )
+ {
+ s32Result = ARCHIVE_FAILED;
+ printf("persadmin_compress - archive_read_disk_new ERR\n");
+ }
+ }
+
+ if( ARCHIVE_OK == s32Result )
+ {
+ archive_read_disk_set_standard_lookup(psDisk);
+ s32Result = archive_read_disk_open(psDisk, compressFrom);
+ if( ARCHIVE_OK != s32Result )
+ {
+ printf("persadmin_compress - archive_read_disk_new ERR %s\n", archive_error_string(psDisk));
+ }
+ }
+
+ memset(pchParentPath, 0, sizeof(pchParentPath));
+ snprintf(pchParentPath, sizeof(pchParentPath), compressFrom);
+ pchStrPos = strrchr(pchParentPath, '/');
+ if(NIL != pchStrPos)
+ {
+ *pchStrPos = '\0';
+ }
+ s32ParentPathLength = strlen(pchParentPath);
+
+
+ while( ARCHIVE_OK == s32Result )
+ {
+ psEntry = archive_entry_new();
+ s32Result = archive_read_next_header2(psDisk, psEntry);
+
+ switch( s32Result )
+ {
+ case ARCHIVE_EOF:
+ {
+ /* nothing else to do; */
+ break;
+ }
+ case ARCHIVE_OK:
+ {
+ str_t pstrTemp[PATH_ABS_MAX_SIZE];
+ pstr_t p = archive_entry_pathname(psEntry);
+ if(NIL != p)
+ {
+ /* remove parent section and save relative pathnames */
+ memset(pstrTemp, 0, sizeof(pstrTemp));
+ snprintf(pstrTemp, sizeof(pstrTemp), "%s", p + (s32ParentPathLength + 1));
+ archive_entry_copy_pathname(psEntry, pstrTemp);
+ }
+
+ archive_read_disk_descend(psDisk);
+ s32Result = archive_write_header(psArchive, psEntry);
+ if( ARCHIVE_OK > s32Result)
+ {
+ printf("persadmin_compress - archive_write_header ERR %s\n", archive_error_string(psArchive));
+ }
+ if( ARCHIVE_FATAL == s32Result )
+ {
+ /* exit; */
+ printf("persadmin_compress - archive_write_header ERR FATAL\n");
+ }
+ if( ARCHIVE_FAILED < s32Result )
+ {
+#if 0
+ /* Ideally, we would be able to use
+ * the same code to copy a body from
+ * an archive_read_disk to an
+ * archive_write that we use for
+ * copying data from an archive_read
+ * to an archive_write_disk.
+ * Unfortunately, this doesn't quite
+ * work yet. */
+ persadmin_copy_data(psDisk, psArchive);
+#else
+
+ /* For now, we use a simpler loop to copy data
+ * into the target archive. */
+ fd = open(archive_entry_sourcepath(psEntry), O_RDONLY);
+ s32Length = read(fd, buffer, READ_BUFFER_LENGTH);
+ while( s32Length > 0 )
+ {
+ archive_write_data(psArchive, buffer, s32Length);
+ s32Length = read(fd, buffer, READ_BUFFER_LENGTH);
+ }
+ close(fd);
+#endif
+ }
+
+ break;
+ }
+ default:
+ {
+ printf("persadmin_compress - archive_read_next_header2 ERR %s\n", archive_error_string(psDisk));
+ /* exit; */
+ break;
+ }
+ }
+
+ if( NIL != psEntry )
+ {
+ archive_entry_free(psEntry);
+ }
+ }
+
+ /* perform cleaning operations; */
+ if( NIL != psDisk )
+ {
+ archive_read_close(psDisk);
+ archive_read_free(psDisk);
+ }
+
+ if( NIL != psArchive )
+ {
+ archive_write_close(psArchive);
+ archive_write_free(psArchive);
+ }
+
+ /* overwrite result; */
+ s32Result = (s32Result == ARCHIVE_EOF) ? ARCHIVE_OK : s32Result;
+ /* return result; */
+ return s32Result;
+
+} /* persadmin_compress() */
+
+
+//reset import tree
+bool_t ResetImportData(PersASSelectionType_e type)
+{
+ bool_t bEverythingOK = true ;
+ sint_t sResult = 0;
+ pstr_t referenceDataPath = BACKUP_CONTENT_FOLDER;
+ str_t pchPathCompressTo [PATH_ABS_MAX_SIZE];
+ str_t pchPathCompressFrom [PATH_ABS_MAX_SIZE];
+ long lRetVal = 0;
+
+ sint_t result = DeleteFolder(referenceDataPath);
+ printf("\nDeleteFolder(%s) returned %d\n", referenceDataPath, result) ;
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+
+ if(bEverythingOK)
+ {
+ dataInit_s* sDataInit[] =
+ {
+ //TODO : create predefined imported data to be used here
+ &sSharedPubDataInit_import,
+ &sShared_Group10_DataInit_import,
+ &sShared_Group20_DataInit_import,
+ &s_App1_DataInit_import,
+ &s_App2_DataInit_import
+ };
+
+ sint_t i = 0 ;
+ for(i = 0 ; i < sizeof(sDataInit)/sizeof(sDataInit[0]) ; i++)
+ {
+ if(! InitDataFolder(sDataInit[i]))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ dataInit_s* sDataInit[] =
+ {
+ //TODO : create predefined imported data to be used here
+ &sSharedPubDataInit_import_wt,
+ &sShared_Group10_DataInit_import_wt,
+ &sShared_Group20_DataInit_import_wt,
+ &s_App1_DataInit_import_wt,
+ &s_App2_DataInit_import_wt
+ };
+
+ sint_t i = 0 ;
+ for(i = 0 ; i < sizeof(sDataInit)/sizeof(sDataInit[0]) ; i++)
+ {
+ if(! InitDataFolder(sDataInit[i]))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ /* compress the source folder and delete it afterwards */
+ (void)snprintf(pchPathCompressFrom, sizeof(pchPathCompressFrom), "%s", BACKUP_CONTENT_FOLDER);
+
+ /* create the tar name; */
+ switch( type )
+ {
+ case PersASSelectionType_Application:
+ {
+ (void)snprintf(pchPathCompressTo, sizeof(pchPathCompressTo), "%s%s%s", BACKUP_FOLDER_, "App1", BACKUP_FORMAT);
+ sResult = persadmin_compress(pchPathCompressTo, pchPathCompressFrom);
+ if( 0 > sResult )
+ {
+ bEverythingOK = false;
+ break;
+ }
+
+ (void)snprintf(pchPathCompressTo, sizeof(pchPathCompressTo), "%s%s%s", BACKUP_FOLDER_, "App2", BACKUP_FORMAT);
+ sResult = persadmin_compress(pchPathCompressTo, pchPathCompressFrom);
+ if( 0 > sResult )
+ {
+ bEverythingOK = false;
+ break;
+ }
+
+ break;
+ }
+ case PersASSelectionType_User:
+ {
+ (void)snprintf(pchPathCompressTo, sizeof(pchPathCompressTo), "%s%s%s", BACKUP_FOLDER_, "user", BACKUP_FORMAT);
+ sResult = persadmin_compress(pchPathCompressTo, pchPathCompressFrom);
+ if( 0 > sResult )
+ {
+ bEverythingOK = false;
+ }
+ break;
+ }
+ case PersASSelectionType_All:
+ {
+ (void)snprintf(pchPathCompressTo, sizeof(pchPathCompressTo), "%s%s%s", BACKUP_FOLDER_, "all", BACKUP_FORMAT);
+ sResult = persadmin_compress(pchPathCompressTo, pchPathCompressFrom);
+ if( 0 > sResult )
+ {
+ bEverythingOK = false;
+ }
+ break;
+ }
+ default:
+ {
+ bEverythingOK = false;
+ /* nothing to do */
+ break;
+ }
+ }
+
+ if(true == bEverythingOK)
+ {
+ /* remove the initial folder content */
+ DeleteFolder(referenceDataPath);
+ }
+
+ return bEverythingOK ;
+}
diff --git a/test/pers_svc_test/src/test_pas_import_user.c b/test/pers_svc_test/src/test_pas_import_user.c
new file mode 100644
index 0000000..d3589b3
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_import_user.c
@@ -0,0 +1,170 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+#include "stdio.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_import.h"
+
+#define LT_HDR "TEST_PAS >> "
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define PATH_ABS_MAX_SIZE ( 512)
+
+expected_key_data_localDB_s expected_key_data_after_import_all_user[] =
+{
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingB", sizeof("Data>>/pubSettingB")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1" , sizeof ("Data>>/pubSettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2" , sizeof ("Data>>/pubSettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD" , sizeof ("Data>>/pubSettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1" , sizeof ("Data>>/pubSettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2" , sizeof ("Data>>/pubSettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF" , sizeof ("Data>>/pubSettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1" , sizeof ("Data>>/pubSetting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2" , sizeof ("Data>>/pubSetting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3" , sizeof ("Data>>/pubSetting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4" , sizeof ("Data>>/pubSetting/DEF::user4" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1" , sizeof ("Data>>/gr10_SettingB::user2::seat1" )},
+
+ { PERS_ORG_USER_FOLDER_NAME_"1"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user1:seat1" , sizeof ("Data>>/gr10_SettingB::user1:seat1" )},
+
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2" , sizeof ("Data>>/gr10_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD" , sizeof ("Data>>/gr10_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1" , sizeof ("Data>>/gr10_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2" , sizeof ("Data>>/gr10_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF" , sizeof ("Data>>/gr10_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1" , sizeof ("Data>>/gr10_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2" , sizeof ("Data>>/gr10_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3" , sizeof ("Data>>/gr10_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4" , sizeof ("Data>>/gr10_Setting/DEF::user4" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1" , sizeof ("Data>>/gr20_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2" , sizeof ("Data>>/gr20_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingD" , sizeof ("Data>>/gr20_SettingD" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1" , sizeof ("Data>>/gr20_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2" , sizeof ("Data>>/gr20_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingF" , sizeof ("Data>>/gr20_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1" , sizeof ("Data>>/gr20_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2" , sizeof ("Data>>/gr20_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3" , sizeof ("Data>>/gr20_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4" , sizeof ("Data>>/gr20_Setting/DEF::user4" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1" , sizeof("Data>>/App1_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2" , sizeof("Data>>/App1_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD" , sizeof("Data>>/App1_SettingD" )},
+ //key in original data, not present in import set
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingD" , sizeof("Data>>/App1_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1" , sizeof("Data>>/App1_SettingE::user2:seat1" )},
+ //key in original data, not present in import set
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingB::user2:seat1" , sizeof("Data>>/App1_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2" , sizeof("Data>>/App1_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF" , sizeof("Data>>/App1_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1" , sizeof("Data>>/App1_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2" , sizeof("Data>>/App1_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3" , sizeof("Data>>/App1_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4" , sizeof("Data>>/App1_Setting/DEF::user4" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1" , sizeof("Data>>/App2_SettingB::user2::seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2" , sizeof("Data>>/App2_SettingB::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD" , sizeof("Data>>/App2_SettingD" )},
+ //key in original data, not present in import set
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingD" , sizeof("Data>>/App2_SettingA" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1" , sizeof("Data>>/App2_SettingE::user2:seat1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2" , sizeof("Data>>/App2_SettingE::user2:seat2" )},
+ //key in original data, not present in import set
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2" , sizeof("Data>>/App2_SettingE::user2:seat2" )},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF" , sizeof("Data>>/App2_SettingF" )},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1" , sizeof("Data>>/App2_Setting/DEF::user1" )},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2" , sizeof("Data>>/App2_Setting/DEF::user2" )},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3" , sizeof("Data>>/App2_Setting/DEF::user3" )},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4" , sizeof("Data>>/App2_Setting/DEF::user4" )}
+};
+
+expected_file_data_s expected_file_data_after_import_all_user[] =
+{
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true, "File>>/doc1.txt" , sizeof( "File>>/doc1.txt" ) },
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt" , sizeof( "File>>/Docs/doc2.txt" ) },
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof( "File>>/docB.txt::user2:seat1" ) },
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof( "File>>/docB.txt::user2:seat2" ) },
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof( "File>>/docB.txt::user2:seat3" ) },
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof( "File>>/docB.txt::user2:seat4" ) },
+
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt" , sizeof ( "File>>gr10_>>/gr10_1.txt" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof ( "File>>gr10_>>/Docs/gr10_A.txt" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1", sizeof ( "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2", sizeof ( "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3", sizeof ( "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4", sizeof ( "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" ) },
+
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>gr20_>>/doc1.txt" , sizeof ( "File>>gr20_>>/doc1.txt" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>gr20_>>/Docs/doc2.txt" , sizeof ( "File>>gr20_>>/Docs/doc2.txt" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof ( "File>>gr20_>>/docB.txt::user2:seat1" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof ( "File>>gr20_>>/docB.txt::user2:seat2" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof ( "File>>gr20_>>/docB.txt::user2:seat3" ) },
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof ( "File>>gr20_>>/docB.txt::user2:seat4" ) },
+
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" ) },
+
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3" ) },
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4" ) },
+ //{ PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/doc1.txt", true, "File>>gr10_>>/doc1.txt::user2:seat4" , sizeof("File>>gr10_>>/doc1.txt::user2:seat4" ) },
+
+};
+
+bool_t Test_import_all_user(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long impBytes = -1;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ bEverythingOK = ResetImportData(PersASSelectionType_User);
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "all", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Import from:"),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ impBytes = persAdminDataFolderImport(PersASSelectionType_User, pchBackupFilePath );
+
+ bEverythingOK = (impBytes >= 0)?true:false;
+ }
+
+ printf("\nTest_import_all - %s \n", bEverythingOK ? "OK" : "FAILED") ;
+
+ return bEverythingOK ;
+}
diff --git a/test/pers_svc_test/src/test_pas_recovery_All.c b/test/pers_svc_test/src/test_pas_recovery_All.c
new file mode 100644
index 0000000..8512b08
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_recovery_All.c
@@ -0,0 +1,319 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_backup_recovery.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+// using default structure offered by test framework
+
+//===================================================================================================================
+// BACKUP CONTENT
+//===================================================================================================================
+// using a common backup content structure
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_All[23 + 24 + 48 + 44] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingK", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingK", sizeof("Data>>/pubSettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingL", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingL", sizeof("Data>>/pubSettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/KBL::user1", sizeof("Data>>/pubSetting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/KBL::user2", sizeof("Data>>/pubSetting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/KBL::user3", sizeof("Data>>/pubSetting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/KBL::user4", sizeof("Data>>/pubSetting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/XYZ", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/XYZ::user4", sizeof("Data>>/pubSetting/XYZ::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingK", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingK", sizeof("Data>>/gr10_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingL", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingL", sizeof("Data>>/gr10_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user1", sizeof("Data>>/gr10_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user2", sizeof("Data>>/gr10_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user3", sizeof("Data>>/gr10_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user4", sizeof("Data>>/gr10_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingZ", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingZ", sizeof("Data>>/gr10_SettingZ")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/PRT", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/PRT::user4", sizeof("Data>>/gr10_Setting/PRT::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingK", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingK", sizeof("Data>>/App1_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingL", sizeof("Data>>/App1_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user1", sizeof("Data>>/App1_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user2", sizeof("Data>>/App1_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user3", sizeof("Data>>/App1_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user4", sizeof("Data>>/App1_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KKK", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/KKK::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/XYZ", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/XYZ::user4")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingK", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingK", sizeof("Data>>/App1_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingL", sizeof("Data>>/App1_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/KBL::user1", sizeof("Data>>/App1_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/KBL::user2", sizeof("Data>>/App1_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/KBL::user3", sizeof("Data>>/App1_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/KBL::user4", sizeof("Data>>/App1_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KKK", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/KKK::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/XYZ", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/XYZ::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingK", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingK", sizeof("Data>>/App2_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingL", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingL", sizeof("Data>>/App2_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/KBL::user1", sizeof("Data>>/App2_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/KBL::user2", sizeof("Data>>/App2_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/KBL::user3", sizeof("Data>>/App2_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/KBL::user4", sizeof("Data>>/App2_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingK", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingK", sizeof("Data>>/App2_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingL", sizeof("Data>>/App2_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/KBL::user1", sizeof("Data>>/App2_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/KBL::user2", sizeof("Data>>/App2_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/KBL::user3", sizeof("Data>>/App2_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/KBL", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/KBL::user4", sizeof("Data>>/App2_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")}
+} ;
+
+expected_file_data_s expected_file_data_after_restore_All[16 + 16 + 16] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true, "File>>/doc1.txt" , sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", false,"File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", false,"File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", false,"File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", false,"File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docK.txt", true, "File>>/docK.txt::user1" , sizeof("File>>/docK.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docK.txt", true, "File>>/docK.txt::user2" , sizeof("File>>/docK.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docT.txt", true, "File>>/docT.txt::user2" , sizeof("File>>/docT.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docK.txt", true, "File>>/docK.txt::user3" , sizeof("File>>/docK.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docK.txt", true, "File>>/docK.txt::user4" , sizeof("File>>/docK.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", true, "File>>/docC.txt::user2:seat4" , sizeof("File>>/docC.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false,"File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false,"File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false,"File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false,"File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>App1>>/docK.txt::user1" , sizeof("File>>App1>>/docK.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>App1>>/docK.txt::user2" , sizeof("File>>App1>>/docK.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>App1>>/docK.txt::user3" , sizeof("File>>App1>>/docK.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>App1>>/docK.txt::user4" , sizeof("File>>App1>>/docK.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", true, "File>>App1>>/docC.txt::user2:seat4" , sizeof("File>>App1>>/docC.txt::user2:seat4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", true, "File>>App1>>/docD.txt::user2:seat4" , sizeof("File>>App1>>/docD.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false,"File>>App2>>/docA.txt::user1" , sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false,"File>>App2>>/docA.txt::user2" , sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false,"File>>App2>>/docA.txt::user3" , sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false,"File>>App2>>/docA.txt::user4" , sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>App2>>/docK.txt::user1" , sizeof("File>>App2>>/docK.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>App2>>/docK.txt::user2" , sizeof("File>>App2>>/docK.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>App2>>/docK.txt::user3" , sizeof("File>>App2>>/docK.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>App2>>/docK.txt::user4" , sizeof("File>>App2>>/docK.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", true, "File>>App2>>/docC.txt::userC:seat4" , sizeof("File>>App2>>/docC.txt::userC:seat4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", true, "File>>App2>>/docD.txt::userC:seat4" , sizeof("File>>App2>>/docD.txt::userC:seat4")}
+} ;
+
+
+//===================================================================================================================
+
+
+bool_t Test_Recover_All(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lTemp ;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Reset the backup data for every test */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Reset backup content..."));
+
+ lTemp = ResetBackupContent(PersASSelectionType_All, NULL);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_All: ResetBackupContent() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "all", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ lTemp = persAdminDataBackupRecovery( PersASSelectionType_All,
+ pchBackupFilePath,
+ "",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_All: data_backup_recovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ return bEverythingOK ;
+} /* Test_Recover_All */
diff --git a/test/pers_svc_test/src/test_pas_recovery_AllInitialContent.c b/test/pers_svc_test/src/test_pas_recovery_AllInitialContent.c
new file mode 100644
index 0000000..a01d901
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_recovery_AllInitialContent.c
@@ -0,0 +1,568 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_backup_recovery.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+#define PATH_ABS_MAX_SIZE ( 512)
+
+#define File_t PersistenceResourceType_file
+#define Key_t PersistenceResourceType_key
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+
+/**********************************************************************************************************************************************
+***************************************** public *******************************************************************************************
+*********************************************************************************************************************************************/
+
+static entryRctInit_s RCT_public_init[] =
+{
+ {"pubSettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}}
+};
+
+static entryDataInit_s dataKeysPublicInit[] = {};
+
+static entryDataInit_s dataFilesPublicInit[] = {};
+
+static dataInit_s sSharedPubDataInit =
+{
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ ,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_public_init,
+ sizeof(RCT_public_init)/sizeof(RCT_public_init[0]),
+ dataKeysPublicInit,
+ sizeof(dataKeysPublicInit)/sizeof(dataKeysPublicInit[0]),
+ dataFilesPublicInit,
+ sizeof(dataFilesPublicInit)/sizeof(dataFilesPublicInit[0])
+};
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+
+static entryRctInit_s RCT_group10_init[] =
+{
+ {"gr10_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_A.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_2.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_B.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}}} ;
+
+static entryDataInit_s dataKeys_Group10_Init[] = {};
+
+static entryDataInit_s dataFiles_Group10_Init[] = {};
+
+static dataInit_s sShared_Group10_DataInit =
+{
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group10_init,
+ sizeof(RCT_group10_init)/sizeof(RCT_group10_init[0]),
+ dataKeys_Group10_Init,
+ sizeof(dataKeys_Group10_Init)/sizeof(dataKeys_Group10_Init[0]),
+ dataFiles_Group10_Init,
+ sizeof(dataFiles_Group10_Init)/sizeof(dataFiles_Group10_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_group20_init[] =
+{
+ {"gr20_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_Group20_Init[] = {};
+
+static entryDataInit_s dataFiles_Group20_Init[] ={};
+
+static dataInit_s sShared_Group20_DataInit =
+{
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group20_init,
+ sizeof(RCT_group20_init)/sizeof(RCT_group20_init[0]),
+ dataKeys_Group20_Init,
+ sizeof(dataKeys_Group20_Init)/sizeof(dataKeys_Group20_Init[0]),
+ dataFiles_Group20_Init,
+ sizeof(dataFiles_Group20_Init)/sizeof(dataFiles_Group20_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_App1_init[] =
+{
+ {"App1_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_App1_Init[] = {} ;
+
+static entryDataInit_s dataFiles_App1_Init[] = {};
+
+static dataInit_s s_App1_DataInit =
+{
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App1_init,
+ sizeof(RCT_App1_init)/sizeof(RCT_App1_init[0]),
+ dataKeys_App1_Init,
+ sizeof(dataKeys_App1_Init)/sizeof(dataKeys_App1_Init[0]),
+ dataFiles_App1_Init,
+ sizeof(dataFiles_App1_Init)/sizeof(dataFiles_App1_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_App2_init[] =
+{
+ {"App2_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_App2_Init[] = {};
+
+static entryDataInit_s dataFiles_App2_Init[] = {};
+
+static dataInit_s s_App2_DataInit =
+{
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App2_init,
+ sizeof(RCT_App2_init)/sizeof(RCT_App2_init[0]),
+ dataKeys_App2_Init,
+ sizeof(dataKeys_App2_Init)/sizeof(dataKeys_App2_Init[0]),
+ dataFiles_App2_Init,
+ sizeof(dataFiles_App2_Init)/sizeof(dataFiles_App2_Init[0])
+} ;
+
+
+//===================================================================================================================
+// BACKUP CONTENT
+//===================================================================================================================
+// the backup content is obtained trough the backup process
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_All_InitialContent[16 + 16 + 16 + 32+ 32] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")}
+} ;
+
+expected_file_data_s expected_file_data_after_restore_All_InitialContent[10 + 10 + 10 + 10 + 10] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true, "File>>/doc1.txt" , sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", true, "File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", true, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", true, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", true, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt")},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App2>>/docA.txt::user1" , sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App2>>/docA.txt::user2" , sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App2>>/docA.txt::user3" , sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App2>>/docA.txt::user4" , sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4")}
+} ;
+
+
+//===================================================================================================================
+
+static bool_t EraseReferenceData(void)
+{
+ bool_t bEverythingOK = true ;
+ pstr_t referenceDataPath = PERS_ORG_LOCAL_APP_CACHE_PATH_ ;
+
+ sint_t result = DeleteFolderContent(referenceDataPath) ;
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+
+ if(bEverythingOK)
+ {
+ dataInit_s* sDataInit[] =
+ {
+ &sSharedPubDataInit,
+ &sShared_Group10_DataInit,
+ &sShared_Group20_DataInit,
+ &s_App1_DataInit,
+ &s_App2_DataInit
+ };
+
+ sint_t i = 0 ;
+ for(i = 0 ; i < sizeof(sDataInit)/sizeof(sDataInit[0]) ; i++)
+ {
+ if(! InitDataFolder(sDataInit[i]))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+
+bool_t Test_Recover_All_InitialContent(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lTemp ;
+
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Create backup */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Create backup to : "),
+ DLT_STRING(BACKUP_FOLDER),
+ DLT_STRING("..."));
+ lTemp = persAdminDataBackupCreate( PersASSelectionType_All,
+ BACKUP_FOLDER,
+ "",
+ USER_DONT_CARE,
+ SEAT_DONT_CARE);
+
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_All_InitialContent: persAdminDataBackupCreate() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+ if(true == bEverythingOK)
+ {
+ DeleteFolder(BACKUP_CONTENT_FOLDER);
+
+
+ /* Reset the destination content (except the RCT files) */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Erase reference data..."));
+
+ bEverythingOK = EraseReferenceData();
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_All_InitialContent: EraseReferenceData() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "all", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ lTemp = persAdminDataBackupRecovery( PersASSelectionType_All,
+ pchBackupFilePath,
+ "",
+ USER_DONT_CARE,
+ SEAT_DONT_CARE);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_All_InitialContent: data_backup_recovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ return bEverythingOK ;
+} /* Test_Recover_All_InitialContent */
diff --git a/test/pers_svc_test/src/test_pas_recovery_App1.c b/test/pers_svc_test/src/test_pas_recovery_App1.c
new file mode 100644
index 0000000..55803d4
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_recovery_App1.c
@@ -0,0 +1,137 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <stdio.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_backup_recovery.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+// using default structure offered by test framework
+
+//===================================================================================================================
+// BACKUP CONTENT
+//===================================================================================================================
+// using a common backup content structure
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_App1[24] =
+{
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingK", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingK", sizeof("Data>>/App1_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingL", sizeof("Data>>/App1_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user1", sizeof("Data>>/App1_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user2", sizeof("Data>>/App1_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user3", sizeof("Data>>/App1_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user4", sizeof("Data>>/App1_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KKK", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/KKK::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/XYZ", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/XYZ::user4")},
+};
+
+expected_file_data_s expected_file_data_after_restore_App1[16] =
+{
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false,"File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false,"File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false,"File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false,"File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>App1>>/docK.txt::user1" , sizeof("File>>App1>>/docK.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>App1>>/docK.txt::user2" , sizeof("File>>App1>>/docK.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>App1>>/docK.txt::user3" , sizeof("File>>App1>>/docK.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>App1>>/docK.txt::user4" , sizeof("File>>App1>>/docK.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", true, "File>>App1>>/docC.txt::user2:seat4" , sizeof("File>>App1>>/docC.txt::user2:seat4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", true, "File>>App1>>/docD.txt::user2:seat4" , sizeof("File>>App1>>/docD.txt::user2:seat4" )}
+} ;
+//===================================================================================================================
+
+
+bool_t Test_Recover_App1(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lTemp ;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Reset the backup data for every test */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Reset backup content..."));
+
+ lTemp = ResetBackupContent(PersASSelectionType_Application, "App1");
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_App1: ResetBackupContent() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "App1", BACKUP_FORMAT);
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ lTemp = persAdminDataBackupRecovery( PersASSelectionType_Application,
+ pchBackupFilePath,
+ "App1",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_App1: persAdminDataBackupRecovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ return bEverythingOK ;
+} /* Test_Recover_App1 */
diff --git a/test/pers_svc_test/src/test_pas_recovery_App1InitialContent.c b/test/pers_svc_test/src/test_pas_recovery_App1InitialContent.c
new file mode 100644
index 0000000..9a3abba
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_recovery_App1InitialContent.c
@@ -0,0 +1,625 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_backup_recovery.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+#define PATH_ABS_MAX_SIZE ( 512)
+
+#define File_t PersistenceResourceType_file
+#define Key_t PersistenceResourceType_key
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+
+/**********************************************************************************************************************************************
+***************************************** public *******************************************************************************************
+*********************************************************************************************************************************************/
+
+static entryRctInit_s RCT_public_init[] =
+{
+ {"pubSettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}}
+};
+
+static entryDataInit_s dataKeysPublicInit[] = {};
+
+static entryDataInit_s dataFilesPublicInit[] = {};
+
+static dataInit_s sSharedPubDataInit =
+{
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ ,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_public_init,
+ sizeof(RCT_public_init)/sizeof(RCT_public_init[0]),
+ dataKeysPublicInit,
+ sizeof(dataKeysPublicInit)/sizeof(dataKeysPublicInit[0]),
+ dataFilesPublicInit,
+ sizeof(dataFilesPublicInit)/sizeof(dataFilesPublicInit[0])
+};
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+
+static entryRctInit_s RCT_group10_init[] =
+{
+ {"gr10_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_A.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_2.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_B.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_Group10_Init[] = {};
+
+static entryDataInit_s dataFiles_Group10_Init[] = {};
+
+static dataInit_s sShared_Group10_DataInit =
+{
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group10_init,
+ sizeof(RCT_group10_init)/sizeof(RCT_group10_init[0]),
+ dataKeys_Group10_Init,
+ sizeof(dataKeys_Group10_Init)/sizeof(dataKeys_Group10_Init[0]),
+ dataFiles_Group10_Init,
+ sizeof(dataFiles_Group10_Init)/sizeof(dataFiles_Group10_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_group20_init[] =
+{
+ {"gr20_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_Group20_Init[] = {};
+
+static entryDataInit_s dataFiles_Group20_Init[] ={};
+
+static dataInit_s sShared_Group20_DataInit =
+{
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group20_init,
+ sizeof(RCT_group20_init)/sizeof(RCT_group20_init[0]),
+ dataKeys_Group20_Init,
+ sizeof(dataKeys_Group20_Init)/sizeof(dataKeys_Group20_Init[0]),
+ dataFiles_Group20_Init,
+ sizeof(dataFiles_Group20_Init)/sizeof(dataFiles_Group20_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_App1_init[] =
+{
+ {"App1_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_App1_Init[] = {} ;
+
+static entryDataInit_s dataFiles_App1_Init[] = {};
+
+static dataInit_s s_App1_DataInit =
+{
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App1_init,
+ sizeof(RCT_App1_init)/sizeof(RCT_App1_init[0]),
+ dataKeys_App1_Init,
+ sizeof(dataKeys_App1_Init)/sizeof(dataKeys_App1_Init[0]),
+ dataFiles_App1_Init,
+ sizeof(dataFiles_App1_Init)/sizeof(dataFiles_App1_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_App2_init[] =
+{
+ {"App2_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_App2_Init[] = {};
+
+static entryDataInit_s dataFiles_App2_Init[] = {};
+
+static dataInit_s s_App2_DataInit =
+{
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App2_init,
+ sizeof(RCT_App2_init)/sizeof(RCT_App2_init[0]),
+ dataKeys_App2_Init,
+ sizeof(dataKeys_App2_Init)/sizeof(dataKeys_App2_Init[0]),
+ dataFiles_App2_Init,
+ sizeof(dataFiles_App2_Init)/sizeof(dataFiles_App2_Init[0])
+} ;
+
+
+//===================================================================================================================
+// BACKUP CONTENT
+//===================================================================================================================
+// the backup content is obtained trough the backup process
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_App1_InitialContent[16 + 16 + 16 + 32+ 32] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")}
+} ;
+
+expected_file_data_s expected_file_data_after_restore_App1_InitialContent[10 + 10 + 10 + 10 + 10] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", false, "File>>/doc1.txt" , sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", false, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", false, "File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", false, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", false, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", false, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", false, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", false, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt")},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>App2>>/docA.txt::user1" , sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>App2>>/docA.txt::user2" , sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>App2>>/docA.txt::user3" , sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>App2>>/docA.txt::user4" , sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4")}
+} ;
+
+
+//===================================================================================================================
+
+static bool_t EraseReferenceData(void)
+{
+ bool_t bEverythingOK = true ;
+ pstr_t referenceDataPath = PERS_ORG_LOCAL_APP_CACHE_PATH_ ;
+
+ sint_t result = DeleteFolderContent(referenceDataPath) ;
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+
+ if(bEverythingOK)
+ {
+ dataInit_s* sDataInit[] =
+ {
+ &sSharedPubDataInit,
+ &sShared_Group10_DataInit,
+ &sShared_Group20_DataInit,
+ &s_App1_DataInit,
+ &s_App2_DataInit
+ };
+
+ sint_t i = 0 ;
+ for(i = 0 ; i < sizeof(sDataInit)/sizeof(sDataInit[0]) ; i++)
+ {
+ if(! InitDataFolder(sDataInit[i]))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+
+bool_t Test_Recover_App1_InitialContent_From_All(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+
+ long lTemp ;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Create backup */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Create backup to : "),
+ DLT_STRING(BACKUP_FOLDER),
+ DLT_STRING("..."));
+ lTemp = persAdminDataBackupCreate( PersASSelectionType_All,
+ BACKUP_FOLDER,
+ "",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_App1_InitialContent_From_All: persAdminDataBackupCreate() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ if(true == bEverythingOK)
+ {
+ DeleteFolder(BACKUP_CONTENT_FOLDER);
+
+
+ /* Reset the destination content (except the RCT files) */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Erase reference data..."));
+
+ bEverythingOK = EraseReferenceData();
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_App1_InitialContent_From_All: EraseReferenceData() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "all", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ lTemp = persAdminDataBackupRecovery( PersASSelectionType_Application,
+ pchBackupFilePath,
+ "App1",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_App1_InitialContent_From_All: data_backup_recovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+ return bEverythingOK ;
+} /* Test_Recover_App1_InitialContent_From_All */
+
+
+
+bool_t Test_Recover_App1_InitialContent_From_App1(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lTemp ;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Create backup */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Create backup to : "),
+ DLT_STRING(BACKUP_FOLDER),
+ DLT_STRING("..."));
+ lTemp = persAdminDataBackupCreate( PersASSelectionType_Application,
+ BACKUP_FOLDER,
+ "App1",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_App1_InitialContent_From_App1: persAdminDataBackupCreate() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+ if(true == bEverythingOK)
+ {
+ DeleteFolder(BACKUP_CONTENT_FOLDER);
+
+
+ /* Reset the destination content (except the RCT files) */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Erase reference data..."));
+
+ bEverythingOK = EraseReferenceData();
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_App1_InitialContent_From_App1: EraseReferenceData() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "App1", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ lTemp = persAdminDataBackupRecovery( PersASSelectionType_Application,
+ pchBackupFilePath,
+ "App1",
+ USER_DONT_CARE,
+ SEAT_DONT_CARE);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_App1_InitialContent_From_App1: data_backup_recovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+
+ return bEverythingOK ;
+} /* Test_Recover_App1_InitialContent_From_App1 */
diff --git a/test/pers_svc_test/src/test_pas_recovery_User1.c b/test/pers_svc_test/src/test_pas_recovery_User1.c
new file mode 100644
index 0000000..4e53971
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_recovery_User1.c
@@ -0,0 +1,139 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <stdio.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_backup_recovery.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+#define PATH_ABS_MAX_SIZE ( 512)
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+// using default structure offered by test framework
+
+
+//===================================================================================================================
+// BACKUP CONTENT
+//===================================================================================================================
+// using a common backup content structure
+
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+expected_key_data_localDB_s expected_App1_key_data_after_restore_User1[24] =
+{
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingK", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingK", sizeof("Data>>/App1_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingL", sizeof("Data>>/App1_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user1", sizeof("Data>>/App1_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/KBL::user2", sizeof("Data>>/App1_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/KBL::user3", sizeof("Data>>/App1_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/KBL::user4", sizeof("Data>>/App1_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KKK", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/KKK::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/XYZ", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/XYZ::user4")},
+};
+
+expected_file_data_s expected_App1_file_data_after_restore_User1[16] =
+{
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>App1>>/docK.txt::user1" , sizeof("File>>App1>>/docK.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", false, "File>>App1>>/docK.txt::user2" , sizeof("File>>App1>>/docK.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", false, "File>>App1>>/docK.txt::user3" , sizeof("File>>App1>>/docK.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", false, "File>>App1>>/docK.txt::user4" , sizeof("File>>App1>>/docK.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", false, "File>>App1>>/docC.txt::user2:seat4" , sizeof("File>>App1>>/docC.txt::user2:seat4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", false, "File>>App1>>/docD.txt::user2:seat4" , sizeof("File>>App1>>/docD.txt::user2:seat4" )}
+};
+//===================================================================================================================
+
+bool_t Test_Recover_User1(sint_t type, void* pv)
+{
+
+ bool_t bEverythingOK = true ;
+
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Reset the backup data for every test */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Reset backup content..."));
+
+ bEverythingOK = ResetBackupContent(PersASSelectionType_User, NULL) ;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User1: ResetBackupContent() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "user", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ bEverythingOK = persAdminDataBackupRecovery( PersASSelectionType_User,
+ pchBackupFilePath,
+ "",
+ 0x01,
+ PERSIST_SELECT_ALL_SEATS);
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User1: persAdminDataBackupRecovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ return bEverythingOK ;
+} /* Test_Recover_User1 */
diff --git a/test/pers_svc_test/src/test_pas_recovery_User1InitialContent.c b/test/pers_svc_test/src/test_pas_recovery_User1InitialContent.c
new file mode 100644
index 0000000..ad65054
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_recovery_User1InitialContent.c
@@ -0,0 +1,617 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_backup_recovery.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+#define File_t PersistenceResourceType_file
+#define Key_t PersistenceResourceType_key
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+
+/**********************************************************************************************************************************************
+***************************************** public *******************************************************************************************
+*********************************************************************************************************************************************/
+
+static entryRctInit_s RCT_public_init[] =
+{
+ {"pubSettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}}
+};
+
+static entryDataInit_s dataKeysPublicInit[] = {};
+
+static entryDataInit_s dataFilesPublicInit[] = {};
+
+static dataInit_s sSharedPubDataInit =
+{
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ ,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_public_init,
+ sizeof(RCT_public_init)/sizeof(RCT_public_init[0]),
+ dataKeysPublicInit,
+ sizeof(dataKeysPublicInit)/sizeof(dataKeysPublicInit[0]),
+ dataFilesPublicInit,
+ sizeof(dataFilesPublicInit)/sizeof(dataFilesPublicInit[0])
+};
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+
+static entryRctInit_s RCT_group10_init[] =
+{
+ {"gr10_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_A.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_2.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_B.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_Group10_Init[] = {};
+
+static entryDataInit_s dataFiles_Group10_Init[] = {};
+
+static dataInit_s sShared_Group10_DataInit =
+{
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group10_init,
+ sizeof(RCT_group10_init)/sizeof(RCT_group10_init[0]),
+ dataKeys_Group10_Init,
+ sizeof(dataKeys_Group10_Init)/sizeof(dataKeys_Group10_Init[0]),
+ dataFiles_Group10_Init,
+ sizeof(dataFiles_Group10_Init)/sizeof(dataFiles_Group10_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_group20_init[] =
+{
+ {"gr20_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_Group20_Init[] = {};
+
+static entryDataInit_s dataFiles_Group20_Init[] ={};
+
+static dataInit_s sShared_Group20_DataInit =
+{
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group20_init,
+ sizeof(RCT_group20_init)/sizeof(RCT_group20_init[0]),
+ dataKeys_Group20_Init,
+ sizeof(dataKeys_Group20_Init)/sizeof(dataKeys_Group20_Init[0]),
+ dataFiles_Group20_Init,
+ sizeof(dataFiles_Group20_Init)/sizeof(dataFiles_Group20_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_App1_init[] =
+{
+ {"App1_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_App1_Init[] = {} ;
+
+static entryDataInit_s dataFiles_App1_Init[] = {};
+
+static dataInit_s s_App1_DataInit =
+{
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App1_init,
+ sizeof(RCT_App1_init)/sizeof(RCT_App1_init[0]),
+ dataKeys_App1_Init,
+ sizeof(dataKeys_App1_Init)/sizeof(dataKeys_App1_Init[0]),
+ dataFiles_App1_Init,
+ sizeof(dataFiles_App1_Init)/sizeof(dataFiles_App1_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_App2_init[] =
+{
+ {"App2_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_App2_Init[] = {};
+
+static entryDataInit_s dataFiles_App2_Init[] = {};
+
+static dataInit_s s_App2_DataInit =
+{
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App2_init,
+ sizeof(RCT_App2_init)/sizeof(RCT_App2_init[0]),
+ dataKeys_App2_Init,
+ sizeof(dataKeys_App2_Init)/sizeof(dataKeys_App2_Init[0]),
+ dataFiles_App2_Init,
+ sizeof(dataFiles_App2_Init)/sizeof(dataFiles_App2_Init[0])
+} ;
+
+
+//===================================================================================================================
+// BACKUP CONTENT
+//===================================================================================================================
+// the backup content is obtained trough the backup process
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_User1_InitialContent[16 + 16 + 16 + 32+ 32] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")}
+} ;
+
+expected_file_data_s expected_file_data_after_restore_User1_InitialContent[10 + 10 + 10 + 10 + 10] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", false, "File>>/doc1.txt", sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", false, "File>>/Docs/doc2.txt", sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", true, "File>>/docA.txt::user1", sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", false, "File>>/docA.txt::user2", sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", false, "File>>/docA.txt::user3", sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", false, "File>>/docA.txt::user4", sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>/docB.txt::user2:seat1", sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>/docB.txt::user2:seat2", sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>/docB.txt::user2:seat3", sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>/docB.txt::user2:seat4", sizeof("File>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", false, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", false, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt", false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt", false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt", false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt", false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt")},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App2>>/docA.txt::user1" , sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>App2>>/docA.txt::user2" , sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>App2>>/docA.txt::user3" , sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>App2>>/docA.txt::user4" , sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4")}
+} ;
+
+
+//===================================================================================================================
+
+static bool_t EraseReferenceData(void)
+{
+ bool_t bEverythingOK = true ;
+ pstr_t referenceDataPath = PERS_ORG_LOCAL_APP_CACHE_PATH_ ;
+
+ sint_t result = DeleteFolderContent(referenceDataPath) ;
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+
+ if(bEverythingOK)
+ {
+ dataInit_s* sDataInit[] =
+ {
+ &sSharedPubDataInit,
+ &sShared_Group10_DataInit,
+ &sShared_Group20_DataInit,
+ &s_App1_DataInit,
+ &s_App2_DataInit
+ };
+
+ sint_t i = 0 ;
+ for(i = 0 ; i < sizeof(sDataInit)/sizeof(sDataInit[0]) ; i++)
+ {
+ if(! InitDataFolder(sDataInit[i]))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+
+bool_t Test_Recover_User1_InitialContent_From_All(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lTemp ;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Create backup */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Create backup to : "),
+ DLT_STRING(BACKUP_FOLDER),
+ DLT_STRING("..."));
+ lTemp = persAdminDataBackupCreate( PersASSelectionType_All,
+ BACKUP_FOLDER,
+ "",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User1_InitialContent_From_All: persAdminDataBackupCreate() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+ if(true == bEverythingOK)
+ {
+ DeleteFolder(BACKUP_CONTENT_FOLDER);
+
+
+ /* Reset the destination content (except the RCT files) */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Erase reference data..."));
+
+ bEverythingOK = EraseReferenceData();
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User1_InitialContent_From_All: EraseReferenceData() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "all", BACKUP_FORMAT);
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ lTemp = persAdminDataBackupRecovery( PersASSelectionType_User,
+ pchBackupFilePath,
+ "",
+ 0x01,
+ PERSIST_SELECT_ALL_SEATS);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User1_InitialContent_From_All: persAdminDataBackupRecovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ return bEverythingOK ;
+} /* Test_Recover_User1_InitialContent_From_All */
+
+
+bool_t Test_Recover_User1_InitialContent_From_User1(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lTemp ;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Create backup */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Create backup to : "),
+ DLT_STRING(BACKUP_FOLDER),
+ DLT_STRING("..."));
+ lTemp = persAdminDataBackupCreate( PersASSelectionType_User,
+ BACKUP_FOLDER,
+ "",
+ 0x01,
+ PERSIST_SELECT_ALL_SEATS);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User1_InitialContent_From_User1: data_backup_create() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+
+ if(true == bEverythingOK)
+ {
+ /* Reset the destination content (except the RCT files) */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Erase reference data..."));
+
+ bEverythingOK = EraseReferenceData();
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User1_InitialContent_From_User1: EraseReferenceData() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "user", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ lTemp = persAdminDataBackupRecovery( PersASSelectionType_User,
+ pchBackupFilePath,
+ "",
+ 0x01,
+ PERSIST_SELECT_ALL_SEATS);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User1_InitialContent_From_User1: data_backup_recovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ return bEverythingOK ;
+} /* Test_Recover_User1_InitialContent_From_User1 */
diff --git a/test/pers_svc_test/src/test_pas_recovery_User2Seat1InitialContent.c b/test/pers_svc_test/src/test_pas_recovery_User2Seat1InitialContent.c
new file mode 100644
index 0000000..eea1d7e
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_recovery_User2Seat1InitialContent.c
@@ -0,0 +1,620 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_backup_recovery.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+#define File_t PersistenceResourceType_file
+#define Key_t PersistenceResourceType_key
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+
+/**********************************************************************************************************************************************
+***************************************** public *******************************************************************************************
+*********************************************************************************************************************************************/
+
+static entryRctInit_s RCT_public_init[] =
+{
+ {"pubSettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}}
+};
+
+static entryDataInit_s dataKeysPublicInit[] = {};
+
+static entryDataInit_s dataFilesPublicInit[] = {};
+
+static dataInit_s sSharedPubDataInit =
+{
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ ,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_public_init,
+ sizeof(RCT_public_init)/sizeof(RCT_public_init[0]),
+ dataKeysPublicInit,
+ sizeof(dataKeysPublicInit)/sizeof(dataKeysPublicInit[0]),
+ dataFilesPublicInit,
+ sizeof(dataFilesPublicInit)/sizeof(dataFilesPublicInit[0])
+};
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+
+static entryRctInit_s RCT_group10_init[] =
+{
+ {"gr10_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_A.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_2.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_B.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_Group10_Init[] = {};
+
+static entryDataInit_s dataFiles_Group10_Init[] = {};
+
+static dataInit_s sShared_Group10_DataInit =
+{
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group10_init,
+ sizeof(RCT_group10_init)/sizeof(RCT_group10_init[0]),
+ dataKeys_Group10_Init,
+ sizeof(dataKeys_Group10_Init)/sizeof(dataKeys_Group10_Init[0]),
+ dataFiles_Group10_Init,
+ sizeof(dataFiles_Group10_Init)/sizeof(dataFiles_Group10_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_group20_init[] =
+{
+ {"gr20_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_Group20_Init[] = {};
+
+static entryDataInit_s dataFiles_Group20_Init[] ={};
+
+static dataInit_s sShared_Group20_DataInit =
+{
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group20_init,
+ sizeof(RCT_group20_init)/sizeof(RCT_group20_init[0]),
+ dataKeys_Group20_Init,
+ sizeof(dataKeys_Group20_Init)/sizeof(dataKeys_Group20_Init[0]),
+ dataFiles_Group20_Init,
+ sizeof(dataFiles_Group20_Init)/sizeof(dataFiles_Group20_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_App1_init[] =
+{
+ {"App1_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_App1_Init[] = {} ;
+
+static entryDataInit_s dataFiles_App1_Init[] = {};
+
+static dataInit_s s_App1_DataInit =
+{
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App1_init,
+ sizeof(RCT_App1_init)/sizeof(RCT_App1_init[0]),
+ dataKeys_App1_Init,
+ sizeof(dataKeys_App1_Init)/sizeof(dataKeys_App1_Init[0]),
+ dataFiles_App1_Init,
+ sizeof(dataFiles_App1_Init)/sizeof(dataFiles_App1_Init[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+static entryRctInit_s RCT_App2_init[] =
+{
+ {"App2_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}}
+} ;
+
+static entryDataInit_s dataKeys_App2_Init[] = {};
+
+static entryDataInit_s dataFiles_App2_Init[] = {};
+
+static dataInit_s s_App2_DataInit =
+{
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App2_init,
+ sizeof(RCT_App2_init)/sizeof(RCT_App2_init[0]),
+ dataKeys_App2_Init,
+ sizeof(dataKeys_App2_Init)/sizeof(dataKeys_App2_Init[0]),
+ dataFiles_App2_Init,
+ sizeof(dataFiles_App2_Init)/sizeof(dataFiles_App2_Init[0])
+} ;
+
+
+//===================================================================================================================
+// BACKUP CONTENT
+//===================================================================================================================
+// the backup content is obtained trough the backup process
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_User2_Seat1_InitialContent[16 + 16 + 16 + 32+ 32] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")}
+} ;
+
+expected_file_data_s expected_file_data_after_restore_User2_Seat1_InitialContent[10 + 10 + 10 + 10 + 10] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", false, "File>>/doc1.txt" , sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", false, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", false, "File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", false, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", false, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", false, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", false, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", false, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt", false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt", false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt", false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt")},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1", sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat2", sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat3", sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat4", sizeof("File>>gr20_>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>App2>>/docA.txt::user1" , sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>App2>>/docA.txt::user2" , sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>App2>>/docA.txt::user3" , sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>App2>>/docA.txt::user4" , sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4")}
+} ;
+
+
+//===================================================================================================================
+
+static bool_t EraseReferenceData(void)
+{
+ bool_t bEverythingOK = true ;
+ pstr_t referenceDataPath = PERS_ORG_LOCAL_APP_CACHE_PATH_ ;
+
+ sint_t result = DeleteFolderContent(referenceDataPath) ;
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+
+ if(bEverythingOK)
+ {
+ dataInit_s* sDataInit[] =
+ {
+ &sSharedPubDataInit,
+ &sShared_Group10_DataInit,
+ &sShared_Group20_DataInit,
+ &s_App1_DataInit,
+ &s_App2_DataInit
+ };
+
+ sint_t i = 0 ;
+ for(i = 0 ; i < sizeof(sDataInit)/sizeof(sDataInit[0]) ; i++)
+ {
+ if(! InitDataFolder(sDataInit[i]))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+
+bool_t Test_Recover_User2_Seat1_InitialContent_From_All(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true;
+ long lTemp ;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Create backup */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Create backup to : "),
+ DLT_STRING(BACKUP_FOLDER),
+ DLT_STRING("..."));
+ lTemp = persAdminDataBackupCreate( PersASSelectionType_All,
+ BACKUP_FOLDER,
+ "",
+ USER_DONT_CARE,
+ SEAT_DONT_CARE);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User2_Seat1_InitialContent_From_All: persAdminDataBackupCreate() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+ if(true == bEverythingOK)
+ {
+ DeleteFolder(BACKUP_CONTENT_FOLDER);
+
+
+ /* Reset the destination content (except the RCT files) */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Erase reference data..."));
+
+ bEverythingOK = EraseReferenceData();
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User2_Seat1_InitialContent_From_All: EraseReferenceData() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "all", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ lTemp = persAdminDataBackupRecovery( PersASSelectionType_User,
+ pchBackupFilePath,
+ "",
+ 0x02,
+ 0x01);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User2_Seat1_InitialContent_From_All: persAdminDataBackupRecovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ return bEverythingOK ;
+} /* Test_Recover_User2_Seat1_InitialContent_From_All */
+
+
+bool_t Test_Recover_User2_Seat1_InitialContent_From_User2_Seat1(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lTemp ;
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Create backup */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Create backup to : "),
+ DLT_STRING(BACKUP_FOLDER),
+ DLT_STRING("..."));
+ lTemp = persAdminDataBackupCreate( PersASSelectionType_User,
+ BACKUP_FOLDER,
+ "",
+ 0x02,
+ 0x01);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User2_Seat1_InitialContent_From_User2_Seat1: persAdminDataBackupCreate() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+ if(true == bEverythingOK)
+ {
+ DeleteFolder(BACKUP_CONTENT_FOLDER);
+
+
+ /* Reset the destination content (except the RCT files) */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Erase reference data..."));
+
+ bEverythingOK = EraseReferenceData();
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User2_Seat1_InitialContent_From_User2_Seat1: EraseReferenceData() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "user", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ lTemp = persAdminDataBackupRecovery( PersASSelectionType_User,
+ pchBackupFilePath,
+ "",
+ 0x02,
+ 0x01);
+ bEverythingOK = (lTemp >= 0) ? true : false ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_User2_Seat1_InitialContent_From_User2_Seat1: persAdminDataBackupRecovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ return bEverythingOK ;
+} /* Test_Recover_User2_Seat1_InitialContent_From_User2_Seat1 */
diff --git a/test/pers_svc_test/src/test_pas_recovery_Users.c b/test/pers_svc_test/src/test_pas_recovery_Users.c
new file mode 100644
index 0000000..ed50f24
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_recovery_Users.c
@@ -0,0 +1,298 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_backup_recovery.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+// using default structure offered by test framework
+
+//===================================================================================================================
+// BACKUP CONTENT
+//===================================================================================================================
+// using a common backup content structure
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_Users[23 + 24 + 24 + 24 + 22] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingK", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/pubSettingK", sizeof("Data>>/pubSettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingL", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/pubSettingL", sizeof("Data>>/pubSettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/KBL::user1", sizeof("Data>>/pubSetting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/KBL::user2", sizeof("Data>>/pubSetting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/KBL::user3", sizeof("Data>>/pubSetting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/KBL", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/KBL::user4", sizeof("Data>>/pubSetting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/XYZ", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/XYZ::user4", sizeof("Data>>/pubSetting/XYZ::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingK", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/gr10_SettingK", sizeof("Data>>/gr10_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingL", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/gr10_SettingL", sizeof("Data>>/gr10_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user1", sizeof("Data>>/gr10_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user2", sizeof("Data>>/gr10_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user3", sizeof("Data>>/gr10_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/KBL::user4", sizeof("Data>>/gr10_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingZ", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false,"Data>>/gr10_SettingZ", sizeof("Data>>/gr10_SettingZ")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/PRT", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/PRT::user4", sizeof("Data>>/gr10_Setting/PRT::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingK", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/gr20_SettingK", sizeof("Data>>/gr20_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingL", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/gr20_SettingL", sizeof("Data>>/gr20_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/KBL::user1", sizeof("Data>>/gr20_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/KBL::user2", sizeof("Data>>/gr20_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/KBL::user3", sizeof("Data>>/gr20_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/KBL", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/KBL::user4", sizeof("Data>>/gr20_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingZ", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false,"Data>>/gr20_SettingZ", sizeof("Data>>/gr20_SettingZ")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/PRT", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/PRT::user4", sizeof("Data>>/gr20_Setting/PRT::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingK", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingK", sizeof("Data>>/App1_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingL", sizeof("Data>>/App1_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user1", sizeof("Data>>/App1_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user2", sizeof("Data>>/App1_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user3", sizeof("Data>>/App1_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/KBL::user4", sizeof("Data>>/App1_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KKK", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/KKK::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/XYZ", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/XYZ::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingK", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_SettingK", sizeof("Data>>/App2_SettingK")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingL", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_SettingL", sizeof("Data>>/App2_SettingL")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/KBL::user1", sizeof("Data>>/App2_Setting/KBL::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/KBL::user2", sizeof("Data>>/App2_Setting/KBL::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/KBL::user3", sizeof("Data>>/App2_Setting/KBL::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/KBL", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/KBL::user4", sizeof("Data>>/App2_Setting/KBL::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+
+};
+
+
+expected_file_data_s expected_file_data_after_restore_Users[16 + 16 + 16] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true, "File>>/doc1.txt" , sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", false,"File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", false,"File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", false,"File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", false,"File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docK.txt", true, "File>>/docK.txt::user1" , sizeof("File>>/docK.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docK.txt", true, "File>>/docK.txt::user2" , sizeof("File>>/docK.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docT.txt", true, "File>>/docT.txt::user2" , sizeof("File>>/docT.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docK.txt", true, "File>>/docK.txt::user3" , sizeof("File>>/docK.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docK.txt", true, "File>>/docK.txt::user4" , sizeof("File>>/docK.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", true, "File>>/docC.txt::user2:seat4" , sizeof("File>>/docC.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>gr10_>>/docK.txt::user1" , sizeof("File>>gr10_>>/docK.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>gr10_>>/docK.txt::user2" , sizeof("File>>gr10_>>/docK.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docT.txt", true, "File>>gr10_>>/docK.txt::user2" , sizeof("File>>gr10_>>/docK.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>gr10_>>/docK.txt::user3" , sizeof("File>>gr10_>>/docK.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>gr10_>>/docK.txt::user4" , sizeof("File>>gr10_>>/docK.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docT.txt", true, "File>>gr10_>>/docB.txt::user2:seat4" , sizeof("File>>gr10_>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false,"File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false,"File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false,"File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false,"File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", true, "File>>App1>>/docK.txt::user1" , sizeof("File>>App1>>/docK.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", true, "File>>App1>>/docK.txt::user2" , sizeof("File>>App1>>/docK.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", true, "File>>App1>>/docK.txt::user3" , sizeof("File>>App1>>/docK.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", true, "File>>App1>>/docK.txt::user4" , sizeof("File>>App1>>/docK.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", true, "File>>App1>>/docC.txt::user2:seat4" , sizeof("File>>App1>>/docC.txt::user2:seat4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", true, "File>>App1>>/docD.txt::user2:seat4" , sizeof("File>>App1>>/docD.txt::user2:seat4" )}
+};
+//===================================================================================================================
+
+bool_t Test_Recover_Users(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+
+ str_t pchBackupFilePath [PATH_ABS_MAX_SIZE];
+
+ /* Reset the backup data for every test */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Reset backup content..."));
+
+ bEverythingOK = ResetBackupContent(PersASSelectionType_User, NULL);
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_Users: ResetBackupContent() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+ if(true == bEverythingOK)
+ {
+ (void)snprintf(pchBackupFilePath, sizeof(pchBackupFilePath), "%s%s", "user", BACKUP_FORMAT);
+
+ /* Restore content */
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Restore backup from : "),
+ DLT_STRING(pchBackupFilePath),
+ DLT_STRING("..."));
+
+ bEverythingOK = persAdminDataBackupRecovery( PersASSelectionType_User,
+ pchBackupFilePath,
+ "",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Test_Recover_Users: persAdminDataBackupRecovery() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ }
+
+ return bEverythingOK ;
+
+} /* Test_Recover_Users */
diff --git a/test/pers_svc_test/src/test_pas_recovery_backup_content.c b/test/pers_svc_test/src/test_pas_recovery_backup_content.c
new file mode 100644
index 0000000..93fb025
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_recovery_backup_content.c
@@ -0,0 +1,886 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+#include "stdio.h"
+#include "string.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <fcntl.h>
+
+#include "persistence_admin_service.h"
+#include "test_PAS.h"
+#include "test_pas_data_backup_recovery.h"
+
+/* compress/uncompress */
+#include "archive.h"
+#include "archive_entry.h"
+
+#define READ_BUFFER_LENGTH (16384)
+
+#define PATH_ABS_MAX_SIZE ( 512)
+
+#define BACKUP_FORMAT (".arch.tar.gz")
+
+#define File_t PersistenceResourceType_file
+#define Key_t PersistenceResourceType_key
+
+static sint_t persadmin_compress(pstr_t compressTo, pstr_t compressFrom) ;
+
+//===================================================================================================================
+// BACKUP CONTENT
+//===================================================================================================================
+entryRctInit_s RCT_public_backup_content[] =
+{
+ {"pubSettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}}
+} ;
+
+
+entryDataInit_s dataKeysPublic_backup_content[] =
+{
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingK", PersistencePolicy_wt, 0, 0, "Data>>/pubSettingK"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PersistencePolicy_wt, 2, 1, "Data>>/pubSettingB::user2::seat1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PersistencePolicy_wt, 2, 2, "Data>>/pubSettingB::user2:seat2"},
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingL", PersistencePolicy_wt, 0, 0, "Data>>/pubSettingL"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/KBL", PersistencePolicy_wt, 1, 0, "Data>>/pubSetting/KBL::user1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/KBL", PersistencePolicy_wt, 2, 0, "Data>>/pubSetting/KBL::user2"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/KBL", PersistencePolicy_wt, 3, 0, "Data>>/pubSetting/KBL::user3"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/KBL", PersistencePolicy_wt, 4, 0, "Data>>/pubSetting/KBL::user4"},
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PersistencePolicy_wc, 0, 0, "Data>>/pubSettingD"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PersistencePolicy_wc, 2, 1, "Data>>/pubSettingE::user2:seat1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PersistencePolicy_wc, 2, 2, "Data>>/pubSettingE::user2:seat2"},
+ {0, PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PersistencePolicy_wc, 0, 0, "Data>>/pubSettingF"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/pubSetting/DEF::user1"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/pubSetting/DEF::user2"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/pubSetting/DEF::user3"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/pubSetting/DEF::user4"},
+ {0, PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/XYZ", PersistencePolicy_wc, 4, 0, "Data>>/pubSetting/XYZ::user4"}
+} ;
+
+
+entryDataInit_s dataFilesPublic_mnt_c_backup_content[] =
+{
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>/doc1.txt"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>/Docs/doc2.txt"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>/docK.txt::user1"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>/docK.txt::user2"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docT.txt", PersistencePolicy_wc, 2, 0, "File>>/docT.txt::user2"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>/docK.txt::user3"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>/docK.txt::user4"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>/docB.txt::user2:seat1"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>/docB.txt::user2:seat2"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>/docB.txt::user2:seat3"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>/docB.txt::user2:seat4"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>/docC.txt::user2:seat4"}
+};
+
+entryDataInit_s dataFilesPublic_mnt_wt_backup_content[] =
+{
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>/doc1.txt"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>/Docs/doc2.txt"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>/docK.txt::user1"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>/docK.txt::user2"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME_"2/docT.txt", PersistencePolicy_wc, 2, 0, "File>>/docT.txt::user2"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>/docK.txt::user3"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>/docK.txt::user4"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>/docB.txt::user2:seat1"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>/docB.txt::user2:seat2"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>/docB.txt::user2:seat3"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>/docB.txt::user2:seat4"},
+ {0, BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>/docC.txt::user2:seat4"}
+};
+
+
+dataInit_s sSharedPubData_mnt_c_backup_content =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ ,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_public_backup_content,
+ sizeof(RCT_public_backup_content)/sizeof(RCT_public_backup_content[0]),
+ dataKeysPublic_backup_content,
+ sizeof(dataKeysPublic_backup_content)/sizeof(dataKeysPublic_backup_content[0]),
+ dataFilesPublic_mnt_c_backup_content,
+ sizeof(dataFilesPublic_mnt_c_backup_content)/sizeof(dataFilesPublic_mnt_c_backup_content[0])
+} ;
+
+dataInit_s sSharedPubData_mnt_wt_backup_content =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ ,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_public_backup_content,
+ sizeof(RCT_public_backup_content)/sizeof(RCT_public_backup_content[0]),
+ dataKeysPublic_backup_content,
+ sizeof(dataKeysPublic_backup_content)/sizeof(dataKeysPublic_backup_content[0]),
+ dataFilesPublic_mnt_wt_backup_content,
+ sizeof(dataFilesPublic_mnt_wt_backup_content)/sizeof(dataFilesPublic_mnt_wt_backup_content[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+entryRctInit_s RCT_group10_backup_content[] =
+{
+ {"gr10_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_A.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_2.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_B.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}}
+} ;
+
+
+entryDataInit_s dataKeys_group10_backup_content[] =
+{
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingK", PersistencePolicy_wt, 0, 0, "Data>>/gr10_SettingK"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/gr10_SettingB::user2::seat1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/gr10_SettingB::user2:seat2"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingL", PersistencePolicy_wt, 0, 0, "Data>>/gr10_SettingL"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/KBL", PersistencePolicy_wt, 1, 0, "Data>>/gr10_Setting/KBL::user1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/KBL", PersistencePolicy_wt, 2, 0, "Data>>/gr10_Setting/KBL::user2"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/KBL", PersistencePolicy_wt, 3, 0, "Data>>/gr10_Setting/KBL::user3"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/KBL", PersistencePolicy_wt, 4, 0, "Data>>/gr10_Setting/KBL::user4"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/gr10_SettingD"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingZ", PersistencePolicy_wc, 0, 0, "Data>>/gr10_SettingZ"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/gr10_SettingE::user2:seat1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/gr10_SettingE::user2:seat2"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/gr10_SettingF"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/gr10_Setting/DEF::user1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/gr10_Setting/DEF::user2"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/gr10_Setting/DEF::user3"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/gr10_Setting/DEF::user4"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/PRT", PersistencePolicy_wc, 4, 0, "Data>>/gr10_Setting/PRT::user4"}
+} ;
+
+
+entryDataInit_s dataFiles_group10_mnt_c_backup_content[] =
+{
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/gr10_1.txt"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_2.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/Docs/gr10_2.txt"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>gr10_>>/docK.txt::user1"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>gr10_>>/docK.txt::user2"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docT.txt", PersistencePolicy_wc, 2, 0, "File>>gr10_>>/docK.txt::user2"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>gr10_>>/docK.txt::user3"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>gr10_>>/docK.txt::user4"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 1, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 2, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 3, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 4, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docT.txt", PersistencePolicy_wc, 2, 4, "File>>gr10_>>/docB.txt::user2:seat4"}
+};
+
+
+entryDataInit_s dataFiles_group10_mnt_wt_backup_content[] =
+{
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/gr10_1.txt"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_2.txt", PersistencePolicy_wt, 0, 0, "File>>gr10_>>/Docs/gr10_2.txt"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>gr10_>>/docK.txt::user1"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>gr10_>>/docK.txt::user2"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/docT.txt", PersistencePolicy_wc, 2, 0, "File>>gr10_>>/docK.txt::user2"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>gr10_>>/docK.txt::user3"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>gr10_>>/docK.txt::user4"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 1, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 2, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 3, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt", PersistencePolicy_wc, 2, 4, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4"},
+ {0x10, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docT.txt", PersistencePolicy_wc, 2, 4, "File>>gr10_>>/docB.txt::user2:seat4"}
+};
+
+dataInit_s sShared_Group10_Data_mnt_c_backup_content =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/",
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group10_backup_content,
+ sizeof(RCT_group10_backup_content)/sizeof(RCT_group10_backup_content[0]),
+ dataKeys_group10_backup_content,
+ sizeof(dataKeys_group10_backup_content)/sizeof(dataKeys_group10_backup_content[0]),
+ dataFiles_group10_mnt_c_backup_content,
+ sizeof(dataFiles_group10_mnt_c_backup_content)/sizeof(dataFiles_group10_mnt_c_backup_content[0])
+} ;
+
+
+dataInit_s sShared_Group10_Data_mnt_wt_backup_content =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10/",
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group10_backup_content,
+ sizeof(RCT_group10_backup_content)/sizeof(RCT_group10_backup_content[0]),
+ dataKeys_group10_backup_content,
+ sizeof(dataKeys_group10_backup_content)/sizeof(dataKeys_group10_backup_content[0]),
+ dataFiles_group10_mnt_wt_backup_content,
+ sizeof(dataFiles_group10_mnt_wt_backup_content)/sizeof(dataFiles_group10_mnt_wt_backup_content[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+entryRctInit_s RCT_group20_backup_content[] =
+{
+ {"gr20_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"gr20_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_shared, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"}, {NIL},{NIL}}}
+} ;
+
+
+entryDataInit_s dataKeys_group20_backup_content[] =
+{
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingK", PersistencePolicy_wt, 0, 0, "Data>>/gr20_SettingK"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/gr20_SettingB::user2::seat1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/gr20_SettingB::user2:seat2"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingL", PersistencePolicy_wt, 0, 0, "Data>>/gr20_SettingL"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/KBL", PersistencePolicy_wt, 1, 0, "Data>>/gr20_Setting/KBL::user1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/KBL", PersistencePolicy_wt, 2, 0, "Data>>/gr20_Setting/KBL::user2"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/KBL", PersistencePolicy_wt, 3, 0, "Data>>/gr20_Setting/KBL::user3"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/KBL", PersistencePolicy_wt, 4, 0, "Data>>/gr20_Setting/KBL::user4"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/gr20_SettingD"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingZ", PersistencePolicy_wc, 0, 0, "Data>>/gr20_SettingZ"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/gr20_SettingE::user2:seat1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/gr20_SettingE::user2:seat2"},
+ {0x10, PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/gr20_SettingF"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/gr20_Setting/DEF::user1"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/gr20_Setting/DEF::user2"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/gr20_Setting/DEF::user3"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/gr20_Setting/DEF::user4"},
+ {0x10, PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/PRT", PersistencePolicy_wc, 4, 0, "Data>>/gr20_Setting/PRT::user4"}
+} ;
+
+entryDataInit_s dataFiles_group20_mnt_c_backup_content[] =
+{
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>gr20_>>/doc1.txt"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>gr20_>>/Docs/doc2.txt"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>gr20_>>/docK.txt::user1"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>gr20_>>/docK.txt::user2"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>gr20_>>/docK.txt::user3"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>gr20_>>/docK.txt::user4"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>gr20_>>/docB.txt::user2:seat1"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>gr20_>>/docB.txt::user2:seat2"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>gr20_>>/docB.txt::user2:seat3"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>gr20_>>/docB.txt::user2:seat4"}
+};
+
+entryDataInit_s dataFiles_group20_mnt_wt_backup_content[] =
+{
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>gr20_>>/doc1.txt"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>gr20_>>/Docs/doc2.txt"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>gr20_>>/docK.txt::user1"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>gr20_>>/docK.txt::user2"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>gr20_>>/docK.txt::user3"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>gr20_>>/docK.txt::user4"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>gr20_>>/docB.txt::user2:seat1"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>gr20_>>/docB.txt::user2:seat2"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>gr20_>>/docB.txt::user2:seat3"},
+ {0x20, BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>gr20_>>/docB.txt::user2:seat4"}
+};
+
+dataInit_s sShared_Group20_Data_mnt_c_backup_content =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/",
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_CACHE_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group20_backup_content,
+ sizeof(RCT_group20_backup_content)/sizeof(RCT_group20_backup_content[0]),
+ dataKeys_group20_backup_content,
+ sizeof(dataKeys_group20_backup_content)/sizeof(dataKeys_group20_backup_content[0]),
+ dataFiles_group20_mnt_c_backup_content,
+ sizeof(dataFiles_group20_mnt_c_backup_content)/sizeof(dataFiles_group20_mnt_c_backup_content[0])
+} ;
+
+
+dataInit_s sShared_Group20_Data_mnt_wt_backup_content =
+{
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20/",
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_group20_backup_content,
+ sizeof(RCT_group20_backup_content)/sizeof(RCT_group20_backup_content[0]),
+ dataKeys_group20_backup_content,
+ sizeof(dataKeys_group20_backup_content)/sizeof(dataKeys_group20_backup_content[0]),
+ dataFiles_group20_mnt_wt_backup_content,
+ sizeof(dataFiles_group20_mnt_wt_backup_content)/sizeof(dataFiles_group20_mnt_wt_backup_content[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+entryRctInit_s RCT_App1_backup_content[] =
+{
+ {"App1_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}}
+} ;
+
+
+entryDataInit_s dataKeys_App1_backup_content[] =
+{
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingK", PersistencePolicy_wt, 0, 0, "Data>>/App1_SettingK"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/App1_SettingB::user2::seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/App1_SettingB::user2:seat2"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingL", PersistencePolicy_wt, 0, 0, "Data>>/App1_SettingL"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/KBL", PersistencePolicy_wt, 1, 0, "Data>>/App1_Setting/KBL::user1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/KBL", PersistencePolicy_wt, 2, 0, "Data>>/App1_Setting/KBL::user2"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/KBL", PersistencePolicy_wt, 3, 0, "Data>>/App1_Setting/KBL::user3"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/KBL", PersistencePolicy_wt, 4, 0, "Data>>/App1_Setting/KBL::user4"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/App1_SettingD"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/App1_SettingE::user2:seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/App1_SettingE::user2:seat2"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/App1_SettingF"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/App1_Setting/DEF::user1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/App1_Setting/DEF::user2"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/App1_Setting/DEF::user3"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/App1_Setting/DEF::user4"}
+} ;
+
+entryDataInit_s dataFiles_App1_mnt_c_backup_content[] =
+{
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>App1>>/doc1.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>App1>>/Docs/doc2.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>App1>>/docK.txt::user1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>App1>>/docK.txt::user2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>App1>>/docK.txt::user3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>App1>>/docK.txt::user4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>App1>>/docB.txt::user2:seat1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>App1>>/docB.txt::user2:seat2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>App1>>/docB.txt::user2:seat3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docB.txt::user2:seat4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docC.txt::user2:seat4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docD.txt::user2:seat4"}
+};
+
+
+entryDataInit_s dataFiles_App1_mnt_wt_backup_content[] =
+{
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>App1>>/doc1.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>App1>>/Docs/doc2.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>App1>>/docK.txt::user1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>App1>>/docK.txt::user2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>App1>>/docK.txt::user3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>App1>>/docK.txt::user4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>App1>>/docB.txt::user2:seat1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>App1>>/docB.txt::user2:seat2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>App1>>/docB.txt::user2:seat3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docB.txt::user2:seat4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docC.txt::user2:seat4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", PersistencePolicy_wc, 2, 4, "File>>App1>>/docD.txt::user2:seat4"}
+};
+
+
+dataInit_s s_App1_Data_mnt_c_backup_content =
+{
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/",
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App1_backup_content,
+ sizeof(RCT_App1_backup_content)/sizeof(RCT_App1_backup_content[0]),
+ dataKeys_App1_backup_content,
+ sizeof(dataKeys_App1_backup_content)/sizeof(dataKeys_App1_backup_content[0]),
+ dataFiles_App1_mnt_c_backup_content,
+ sizeof(dataFiles_App1_mnt_c_backup_content)/sizeof(dataFiles_App1_mnt_c_backup_content[0])
+};
+
+
+dataInit_s s_App1_Data_mnt_wt_backup_content =
+{
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1/",
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App1_backup_content,
+ sizeof(RCT_App1_backup_content)/sizeof(RCT_App1_backup_content[0]),
+ dataKeys_App1_backup_content,
+ sizeof(dataKeys_App1_backup_content)/sizeof(dataKeys_App1_backup_content[0]),
+ dataFiles_App1_mnt_wt_backup_content,
+ sizeof(dataFiles_App1_mnt_wt_backup_content)/sizeof(dataFiles_App1_mnt_wt_backup_content[0])
+} ;
+
+/**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+entryRctInit_s RCT_App2_backup_content[] =
+{
+ {"App2_SettingA", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingB", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/ABC", true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingD", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingE", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_SettingF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"App2_Setting/DEF", true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"doc1.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", false, {PersistencePolicy_wt, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"docA.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App2"}, {NIL},{NIL}}}
+} ;
+
+
+entryDataInit_s dataKeys_App2_backup_content[] =
+{
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingK", PersistencePolicy_wt, 0, 0, "Data>>/App2_SettingK"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PersistencePolicy_wt, 2, 1, "Data>>/App2_SettingB::user2::seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PersistencePolicy_wt, 2, 2, "Data>>/App2_SettingB::user2:seat2"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingL", PersistencePolicy_wt, 0, 0, "Data>>/App2_SettingL"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/KBL", PersistencePolicy_wt, 1, 0, "Data>>/App2_Setting/KBL::user1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/KBL", PersistencePolicy_wt, 2, 0, "Data>>/App2_Setting/KBL::user2"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/KBL", PersistencePolicy_wt, 3, 0, "Data>>/App2_Setting/KBL::user3"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/KBL", PersistencePolicy_wt, 4, 0, "Data>>/App2_Setting/KBL::user4"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PersistencePolicy_wc, 0, 0, "Data>>/App2_SettingD"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PersistencePolicy_wc, 2, 1, "Data>>/App2_SettingE::user2:seat1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PersistencePolicy_wc, 2, 2, "Data>>/App2_SettingE::user2:seat2"},
+ {0xFF, PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PersistencePolicy_wc, 0, 0, "Data>>/App2_SettingF"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PersistencePolicy_wc, 1, 0, "Data>>/App2_Setting/DEF::user1"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PersistencePolicy_wc, 2, 0, "Data>>/App2_Setting/DEF::user2"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PersistencePolicy_wc, 3, 0, "Data>>/App2_Setting/DEF::user3"},
+ {0xFF, PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PersistencePolicy_wc, 4, 0, "Data>>/App2_Setting/DEF::user4"}
+} ;
+
+
+entryDataInit_s dataFiles_App2_mnt_c_backup_content[] =
+{
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>App2>>/doc1.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>App2>>/Docs/doc2.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>App2>>/docK.txt::user1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>App2>>/docK.txt::user2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>App2>>/docK.txt::user3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>App2>>/docK.txt::user4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>App2>>/docB.txt::user2:seat1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>App2>>/docB.txt::user2:seat2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>App2>>/docB.txt::user2:seat3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docB.txt::user2:seat4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docC.txt::userC:seat4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docD.txt::userC:seat4"}
+};
+
+
+entryDataInit_s dataFiles_App2_mnt_wt_backup_content[] =
+{
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", PersistencePolicy_wt, 0, 0, "File>>App2>>/doc1.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", PersistencePolicy_wt, 0, 0, "File>>App2>>/Docs/doc2.txt"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docK.txt", PersistencePolicy_wc, 1, 0, "File>>App2>>/docK.txt::user1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docK.txt", PersistencePolicy_wc, 2, 0, "File>>App2>>/docK.txt::user2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docK.txt", PersistencePolicy_wc, 3, 0, "File>>App2>>/docK.txt::user3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docK.txt", PersistencePolicy_wc, 4, 0, "File>>App2>>/docK.txt::user4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", PersistencePolicy_wc, 2, 1, "File>>App2>>/docB.txt::user2:seat1"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", PersistencePolicy_wc, 2, 2, "File>>App2>>/docB.txt::user2:seat2"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", PersistencePolicy_wc, 2, 3, "File>>App2>>/docB.txt::user2:seat3"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docB.txt::user2:seat4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docC.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docC.txt::userC:seat4"},
+ {0xFF, BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docD.txt", PersistencePolicy_wc, 2, 4, "File>>App2>>/docD.txt::userC:seat4"}
+};
+
+
+dataInit_s s_App2_Data_mnt_c_backup_content =
+{
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/",
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App2_backup_content,
+ sizeof(RCT_App2_backup_content)/sizeof(RCT_App2_backup_content[0]),
+ dataKeys_App2_backup_content,
+ sizeof(dataKeys_App2_backup_content)/sizeof(dataKeys_App2_backup_content[0]),
+ dataFiles_App2_mnt_c_backup_content,
+ sizeof(dataFiles_App2_mnt_c_backup_content)/sizeof(dataFiles_App2_mnt_c_backup_content[0])
+};
+
+
+dataInit_s s_App2_Data_mnt_wt_backup_content =
+{
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2/",
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_RCT_NAME,
+ dbType_RCT,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_SHARED_WT_DB_NAME,
+ dbType_local,
+ BACKUP_FOLDER PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_SHARED_CACHE_DB_NAME,
+ dbType_local,
+ RCT_App2_backup_content,
+ sizeof(RCT_App2_backup_content)/sizeof(RCT_App2_backup_content[0]),
+ dataKeys_App2_backup_content,
+ sizeof(dataKeys_App2_backup_content)/sizeof(dataKeys_App2_backup_content[0]),
+ dataFiles_App2_mnt_wt_backup_content,
+ sizeof(dataFiles_App2_mnt_wt_backup_content)/sizeof(dataFiles_App2_mnt_wt_backup_content[0])
+};
+
+//reset backup content
+bool_t ResetBackupContent(PersASSelectionType_e type, char* applicationID)
+{
+ sint_t sResult = 0;
+ bool_t bEverythingOK = true ;
+ pstr_t referenceDataPath = BACKUP_CONTENT_FOLDER;
+
+ str_t pchPathCompressTo [PATH_ABS_MAX_SIZE];
+ str_t pchPathCompressFrom [PATH_ABS_MAX_SIZE];
+
+ DeleteFolder(referenceDataPath);
+
+ // the current implementation performs the restore process twice due to the
+ // fact that the backup generates a mirrored content (for mnt-c and mnt-wt)
+
+ if(bEverythingOK)
+ {
+ sint_t i = 0 ;
+
+ // mnt_c
+ dataInit_s* sDataInit[] =
+ {
+ &sSharedPubData_mnt_c_backup_content,
+ &sShared_Group10_Data_mnt_c_backup_content,
+ &sShared_Group20_Data_mnt_c_backup_content,
+ &s_App1_Data_mnt_c_backup_content,
+ &s_App2_Data_mnt_c_backup_content
+ };
+
+ for(i = 0 ; i < sizeof(sDataInit)/sizeof(sDataInit[0]) ; i++)
+ {
+ if(! InitDataFolder(sDataInit[i]))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ if(bEverythingOK)
+ {
+ sint_t i = 0 ;
+
+ // mnt_wt
+ dataInit_s* sDataInit[] =
+ {
+ &sSharedPubData_mnt_wt_backup_content,
+ &sShared_Group10_Data_mnt_wt_backup_content,
+ &sShared_Group20_Data_mnt_wt_backup_content,
+ &s_App1_Data_mnt_wt_backup_content,
+ &s_App2_Data_mnt_wt_backup_content
+ };
+
+ for(i = 0 ; i < sizeof(sDataInit)/sizeof(sDataInit[0]) ; i++)
+ {
+ if(! InitDataFolder(sDataInit[i]))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ }
+
+ /* compress the source folder and delete it afterwards */
+ (void)snprintf(pchPathCompressFrom, sizeof(pchPathCompressFrom), "%s", BACKUP_CONTENT_FOLDER);
+
+ /* create the tar name; */
+ switch( type )
+ {
+ case PersASSelectionType_Application:
+ {
+ (void)snprintf(pchPathCompressTo, sizeof(pchPathCompressTo), "%s%s%s", BACKUP_FOLDER_, applicationID, BACKUP_FORMAT);
+ break;
+ }
+ case PersASSelectionType_User:
+ {
+ (void)snprintf(pchPathCompressTo, sizeof(pchPathCompressTo), "%s%s%s", BACKUP_FOLDER_, "user", BACKUP_FORMAT);
+ break;
+ }
+ case PersASSelectionType_All:
+ {
+ (void)snprintf(pchPathCompressTo, sizeof(pchPathCompressTo), "%s%s%s", BACKUP_FOLDER_, "all", BACKUP_FORMAT);
+ break;
+ }
+ default:
+ {
+ bEverythingOK = false;
+ /* nothing to do */
+ break;
+ }
+ }
+
+ if(true == bEverythingOK)
+ {
+ /* return 0 for success, negative value otherwise; */
+ sResult = persadmin_compress(pchPathCompressTo, pchPathCompressFrom);
+ if( 0 > sResult )
+ {
+ bEverythingOK = false;
+ }
+
+ /* remove the initial folder content */
+ DeleteFolder(referenceDataPath);
+ }
+
+ return bEverythingOK ;
+}
+
+
+/**
+ * @brief Saves files together into a single archive.
+ * @usage persadmin_compress("/path/to/compress/to/archive_name.tgz", "/path/from/where/to/compress")
+ * @return 0 for success, negative value otherwise.
+ */
+static sint_t persadmin_compress(pstr_t compressTo, pstr_t compressFrom)
+{
+ uint8_t buffer [READ_BUFFER_LENGTH];
+ str_t pchParentPath [PATH_ABS_MAX_SIZE];
+ pstr_t pchStrPos = NIL;
+ struct archive *psArchive = NIL;
+ struct archive *psDisk = NIL;
+ struct archive_entry *psEntry = NIL;
+ sint_t s32Result = ARCHIVE_OK;
+ sint_t s32Length = 0;
+ sint_t fd;
+ sint_t s32ParentPathLength = 0;
+
+
+ if( (NIL == compressTo) ||
+ (NIL == compressFrom) )
+ {
+ s32Result = ARCHIVE_FAILED;
+ printf("persadmin_compress - invalid parameters \n");
+ }
+
+ if( ARCHIVE_OK == s32Result )
+ {
+ printf("persadmin_compress - create <%s> from <%s>\n", compressTo, compressFrom);
+ psArchive = archive_write_new();
+ if( NIL == psArchive )
+ {
+ s32Result = ARCHIVE_FAILED;
+ printf("persadmin_compress - archive_write_new ERR\n");
+ }
+ }
+
+ if( ARCHIVE_OK == s32Result )
+ {
+ /* this in turn calls archive_write_add_filter_gzip; */
+ s32Result = archive_write_set_compression_gzip(psArchive);
+ if( ARCHIVE_OK != s32Result )
+ {
+ printf("persadmin_compress - archive_write_set_compression_gzip ERR %d\n", s32Result);
+ }
+ }
+
+ if( ARCHIVE_OK == s32Result )
+ {
+ /* portable archive exchange; */
+ archive_write_set_format_pax(psArchive);
+ compressTo = (strcmp(compressTo, "-") == 0) ? NIL : compressTo;
+ s32Result = archive_write_open_filename(psArchive, compressTo);
+ if( ARCHIVE_OK != s32Result )
+ {
+ printf("persadmin_compress - archive_write_open_filename ERR %d\n", s32Result);
+ }
+ }
+
+ if( ARCHIVE_OK == s32Result )
+ {
+ psDisk = archive_read_disk_new();
+ if( NIL == psDisk )
+ {
+ s32Result = ARCHIVE_FAILED;
+ printf("persadmin_compress - archive_read_disk_new ERR\n");
+ }
+ }
+
+ if( ARCHIVE_OK == s32Result )
+ {
+ archive_read_disk_set_standard_lookup(psDisk);
+ s32Result = archive_read_disk_open(psDisk, compressFrom);
+ if( ARCHIVE_OK != s32Result )
+ {
+ printf("persadmin_compress - archive_read_disk_new ERR %s\n", archive_error_string(psDisk));
+ }
+ }
+
+ memset(pchParentPath, 0, sizeof(pchParentPath));
+ snprintf(pchParentPath, sizeof(pchParentPath), compressFrom);
+ pchStrPos = strrchr(pchParentPath, '/');
+ if(NIL != pchStrPos)
+ {
+ *pchStrPos = '\0';
+ }
+ s32ParentPathLength = strlen(pchParentPath);
+
+
+ while( ARCHIVE_OK == s32Result )
+ {
+ psEntry = archive_entry_new();
+ s32Result = archive_read_next_header2(psDisk, psEntry);
+
+ switch( s32Result )
+ {
+ case ARCHIVE_EOF:
+ {
+ /* nothing else to do; */
+ break;
+ }
+ case ARCHIVE_OK:
+ {
+ str_t pstrTemp[PATH_ABS_MAX_SIZE];
+ pstr_t p = archive_entry_pathname(psEntry);
+ if(NIL != p)
+ {
+ /* remove parent section and save relative pathnames */
+ memset(pstrTemp, 0, sizeof(pstrTemp));
+ snprintf(pstrTemp, sizeof(pstrTemp), "%s", p + (s32ParentPathLength + 1));
+ archive_entry_copy_pathname(psEntry, pstrTemp);
+ }
+
+ archive_read_disk_descend(psDisk);
+ s32Result = archive_write_header(psArchive, psEntry);
+ if( ARCHIVE_OK > s32Result)
+ {
+ printf("persadmin_compress - archive_write_header ERR %s\n", archive_error_string(psArchive));
+ }
+ if( ARCHIVE_FATAL == s32Result )
+ {
+ /* exit; */
+ printf("persadmin_compress - archive_write_header ERR FATAL\n");
+ }
+ if( ARCHIVE_FAILED < s32Result )
+ {
+#if 0
+ /* Ideally, we would be able to use
+ * the same code to copy a body from
+ * an archive_read_disk to an
+ * archive_write that we use for
+ * copying data from an archive_read
+ * to an archive_write_disk.
+ * Unfortunately, this doesn't quite
+ * work yet. */
+ persadmin_copy_data(psDisk, psArchive);
+#else
+
+ /* For now, we use a simpler loop to copy data
+ * into the target archive. */
+ fd = open(archive_entry_sourcepath(psEntry), O_RDONLY);
+ s32Length = read(fd, buffer, READ_BUFFER_LENGTH);
+ while( s32Length > 0 )
+ {
+ archive_write_data(psArchive, buffer, s32Length);
+ s32Length = read(fd, buffer, READ_BUFFER_LENGTH);
+ }
+ close(fd);
+#endif
+ }
+
+ break;
+ }
+ default:
+ {
+ printf("persadmin_compress - archive_read_next_header2 ERR %s\n", archive_error_string(psDisk));
+ /* exit; */
+ break;
+ }
+ }
+
+ if( NIL != psEntry )
+ {
+ archive_entry_free(psEntry);
+ }
+ }
+
+ /* perform cleaning operations; */
+ if( NIL != psDisk )
+ {
+ archive_read_close(psDisk);
+ archive_read_free(psDisk);
+ }
+
+ if( NIL != psArchive )
+ {
+ archive_write_close(psArchive);
+ archive_write_free(psArchive);
+ }
+
+ /* overwrite result; */
+ s32Result = (s32Result == ARCHIVE_EOF) ? ARCHIVE_OK : s32Result;
+ /* return result; */
+ return s32Result;
+
+} /* persadmin_compress() */
+
+
+
diff --git a/test/pers_svc_test/src/test_pas_resource_config_add.c b/test/pers_svc_test/src/test_pas_resource_config_add.c
new file mode 100644
index 0000000..29dd2d8
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_resource_config_add.c
@@ -0,0 +1,729 @@
+/********************************************************************************************************************* * * Copyright (C) 2012 Continental Automotive Systems, Inc. * * Author: Petrica.Manoila@continental-corporation.com * * Implementation of backup process * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Date Author Reason * 2012.11.27 uidu0250 CSP_WZ#1280: Initial version * **********************************************************************************************************************/ #include "persComTypes.h"
+#include "stdio.h"
+#include "string.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include "dlt/dlt.h"
+
+#include "persistence_admin_service.h"
+#include "test_PAS.h"
+#include "test_pas_resource_config_add.h"
+
+#include "persComDbAccess.h"
+
+#define File_t PersistenceResourceType_file
+#define Key_t PersistenceResourceType_key
+
+/* L&T context */
+#define LT_HDR "TEST_PAS_CONF >> "
+DLT_IMPORT_CONTEXT (persAdminSvcDLTCtx)
+static char g_msg[512] ;
+
+
+#define RESOURCE_PATH "/tmp/var/resourceConfig"
+#define RESOURCE_PATH_ RESOURCE_PATH"/"
+
+#define RESOURCE_ARCHIVE_PATHNAME_1 "/tmp/PAS/resource1.tar.gz"
+#define RESOURCE_ARCHIVE_PATHNAME_2 "/tmp/PAS/resource2.tar.gz"
+
+/**********************************************************************************************************************************************
+ *********************************************** Expected - public *****************************************************************************
+ *********************************************************************************************************************************************/
+expected_key_data_RCT_s expected_RCT_public[13] =
+{
+ //pubSettingA changed policy (wt -> wc)
+ {"pubSettingA", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingB", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingC", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ //pubSettingE changed policy (wc -> wt)
+ {"pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ //pubSettingF removed
+ {"pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, false, {PersistencePolicy_wc, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ //new_pubSetting_1 added
+ {"new_pubSetting_1", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_shared,Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"doc1.txt", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_shared,File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_shared,File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"docA.txt", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_shared,File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}},
+ {"Docs/docB.txt", PERS_ORG_SHARED_PUBLIC_CACHE_PATH"/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_shared,File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"public"}, {NIL},{NIL}}}
+} ;
+
+/* data after phase 1 */
+expected_key_data_localDB_s expectedKeyData_public[29] =
+{
+ //pubSettingA changed policy (wt -> wc)
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, false,
+ "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ {"pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME, true,
+ "FactoryDefault : pubSettingA : orig", sizeof("FactoryDefault : pubSettingA : orig")},
+ {"pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME, true,
+ "ConfigurableDefault : pubSettingA : orig", sizeof("ConfigurableDefault : pubSettingA : orig")},
+
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ //added factory default value in config file
+ {"pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME, true,
+ "FactoryDefault : pubSettingB : new", sizeof("FactoryDefault : pubSettingB : new")},
+
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+
+ {PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ {PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ {PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ {"pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME, true,
+ "FactoryDefault : pubSetting/ABC : orig", sizeof("FactoryDefault : pubSetting/ABC : orig")},
+ #if 0 //configurable-default values changed by config file
+ {"pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME, true,
+ "ConfigurableDefault : pubSetting/ABC : orig", sizeof("ConfigurableDefault : pubSetting/ABC : orig")},
+ #endif
+ {"pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME, true,
+ "ConfigurableDefault : pubSetting/ABC : new", sizeof("ConfigurableDefault : pubSetting/ABC : new")},
+
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ #if 0 //factory-default value changed by config file
+ {"pubSettingD", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME, true,
+ "FactoryDefault : pubSettingD : orig", sizeof("FactoryDefault : pubSettingD : orig")},
+ #endif
+ {"pubSettingD", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME, true,
+ "FactoryDefault : pubSettingD : new", sizeof("FactoryDefault : pubSettingD : new")},
+ //configurable-default value added by config file
+ {"pubSettingD", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME, true,
+ "ConfigurableDefault : pubSettingD : new", sizeof("ConfigurableDefault : pubSettingD : new")},
+
+ //pubSettingE changed policy (wc -> wt)
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_, false,
+ "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_, false,
+ "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+
+ //pubSettingF removed
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_, false,
+ "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_, false,
+ "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+
+ {PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ {PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ {PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+ //new_pubSetting_1 - added factory-default value in config file
+ {"new_pubSetting_1", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME, true,
+ "FactoryDefault : new_pubSetting_1 : new", sizeof("FactoryDefault : new_pubSetting_1 : new")},
+ //new_pubSetting_1 - added configurable-default value in config file
+ {"new_pubSetting_1", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME, true,
+ "ConfigurableDefault : new_pubSetting_1 : new", sizeof("ConfigurableDefault : new_pubSetting_1 : new")}
+} ;
+
+
+/* data after phase 2 - uninstall non-default data (pubSettingB excepted) */
+expected_key_data_localDB_s expectedKeyData_public_phase2[29] =
+{
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ false, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_,
+ false, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ {"pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME,
+ true, "FactoryDefault : pubSettingA : orig", sizeof("FactoryDefault : pubSettingA : orig")},
+ {"pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME,
+ true, "ConfigurableDefault : pubSettingA : orig", sizeof("ConfigurableDefault : pubSettingA : orig")},
+
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ true, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ true, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ {"pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME,
+ true, "FactoryDefault : pubSettingB : new", sizeof("FactoryDefault : pubSettingB : new")},
+
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ false, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+
+ {PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ false, "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ false, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ {PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ false, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ {PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ false, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ {"pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME,
+ true, "FactoryDefault : pubSetting/ABC : orig", sizeof("FactoryDefault : pubSetting/ABC : orig")},
+
+ {"pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME,
+ true, "ConfigurableDefault : pubSetting/ABC : new", sizeof("ConfigurableDefault : pubSetting/ABC : new")},
+
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_,
+ false, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+
+ {"pubSettingD", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME,
+ true, "FactoryDefault : pubSettingD : new", sizeof("FactoryDefault : pubSettingD : new")},
+ {"pubSettingD", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME,
+ true, "ConfigurableDefault : pubSettingD : new", sizeof("ConfigurableDefault : pubSettingD : new")},
+
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ false, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_,
+ false, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ false, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_,
+ false, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_WT_DB_NAME_,
+ false, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ {PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_,
+ false, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+
+ {PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_,
+ false, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_,
+ false, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ {PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_,
+ false, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ {PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_WT_PATH""PERS_ORG_LOCAL_CACHE_DB_NAME_,
+ false, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+ {"new_pubSetting_1", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME,
+ true, "FactoryDefault : new_pubSetting_1 : new", sizeof("FactoryDefault : new_pubSetting_1 : new")},
+ {"new_pubSetting_1", PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME,
+ true, "ConfigurableDefault : new_pubSetting_1 : new", sizeof("ConfigurableDefault : new_pubSetting_1 : new")}
+};
+
+expected_file_data_s expectedFileData_public[18] =
+{
+/* factory-default - installed via config */
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_DEFAULT_DATA_FOLDER_NAME"/""doc1.txt", true, "File>>/doc1.txt factory-default", sizeof("File>>/doc1.txt factory-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_DEFAULT_DATA_FOLDER_NAME"/""docA.txt", true, "File>>/docA.txt factory-default", sizeof("File>>/docA.txt factory-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_DEFAULT_DATA_FOLDER_NAME"/""Docs/doc2.txt", true, "File>>/Docs/doc2.txt factory-default", sizeof("File>>/Docs/doc2.txt factory-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_DEFAULT_DATA_FOLDER_NAME"/""Docs/docB.txt", true, "File>>/Docs/docB.txt factory-default", sizeof("File>>/Docs/docB.txt factory-default")-1},
+/* configurable-default - installed via config */
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME"/""doc1.txt", true, "File>>/doc1.txt configurable-default", sizeof("File>>/doc1.txt configurable-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME"/""docA.txt", true, "File>>/docA.txt configurable-default", sizeof("File>>/docA.txt configurable-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME"/""Docs/doc2.txt", true, "File>>/Docs/doc2.txt configurable-default", sizeof("File>>/Docs/doc2.txt configurable-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME"/""Docs/docB.txt", true, "File>>/Docs/docB.txt configurable-default", sizeof("File>>/Docs/docB.txt configurable-default")-1},
+/* non-default - pre-installed */
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_NODE_FOLDER_NAME"/""doc1.txt", true, "File>>/doc1.txt", sizeof("File>>/doc1.txt")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_NODE_FOLDER_NAME"/""Docs/doc2.txt", true, "File>>/Docs/doc2.txt", sizeof("File>>/Docs/doc2.txt")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", true, "File>>/docA.txt::user1", sizeof("File>>/docA.txt::user1")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", true, "File>>/docA.txt::user2", sizeof("File>>/docA.txt::user2")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", true, "File>>/docA.txt::user3", sizeof("File>>/docA.txt::user3")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", true, "File>>/docA.txt::user4", sizeof("File>>/docA.txt::user4")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1", sizeof("File>>/docB.txt::user2:seat1")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2", sizeof("File>>/docB.txt::user2:seat2")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3", sizeof("File>>/docB.txt::user2:seat3")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4", sizeof("File>>/docB.txt::user2:seat4")}
+};
+
+/* data after phase 2 - uninstall non-default data (docA.txt excepted) */
+expected_file_data_s expectedFileData_public_phase2[18] =
+{
+/* factory-default - installed via config */
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_DEFAULT_DATA_FOLDER_NAME"/""doc1.txt", true, "File>>/doc1.txt factory-default", sizeof("File>>/doc1.txt factory-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_DEFAULT_DATA_FOLDER_NAME"/""docA.txt", true, "File>>/docA.txt factory-default", sizeof("File>>/docA.txt factory-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_DEFAULT_DATA_FOLDER_NAME"/""Docs/doc2.txt", true, "File>>/Docs/doc2.txt factory-default", sizeof("File>>/Docs/doc2.txt factory-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_DEFAULT_DATA_FOLDER_NAME"/""Docs/docB.txt", true, "File>>/Docs/docB.txt factory-default", sizeof("File>>/Docs/docB.txt factory-default")-1},
+/* configurable-default - installed via config */
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME"/""doc1.txt", true, "File>>/doc1.txt configurable-default", sizeof("File>>/doc1.txt configurable-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME"/""docA.txt", true, "File>>/docA.txt configurable-default", sizeof("File>>/docA.txt configurable-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME"/""Docs/doc2.txt", true, "File>>/Docs/doc2.txt configurable-default", sizeof("File>>/Docs/doc2.txt configurable-default")-1},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME"/""Docs/docB.txt", true, "File>>/Docs/docB.txt configurable-default", sizeof("File>>/Docs/docB.txt configurable-default")-1},
+/* non-default - pre-installed */
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_NODE_FOLDER_NAME"/""doc1.txt", false,"File>>/doc1.txt", sizeof("File>>/doc1.txt")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_NODE_FOLDER_NAME"/""Docs/doc2.txt", false,"File>>/Docs/doc2.txt", sizeof("File>>/Docs/doc2.txt")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", true, "File>>/docA.txt::user1", sizeof("File>>/docA.txt::user1")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", true, "File>>/docA.txt::user2", sizeof("File>>/docA.txt::user2")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", true, "File>>/docA.txt::user3", sizeof("File>>/docA.txt::user3")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", true, "File>>/docA.txt::user4", sizeof("File>>/docA.txt::user4")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false,"File>>/docB.txt::user2:seat1", sizeof("File>>/docB.txt::user2:seat1")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false,"File>>/docB.txt::user2:seat2", sizeof("File>>/docB.txt::user2:seat2")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false,"File>>/docB.txt::user2:seat3", sizeof("File>>/docB.txt::user2:seat3")},
+ {PERS_ORG_SHARED_PUBLIC_WT_PATH"/"PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false,"File>>/docB.txt::user2:seat4", sizeof("File>>/docB.txt::user2:seat4")}
+};
+
+/**********************************************************************************************************************************************
+ *********************************************** Expected - group/10 *****************************************************************************
+ *********************************************************************************************************************************************/
+expected_key_data_RCT_s expected_RCT_group_10[12] =
+{
+ {"gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_1.txt", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_A.txt", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"gr10_2.txt", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}},
+ {"Docs/gr10_B.txt", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group10"}, {NIL},{NIL}}}
+} ;
+
+expected_key_data_localDB_s expectedKeyData_group_10[24] =
+{
+/* non-default data : pre-installed */
+ {PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ //no longer in - deleted by installException
+ {PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_WT_DB_NAME_, false,
+ "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ {PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ {PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ {PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ {PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ {PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ {PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ {PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ {PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+/* factory-default data : pre-installed */
+ //not updated because factory-default data not available in config file
+ {"gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "FactoryDefault : gr10_SettingA : orig", sizeof("FactoryDefault : gr10_SettingA : orig")},
+ {"gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "FactoryDefault : gr10_SettingB : orig", sizeof("FactoryDefault : gr10_SettingB : orig")},
+ //deleted by config file
+ {"gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, false,
+ "FactoryDefault : gr10_SettingC : orig", sizeof("FactoryDefault : gr10_SettingC : orig")},
+ {"gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "FactoryDefault : gr10_Setting/ABC : orig", sizeof("FactoryDefault : gr10_Setting/ABC : orig")},
+/* configurable-default data : pre-installed */
+ #if 0 //updated by config file
+ {"gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "ConfigurableDefault : gr10_SettingA : orig", sizeof("ConfigurableDefault : gr10_SettingA : orig")},
+ #endif
+ {"gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "ConfigurableDefault : gr10_SettingA : new", sizeof("ConfigurableDefault : gr10_SettingA : new")},
+ {"gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "ConfigurableDefault : gr10_SettingB : orig", sizeof("ConfigurableDefault : gr10_SettingB : orig")},
+ //deleted by config file
+ {"gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false,
+ "ConfigurableDefault : gr10_SettingC : orig", sizeof("ConfigurableDefault : gr10_SettingC : orig")},
+ {"gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "ConfigurableDefault : gr10_Setting/ABC : orig", sizeof("ConfigurableDefault : gr10_Setting/ABC : orig")}
+} ;
+
+expected_file_data_s expectedFileData_group_10[18] =
+{
+/* pre-installed */
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt", sizeof("File>>gr10_>>/gr10_1.txt")},
+ #if 0 //updated by config file
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt", sizeof("File>>gr10_>>/Docs/gr10_A.txt")},
+ #endif
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", false,"File>>gr10_>>/Docs/gr10_A.txt", sizeof("File>>gr10_>>/Docs/gr10_A.txt")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user1", sizeof("File>>gr10_>>/gr10_2.txt::user1")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user2", sizeof("File>>gr10_>>/gr10_2.txt::user2")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user3", sizeof("File>>gr10_>>/gr10_2.txt::user3")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user4", sizeof("File>>gr10_>>/gr10_2.txt::user4")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1", sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2", sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3", sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4", sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4")},
+
+ /* factory-default data */
+ #if 0 //updated by config file
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt factory-default : orig", sizeof("File>>gr10_>>/gr10_1.txt factory-default : orig")},
+ #endif
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt factory-default : new", sizeof("File>>gr10_>>/gr10_1.txt factory-default : new")},
+ //deleted by config file
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/Docs/gr10_A.txt", false, "File>>gr10_>>/Docs/gr10_A.txt factory-default : orig", sizeof("File>>gr10_>>/Docs/gr10_A.txt factory-default : orig")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt factory-default : orig", sizeof("File>>gr10_>>/gr10_2.txt factory-default : orig")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt factory-default : orig", sizeof("File>>gr10_>>/Docs/gr10_B.txt factory-default : orig")},
+ /* configurable-default data */
+ #if 0 //updated by config file
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt configurable-default : orig", sizeof("File>>gr10_>>/gr10_1.txt configurable-default : orig")},
+ #endif
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt configurable-default : new", sizeof("File>>gr10_>>/gr10_1.txt configurable-default : new")},
+ //deleted by config file
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/Docs/gr10_A.txt", false,"File>>gr10_>>/Docs/gr10_A.txt configurable-default : orig", sizeof("File>>gr10_>>/Docs/gr10_A.txt configurable-default : orig")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt configurable-default : orig", sizeof("File>>gr10_>>/gr10_2.txt configurable-default : orig")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/Docs/gr10_B.txt", true, "File>>gr10_>>/Docs/gr10_B.txt configurable-default : orig", sizeof("File>>gr10_>>/Docs/gr10_B.txt configurable-default : orig")},
+
+};
+
+/**********************************************************************************************************************************************
+ *********************************************** Expected - group/20 *****************************************************************************
+ *********************************************************************************************************************************************/
+
+
+expected_key_data_RCT_s expected_RCT_group_20[12] =
+{
+ {"gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"doc1.txt", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"Docs/doc2.txt", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"docA.txt", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}},
+ {"Docs/docB.txt", PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group20"},{NIL},{NIL}}}
+} ;
+
+expected_key_data_localDB_s expectedKeyData_group_20[16] =
+{
+/* non-default data : pre-installed */
+ {PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ {PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ {PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ {PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ {PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"20"PERS_ORG_LOCAL_WT_DB_NAME_, true,
+ "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ {PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD",
+ PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE",
+ PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE",
+ PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ {PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF",
+ PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ {PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF",
+ PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ {PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF",
+ PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ {PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF",
+ PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ {PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF",
+ PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_LOCAL_CACHE_DB_NAME_, true,
+ "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")}
+};
+expected_file_data_s expectedFileData_group_20[10] =
+{
+/* pre-installed */
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>gr20_>>/doc1.txt", sizeof("File>>gr20_>>/doc1.txt")},
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>gr20_>>/Docs/doc2.txt", sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1", sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2", sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3", sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4", sizeof("File>>gr20_>>/docB.txt::user2:seat4")}
+};
+
+/**********************************************************************************************************************************************
+ *********************************************** Expected - group/30 *****************************************************************************
+ *********************************************************************************************************************************************/
+/* Group 30 - new install based exclusively on configuration input (json fles) */
+expected_key_data_RCT_s expected_RCT_group_30[6] =
+{
+ {"gr30_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group30"},{NIL},{NIL}}},
+ {"gr30_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group30"},{NIL},{NIL}}},
+ {"gr30_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group30"},{NIL},{NIL}}},
+ {"gr30_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group30"},{NIL},{NIL}}},
+ {"gr30_1.txt", PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group30"},{NIL},{NIL}}},
+ {"gr30_2.txt", PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"group30"},{NIL},{NIL}}},
+} ;
+
+expected_key_data_localDB_s expectedKeyData_group_30[8] =
+{
+/* factory-default data : installed via configuration input */
+ {"gr30_SettingA",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "gr30_SettingA : FactoryDefault : orig", sizeof("gr30_SettingA : FactoryDefault : orig")},
+ {"gr30_SettingB",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "gr30_SettingB : FactoryDefault : orig", sizeof("gr30_SettingB : FactoryDefault : orig")},
+ {"gr30_SettingC",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "gr30_SettingC : FactoryDefault : orig", sizeof("gr30_SettingC : FactoryDefault : orig")},
+ {"gr30_SettingD",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "gr30_SettingD : FactoryDefault : orig", sizeof("gr30_SettingD : FactoryDefault : orig")},
+/* configurable-default data : installed via configuration input */
+ {"gr30_SettingA",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "gr30_SettingA : ConfigurableDefault : orig", sizeof("gr30_SettingA : ConfigurableDefault : orig")},
+ {"gr30_SettingB",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "gr30_SettingB : ConfigurableDefault : orig", sizeof("gr30_SettingB : ConfigurableDefault : orig")},
+ {"gr30_SettingC",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "gr30_SettingC : ConfigurableDefault : orig", sizeof("gr30_SettingC : ConfigurableDefault : orig")},
+ {"gr30_SettingD",
+ PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "gr30_SettingD : ConfigurableDefault : orig", sizeof("gr30_SettingD : ConfigurableDefault : orig")},
+};
+
+expected_file_data_s expectedFileData_group_30[4] =
+{
+/* factory-default data : installed via configuration input */
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/gr30_1.txt", true,
+ "File>>gr30_>>/gr30_1.txt factory-default : orig", sizeof("File>>gr30_>>/gr30_1.txt factory-default : orig")},
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/gr30_2.txt", true,
+ "File>>gr30_>>/gr30_2.txt factory-default : orig", sizeof("File>>gr30_>>/gr30_2.txt factory-default : orig")},
+/* configurable-default data : installed via configuration input */
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/gr30_1.txt", true,
+ "File>>gr30_>>/gr30_1.txt configurable-default : orig", sizeof("File>>gr30_>>/gr30_1.txt configurable-default : orig")},
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"30"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/gr30_2.txt", true,
+ "File>>gr30_>>/gr30_2.txt configurable-default : orig", sizeof("File>>gr30_>>/gr30_2.txt configurable-default : orig")},
+};
+
+/**********************************************************************************************************************************************
+ *********************************************** Expected - App30 First Phase *****************************************************************
+ *********************************************************************************************************************************************/
+/* Group 30 - new install based exclusively on configuration input (json fles) */
+expected_key_data_RCT_s expected_RCT_App30_Phase_1[6] =
+{
+ {"App30_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App30"},{NIL},{NIL}}},
+ {"App30_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App30"},{NIL},{NIL}}},
+ {"App30_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App30"},{NIL},{NIL}}},
+ {"App30_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, Key_t ,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App30"},{NIL},{NIL}}},
+ {"App30_1.txt", PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wt, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App30"},{NIL},{NIL}}},
+ {"App30_2.txt", PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_RCT_NAME_, true, {PersistencePolicy_wc, PersistenceStorage_shared, File_t,S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App30"},{NIL},{NIL}}},
+} ;
+
+expected_key_data_localDB_s expectedKeyData_App30_Phase_1[8] =
+{
+/* factory-default data : installed via configuration input */
+ {"App30_SettingA",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "App30_SettingA : FactoryDefault : orig", sizeof("App30_SettingA : FactoryDefault : orig")},
+ {"App30_SettingB",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "App30_SettingB : FactoryDefault : orig", sizeof("App30_SettingB : FactoryDefault : orig")},
+ {"App30_SettingC",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "App30_SettingC : FactoryDefault : orig", sizeof("App30_SettingC : FactoryDefault : orig")},
+ {"App30_SettingD",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_LOCAL_FACTORY_DEFAULT_DB_NAME_, true,
+ "App30_SettingD : FactoryDefault : orig", sizeof("App30_SettingD : FactoryDefault : orig")},
+/* configurable-default data : installed via configuration input */
+ {"App30_SettingA",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "App30_SettingA : ConfigurableDefault : orig", sizeof("App30_SettingA : ConfigurableDefault : orig")},
+ {"App30_SettingB",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "App30_SettingB : ConfigurableDefault : orig", sizeof("App30_SettingB : ConfigurableDefault : orig")},
+ {"App30_SettingC",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "App30_SettingC : ConfigurableDefault : orig", sizeof("App30_SettingC : ConfigurableDefault : orig")},
+ {"App30_SettingD",
+ PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, true,
+ "App30_SettingD : ConfigurableDefault : orig", sizeof("App30_SettingD : ConfigurableDefault : orig")},
+};
+
+expected_file_data_s expectedFileData_App30_Phase_1[4] =
+{
+/* factory-default data : installed via configuration input */
+ {PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/App30_1.txt", true,
+ "File>>App30_>>/App30_1.txt factory-default : orig", sizeof("File>>App30_>>/App30_1.txt factory-default : orig")},
+ {PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/App30_2.txt", true,
+ "File>>App30_>>/App30_2.txt factory-default : orig", sizeof("File>>App30_>>/App30_2.txt factory-default : orig")},
+/* configurable-default data : installed via configuration input */
+ {PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/App30_1.txt", true,
+ "File>>App30_>>/App30_1.txt configurable-default : orig", sizeof("File>>App30_>>/App30_1.txt configurable-default : orig")},
+ {PERS_ORG_LOCAL_APP_WT_PATH_"App30"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/App30_2.txt", true,
+ "File>>App30_>>/App30_2.txt configurable-default : orig", sizeof("File>>App30_>>/App30_2.txt configurable-default : orig")},
+};
+
+
+/***********************************************************************************************************************/
+expected_key_data_RCT_s expectedKeyData_RCT_resConfAdd_1[17] =
+{
+ {"App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ /* no longer available in the new RCT */
+ {"App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"doc1.txt", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"Docs/doc2.txt", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"docA.txt", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ /* no longer available in the new RCT */
+ {"Docs/docB.txt", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, false, {PersistencePolicy_wc, PersistenceStorage_local, File_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_NewSetting1", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_NewSetting2", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wt, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_NewSettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_NewSettingB/BAU", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}},
+ {"App1_NewSettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_RCT_NAME, true, {PersistencePolicy_wc, PersistenceStorage_local, Key_t, S_IRWXU|S_IRWXG|S_IRWXO, 64, {"App1"}, {NIL},{NIL}}}
+};
+
+expected_key_data_localDB_s expectedKeyData_localDB_resConfAdd_1[41] =
+{
+ {"App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DEFAULT_DB_NAME_, true, "Data>>/App1_SettingA::DEFAULT", sizeof("Data>>/App1_SettingA::DEFAULT")},
+ {"App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DEFAULT_DB_NAME_, true, "Data>>/App1_SettingB::DEFAULT", sizeof("Data>>/App1_SettingB::DEFAULT")},
+ {"App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DEFAULT_DB_NAME_, false, "Data>>/App1_SettingB::DEFAULT", sizeof("Data>>/App1_SettingB::DEFAULT")},
+ {"App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DEFAULT_DB_NAME_, false, NIL, 0},
+
+
+ {"App1_NewSetting1", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DEFAULT_DB_NAME_, true, "Data>>/App1_NewSetting1::DEFAULT", sizeof("Data>>/App1_NewSetting1::DEFAULT")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_NewSetting1", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, true, "Data>>/App1_NewSetting1::user1", sizeof("Data>>/App1_NewSetting1::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_NewSetting1", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, true, "Data>>/App1_NewSetting1::user2", sizeof("Data>>/App1_NewSetting1::user2")},
+
+
+ {"App1_NewSetting2", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DEFAULT_DB_NAME_, true, "Data>>/App1_NewSetting2::DEFAULT", sizeof("Data>>/App1_NewSetting2::DEFAULT")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_NewSetting2", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, true, "Data>>/App1_NewSetting2::user2::seat1", sizeof("Data>>/App1_NewSetting2::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_NewSetting2", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, true, "Data>>/App1_NewSetting2::user2::seat2", sizeof("Data>>/App1_NewSetting2::user2::seat2")},
+
+
+ {"App1_NewSettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DEFAULT_DB_NAME_, true, "Data>>/App1_NewSettingA::DEFAULT", sizeof("Data>>/App1_NewSettingA::DEFAULT")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_NewSettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_NewSettingA::node", sizeof("Data>>/App1_NewSettingA::node")},
+
+
+ {"App1_NewSettingB/BAU", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DEFAULT_DB_NAME_, true, "Data>>/App1_NewSettingB/BAU::DEFAULT", sizeof("Data>>/App1_NewSettingB/BAU::DEFAULT")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/App1_NewSettingB/BAU", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DEFAULT_DB_NAME_, false, NIL, 0},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/App1_NewSettingB/BAU", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_NewSettingB/BAU::user2::seat3", sizeof("Data>>/App1_NewSettingB/BAU::user2::seat3")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/App1_NewSettingB/BAU", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DEFAULT_DB_NAME_, false, NIL, 0},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/App1_NewSettingB/BAU", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, false, NIL, 0},
+ { PERS_ORG_USER_FOLDER_NAME_"1"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_NewSettingB/BAU", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DEFAULT_DB_NAME_, false, NIL, 0},
+ { PERS_ORG_USER_FOLDER_NAME_"1"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_NewSettingB/BAU", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_NewSettingB/BAU::user1::seat2", sizeof("Data>>/App1_NewSettingB/BAU::user1::seat2")},
+ { PERS_ORG_USER_FOLDER_NAME_"1"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_NewSettingB/BAU", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DEFAULT_DB_NAME_, false, NIL, 0},
+ { PERS_ORG_USER_FOLDER_NAME_"1"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_NewSettingB/BAU", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, false, NIL, 0},
+
+
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, true, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ /* policy changed for App1_SettingB */
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, false, NIL, 0},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, false, NIL, 0},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, true, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, true, "Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, true, "Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, true, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_WT_DB_NAME_, true, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ /* no longer available in the new RCT */
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, false, NIL, 0},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_NewSettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DB_NAME_, false, NIL, 0},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_NewSettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_LOCAL_CACHE_DEFAULT_DB_NAME_, false, NIL, 0}
+};
+
+
+expected_file_data_s expectedKeyData_files_resConfAdd_1[16] =
+{
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>NewData>>/doc1.txt::CONFIGURABLE-DEFAULT", sizeof("File>>App1>>NewData>>/doc1.txt::CONFIGURABLE-DEFAULT")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>NewData>>/doc1.txt::DEFAULT", sizeof("File>>App1>>NewData>>/doc1.txt::DEFAULT")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>NewData>>/Docs/doc2.txt::DEFAULT", sizeof("File>>App1>>NewData>>/Docs/doc2.txt::DEFAULT")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/docA.txt", true, "File>>App1>>NewData>>/docA.txt::DEFAULT", sizeof("File>>App1>>NewData>>/docA.txt::DEFAULT")},
+ /* no longer available in the new RCT */
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/Docs/docB.txt", false,NIL, 0},
+
+
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>NewData>>/doc1.txt", sizeof("File>>App1>>NewData>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>NewData>>/Docs/doc2.txt", sizeof("File>>App1>>NewData>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App1>>NewData>>/docA.txt::user1", sizeof("File>>App1>>NewData>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2", sizeof("File>>App1>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>NewData>>/docA.txt::user3", sizeof("File>>App1>>NewData>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4", sizeof("File>>App1>>/docA.txt::user4")},
+
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_DEFAULT_DATA_FOLDER_NAME_"/Docs/docB.txt", false,NIL, 0},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false,NIL, 0},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false,NIL, 0},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false,NIL, 0},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false,NIL, 0}
+} ;
+
+bool_t Test_ResourceConfigAdd_1(int ceva, void* pAltceva)
+{
+ bool_t bEverythingOK = true ;
+
+ if(bEverythingOK)
+ {
+ long result = persAdminResourceConfigAdd(RESOURCE_ARCHIVE_PATHNAME_1) ;
+ sprintf(g_msg, "Test_ResourceConfigAdd_1: persAdminResourceConfigAdd(%s) returned %ld", RESOURCE_ARCHIVE_PATHNAME_1, result) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ return bEverythingOK ;
+}
+
+bool_t Test_ResourceConfigAdd_2(int ceva, void* pAltceva)
+{
+ bool_t bEverythingOK = true ;
+
+ if(bEverythingOK)
+ {
+ long result = persAdminResourceConfigAdd(RESOURCE_ARCHIVE_PATHNAME_2) ;
+ sprintf(g_msg, "Test_ResourceConfigAdd_1: persAdminResourceConfigAdd(%s) returned %ld", RESOURCE_ARCHIVE_PATHNAME_2, result) ;
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ return bEverythingOK ;
+}
+
diff --git a/test/pers_svc_test/src/test_pas_restore_default_All.c b/test/pers_svc_test/src/test_pas_restore_default_All.c
new file mode 100644
index 0000000..5aebafb
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_restore_default_All.c
@@ -0,0 +1,350 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_restore_default.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+// using default structure offered by test framework
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_default_All[16 + 16 + 16 + 16 + 16] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+} ;
+
+expected_file_data_s expected_file_data_after_restore_default_All[10 + 10 + 10 + 10 + 10] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", false, "File>>/doc1.txt" , sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", false, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", false, "File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", false, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", false, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", false, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", false, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", false, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", false, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",false, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt")},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>App2>>/docA.txt::user1" , sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>App2>>/docA.txt::user2" , sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>App2>>/docA.txt::user3" , sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>App2>>/docA.txt::user4" , sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4")}
+} ;
+
+static expected_default_file_data_s expected_default_file_data_after_restore_factory_default_All[20] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME, true, false},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME, true, false},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME, false, false},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME, false, false},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, false},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, false},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, false},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, false},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, false},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, false},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, false},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, false},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, false},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, false},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, false},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, false},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, false},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, false},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, false},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, false},
+} ;
+
+
+//===================================================================================================================
+bool_t Test_Restore_Factory_Default_All(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ uint32_t u32Idx;
+ sint_t retVal;
+ long lRetVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore factory default for All content..."));
+
+ lRetVal = persAdminDataRestore( PersASSelectionType_All,
+ PersASDefaultSource_Factory,
+ "",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+
+ if(lRetVal < PAS_SUCCESS)
+ {
+ bEverythingOK = false;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Test_Restore_Factory_Default_All: persAdminDataRestore() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+
+ /* Check if the configurableDefaultData folders and the configurable-default-data.itz files were deleted */
+ for(u32Idx = 0; u32Idx < sizeof(expected_default_file_data_after_restore_factory_default_All) / sizeof(*expected_default_file_data_after_restore_factory_default_All); ++u32Idx)
+ {
+ retVal = CheckIfFileExists( expected_default_file_data_after_restore_factory_default_All[u32Idx].filename,
+ expected_default_file_data_after_restore_factory_default_All[u32Idx].bIsFolder);
+
+ if((PAS_SUCCESS == retVal) && (false == expected_default_file_data_after_restore_factory_default_All[u32Idx].bExpectedToExist))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING(expected_default_file_data_after_restore_factory_default_All[u32Idx].filename),
+ DLT_STRING("found. Expected not to exist..."));
+ bEverythingOK = false;
+ }
+
+// if((PAS_SUCCESS != retVal) && (true == expected_default_file_data_after_restore_factory_default_All[u32Idx].bExpectedToExist))
+// {
+// DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+// DLT_STRING(expected_default_file_data_after_restore_factory_default_All[u32Idx].filename),
+// DLT_STRING("not found. Expected to exist..."));
+// bEverythingOK = false;
+// }
+ }
+
+ return bEverythingOK ;
+} /* Test_Restore_Factory_Default_All */
+
+
+bool_t Test_Restore_Configurable_Default_All(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lRetVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore configurable default for All content..."));
+
+ lRetVal = persAdminDataRestore( PersASSelectionType_All,
+ PersASDefaultSource_Configurable,
+ "",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+
+ if(lRetVal < PAS_SUCCESS)
+ {
+ bEverythingOK = false;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Test_Restore_Configurable_Default_All: persAdminDataRestore() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ return bEverythingOK ;
+} /* Test_Restore_Configurable_Default_All */
diff --git a/test/pers_svc_test/src/test_pas_restore_default_App1.c b/test/pers_svc_test/src/test_pas_restore_default_App1.c
new file mode 100644
index 0000000..672ab77
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_restore_default_App1.c
@@ -0,0 +1,351 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <stdio.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_restore_default.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+// using default structure offered by test framework
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_default_App1[16 + 16 + 16 + 16 + 16] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true,"Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true,"Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+} ;
+
+expected_file_data_s expected_file_data_after_restore_default_App1[10 + 10 + 10 + 10 + 10] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true, "File>>/doc1.txt" , sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", true, "File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", true, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", true, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", true, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt")},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", false, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", false, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", false, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", false, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App2>>/docA.txt::user1" , sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App2>>/docA.txt::user2" , sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App2>>/docA.txt::user3" , sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App2>>/docA.txt::user4" , sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4")}
+} ;
+
+static expected_default_file_data_s expected_default_file_data_after_restore_factory_default_App1[20] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME, true, true},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME, true, true},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME, false, true},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME, false, true},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, true},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, true},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, true},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"10" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, true},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, true},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, true},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, true},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, true},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, false},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, false},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, false},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, false},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, true},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_CONFIG_DEFAULT_DATA_FOLDER_NAME_, true, true},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, true},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2" PERS_ORG_LOCAL_CONFIGURABLE_DEFAULT_DB_NAME_, false, true},
+} ;
+
+
+bool_t Test_Restore_Factory_Default_App1(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lRetVal;
+ uint32_t u32Idx;
+ sint_t retVal;
+
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore factory default for App1..."));
+
+ lRetVal = persAdminDataRestore( PersASSelectionType_Application,
+ PersASDefaultSource_Factory,
+ "App1",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+ if(lRetVal < PAS_SUCCESS)
+ {
+ bEverythingOK = false;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Test_Restore_Factory_Default_App1: persAdminDataRestore() - "),
+ DLT_STRING( bEverythingOK ? "OK" : "FAILED"));
+
+
+ /* Check if the configurableDefaultData folders and the configurable-default-data.itz files were deleted */
+ for(u32Idx = 0; u32Idx < sizeof(expected_default_file_data_after_restore_factory_default_App1) / sizeof(*expected_default_file_data_after_restore_factory_default_App1); ++u32Idx)
+ {
+ retVal = CheckIfFileExists( expected_default_file_data_after_restore_factory_default_App1[u32Idx].filename,
+ expected_default_file_data_after_restore_factory_default_App1[u32Idx].bIsFolder);
+
+ if((PAS_SUCCESS == retVal) && (false == expected_default_file_data_after_restore_factory_default_App1[u32Idx].bExpectedToExist))
+ {
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+ DLT_STRING(expected_default_file_data_after_restore_factory_default_App1[u32Idx].filename),
+ DLT_STRING("found. Expected not to exist..."));
+ bEverythingOK = false;
+ }
+
+// if((PAS_SUCCESS != retVal) && (true == expected_default_file_data_after_restore_factory_default_App1[u32Idx].bExpectedToExist))
+// {
+// DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR),
+// DLT_STRING(expected_default_file_data_after_restore_factory_default_App1[u32Idx].filename),
+// DLT_STRING("not found. Expected to exist..."));
+// bEverythingOK = false;
+// }
+ }
+
+ return bEverythingOK ;
+} /* Test_Restore_Factory_Default_App1 */
+
+
+bool_t Test_Restore_Configurable_Default_App1(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lRetVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore configurable default for App1..."));
+
+ lRetVal = persAdminDataRestore( PersASSelectionType_Application,
+ PersASDefaultSource_Configurable,
+ "App1",
+ PERSIST_SELECT_ALL_USERS,
+ PERSIST_SELECT_ALL_SEATS);
+
+ if(lRetVal < PAS_SUCCESS)
+ {
+ bEverythingOK = false;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Test_Restore_Configurable_Default_App1: persAdminDataRestore() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ return bEverythingOK ;
+} /* Test_Restore_Configurable_Default_App1 */
diff --git a/test/pers_svc_test/src/test_pas_restore_default_User1.c b/test/pers_svc_test/src/test_pas_restore_default_User1.c
new file mode 100644
index 0000000..a18aacb
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_restore_default_User1.c
@@ -0,0 +1,253 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <stdio.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_restore_default.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+// using default structure offered by test framework
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_default_User1[16 + 16 + 16 + 16 + 16] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false,"Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false,"Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false,"Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+
+} ;
+
+expected_file_data_s expected_file_data_after_restore_default_User1[10 + 10 + 10 + 10 + 10] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true, "File>>/doc1.txt" , sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", false,"File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", true, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", true, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", true, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", false,"File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt")},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false,"File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false,"File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", false,"File>>App2>>/docA.txt::user1" , sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App2>>/docA.txt::user2" , sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App2>>/docA.txt::user3" , sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App2>>/docA.txt::user4" , sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4")}
+} ;
+//===================================================================================================================
+
+bool_t Test_Restore_Configurable_Default_User1(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true ;
+ long lRetVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore configurable default for User1..."));
+
+ lRetVal = persAdminDataRestore( PersASSelectionType_User,
+ PersASDefaultSource_Configurable,
+ "",
+ 0x01,
+ PERSIST_SELECT_ALL_SEATS);
+
+ if(lRetVal < PAS_SUCCESS)
+ {
+ bEverythingOK = false;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Test_Restore_Configurable_Default_User1: persAdminDataRestore() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ return bEverythingOK ;
+} /* Test_Restore_Configurable_Default_User1 */
diff --git a/test/pers_svc_test/src/test_pas_restore_default_User2App1.c b/test/pers_svc_test/src/test_pas_restore_default_User2App1.c
new file mode 100644
index 0000000..a2808db
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_restore_default_User2App1.c
@@ -0,0 +1,253 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_restore_default.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+// using default structure offered by test framework
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_default_User2App1[16 + 16 + 16 + 16 + 16] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+} ;
+
+expected_file_data_s expected_file_data_after_restore_default_User2App1[10 + 10 + 10 + 10 + 10] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true, "File>>/doc1.txt" , sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", true, "File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", true, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", true, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", true, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt")},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", false,"File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false,"File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", false,"File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", false,"File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", false,"File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App2>>/docA.txt::user1" , sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App2>>/docA.txt::user2" , sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App2>>/docA.txt::user3" , sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App2>>/docA.txt::user4" , sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4")}
+} ;
+
+
+//===================================================================================================================
+
+bool_t Test_Restore_Configurable_Default_User2App1(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true;
+ long lRetVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore configurable default for User2App1..."));
+
+ lRetVal = persAdminDataRestore( PersASSelectionType_User,
+ PersASDefaultSource_Configurable,
+ "App1",
+ 0x02,
+ PERSIST_SELECT_ALL_SEATS);
+
+ if(lRetVal < PAS_SUCCESS)
+ {
+ bEverythingOK = false;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Test_Restore_Configurable_Default_User2App1: persAdminDataRestore() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ return bEverythingOK ;
+} /* Test_Restore_Configurable_Default_User2App1 */
diff --git a/test/pers_svc_test/src/test_pas_restore_default_User2Seat1.c b/test/pers_svc_test/src/test_pas_restore_default_User2Seat1.c
new file mode 100644
index 0000000..35827c9
--- /dev/null
+++ b/test/pers_svc_test/src/test_pas_restore_default_User2Seat1.c
@@ -0,0 +1,253 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2012 Continental Automotive Systems, Inc.
+*
+* Author: Petrica.Manoila@continental-corporation.com
+*
+* Implementation of backup process
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2012.11.27 uidu0250 CSP_WZ#1280: Initial version
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <dlt/dlt.h>
+#include <dlt/dlt_user.h>
+
+#include "test_PAS.h"
+#include "persistence_admin_service.h"
+#include "test_pas_data_restore_default.h"
+
+DLT_IMPORT_CONTEXT(persAdminSvcDLTCtx);
+
+#define LT_HDR "TEST_PAS >> "
+
+//===================================================================================================================
+// INIT
+//===================================================================================================================
+// using default structure offered by test framework
+
+//===================================================================================================================
+// EXPECTED
+//===================================================================================================================
+
+expected_key_data_localDB_s expected_key_data_after_restore_default_User2Seat1[16 + 16 + 16 + 16 + 16] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingA", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingA", sizeof("Data>>/pubSettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/pubSettingB::user2::seat1", sizeof("Data>>/pubSettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingB", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingB::user2:seat2", sizeof("Data>>/pubSettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSettingC", sizeof("Data>>/pubSettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user1", sizeof("Data>>/pubSetting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user2", sizeof("Data>>/pubSetting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user3", sizeof("Data>>/pubSetting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/ABC", PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/pubSetting/ABC::user4", sizeof("Data>>/pubSetting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingD", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingD", sizeof("Data>>/pubSettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, false,"Data>>/pubSettingE::user2:seat1", sizeof("Data>>/pubSettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/pubSettingE", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingE::user2:seat2", sizeof("Data>>/pubSettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/pubSettingF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSettingF", sizeof("Data>>/pubSettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user1", sizeof("Data>>/pubSetting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user2", sizeof("Data>>/pubSetting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user3", sizeof("Data>>/pubSetting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/pubSetting/DEF", PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/pubSetting/DEF::user4", sizeof("Data>>/pubSetting/DEF::user4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingA", sizeof("Data>>/gr10_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/gr10_SettingB::user2::seat1", sizeof("Data>>/gr10_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingB::user2:seat2", sizeof("Data>>/gr10_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_SettingC", sizeof("Data>>/gr10_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user1", sizeof("Data>>/gr10_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user2", sizeof("Data>>/gr10_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user3", sizeof("Data>>/gr10_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr10_Setting/ABC::user4", sizeof("Data>>/gr10_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingD", sizeof("Data>>/gr10_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, false,"Data>>/gr10_SettingE::user2:seat1", sizeof("Data>>/gr10_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr10_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingE::user2:seat2", sizeof("Data>>/gr10_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr10_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_SettingF", sizeof("Data>>/gr10_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user1", sizeof("Data>>/gr10_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user2", sizeof("Data>>/gr10_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user3", sizeof("Data>>/gr10_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr10_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"10/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr10_Setting/DEF::user4", sizeof("Data>>/gr10_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingA", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingA", sizeof("Data>>/gr20_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, false,"Data>>/gr20_SettingB::user2::seat1", sizeof("Data>>/gr20_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingB", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingB::user2:seat2", sizeof("Data>>/gr20_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_SettingC", sizeof("Data>>/gr20_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user1", sizeof("Data>>/gr20_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user2", sizeof("Data>>/gr20_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user3", sizeof("Data>>/gr20_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/ABC", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_WT_DB_NAME, true, "Data>>/gr20_Setting/ABC::user4", sizeof("Data>>/gr20_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingD", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingD", sizeof("Data>>/gr20_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, false,"Data>>/gr20_SettingE::user2:seat1", sizeof("Data>>/gr20_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/gr20_SettingE", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingE::user2:seat2", sizeof("Data>>/gr20_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/gr20_SettingF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_SettingF", sizeof("Data>>/gr20_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user1", sizeof("Data>>/gr20_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user2", sizeof("Data>>/gr20_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user3", sizeof("Data>>/gr20_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/gr20_Setting/DEF", PERS_ORG_SHARED_GROUP_WT_PATH_"20/"PERS_ORG_SHARED_CACHE_DB_NAME, true, "Data>>/gr20_Setting/DEF::user4", sizeof("Data>>/gr20_Setting/DEF::user4")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App1_SettingB::user2::seat1", sizeof("Data>>/App1_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingB::user2:seat2", sizeof("Data>>/App1_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_SettingC", sizeof("Data>>/App1_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user1", sizeof("Data>>/App1_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user2", sizeof("Data>>/App1_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user3", sizeof("Data>>/App1_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App1/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App1_Setting/ABC::user4", sizeof("Data>>/App1_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingD", sizeof("Data>>/App1_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App1_SettingE::user2:seat1", sizeof("Data>>/App1_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App1_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingE::user2:seat2", sizeof("Data>>/App1_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App1_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_SettingF", sizeof("Data>>/App1_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user1", sizeof("Data>>/App1_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user2", sizeof("Data>>/App1_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user3", sizeof("Data>>/App1_Setting/DEF::user4")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App1_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App1/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App1_Setting/DEF::user4", sizeof("Data>>/App1_Setting/DEF::user3")},
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingA", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingA", sizeof("Data>>/App1_SettingA")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, false,"Data>>/App2_SettingB::user2::seat1", sizeof("Data>>/App2_SettingB::user2::seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingB", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingB::user2:seat2", sizeof("Data>>/App2_SettingB::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_SettingC", sizeof("Data>>/App2_SettingC")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user1", sizeof("Data>>/App2_Setting/ABC::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user2", sizeof("Data>>/App2_Setting/ABC::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user3", sizeof("Data>>/App2_Setting/ABC::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/ABC", PERS_ORG_LOCAL_APP_WT_PATH_"App2/"PERS_ORG_LOCAL_WT_DB_NAME, true, "Data>>/App2_Setting/ABC::user4", sizeof("Data>>/App2_Setting/ABC::user4")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingD", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingD", sizeof("Data>>/App2_SettingD")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, false,"Data>>/App2_SettingE::user2:seat1", sizeof("Data>>/App2_SettingE::user2:seat1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/App2_SettingE", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingE::user2:seat2", sizeof("Data>>/App2_SettingE::user2:seat2")},
+ { PERS_ORG_NODE_FOLDER_NAME_"/App2_SettingF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_SettingF", sizeof("Data>>/App2_SettingF")},
+ { PERS_ORG_USER_FOLDER_NAME_"1/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user1", sizeof("Data>>/App2_Setting/DEF::user1")},
+ { PERS_ORG_USER_FOLDER_NAME_"2/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user2", sizeof("Data>>/App2_Setting/DEF::user2")},
+ { PERS_ORG_USER_FOLDER_NAME_"3/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user3", sizeof("Data>>/App2_Setting/DEF::user3")},
+ { PERS_ORG_USER_FOLDER_NAME_"4/App2_Setting/DEF", PERS_ORG_LOCAL_APP_CACHE_PATH_"App2/"PERS_ORG_LOCAL_CACHE_DB_NAME, true, "Data>>/App2_Setting/DEF::user4", sizeof("Data>>/App2_Setting/DEF::user4")},
+} ;
+
+expected_file_data_s expected_file_data_after_restore_default_User2Seat1[10 + 10 + 10 + 10 + 10] =
+{
+ /**********************************************************************************************************************************************
+ ***************************************** public *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/doc1.txt", true, "File>>/doc1.txt" , sizeof("File>>/doc1.txt")},
+ { PERS_ORG_SHARED_PUBLIC_WT_PATH_ PERS_ORG_NODE_FOLDER_NAME"/Docs/doc2.txt", true, "File>>/Docs/doc2.txt" , sizeof("File>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/1/docA.txt", true, "File>>/docA.txt::user1" , sizeof("File>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2/docA.txt", true, "File>>/docA.txt::user2" , sizeof("File>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/3/docA.txt", true, "File>>/docA.txt::user3" , sizeof("File>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/4/docA.txt", true, "File>>/docA.txt::user4" , sizeof("File>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false,"File>>/docB.txt::user2:seat1" , sizeof("File>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>/docB.txt::user2:seat2" , sizeof("File>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>/docB.txt::user2:seat3" , sizeof("File>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_PUBLIC_CACHE_PATH_ PERS_ORG_USER_FOLDER_NAME"/2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>/docB.txt::user2:seat4" , sizeof("File>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 10 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/gr10_1.txt", true, "File>>gr10_>>/gr10_1.txt" , sizeof("File>>gr10_>>/gr10_1.txt" )},
+ {PERS_ORG_SHARED_GROUP_WT_PATH_"10" PERS_ORG_NODE_FOLDER_NAME_"/Docs/gr10_A.txt", true, "File>>gr10_>>/Docs/gr10_A.txt" , sizeof("File>>gr10_>>/Docs/gr10_A.txt" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"1/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user1" , sizeof("File>>gr10_>>/gr10_2.txt::user1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user2" , sizeof("File>>gr10_>>/gr10_2.txt::user2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"3/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user3" , sizeof("File>>gr10_>>/gr10_2.txt::user3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"4/gr10_2.txt", true, "File>>gr10_>>/gr10_2.txt::user4" , sizeof("File>>gr10_>>/gr10_2.txt::user4" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/gr10_B.txt",false,"File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat1" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat2" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat3" )},
+ {PERS_ORG_SHARED_GROUP_CACHE_PATH_"10"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/gr10_B.txt",true, "File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" , sizeof("File>>gr10_>>/Docs/gr10_B.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** Group 20 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>gr20_>>/doc1.txt" , sizeof("File>>gr20_>>/doc1.txt")},
+ { PERS_ORG_SHARED_GROUP_WT_PATH_"20" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>gr20_>>/Docs/doc2.txt" , sizeof("File>>gr20_>>/Docs/doc2.txt")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>gr20_>>/docA.txt::user1", sizeof("File>>gr20_>>/docA.txt::user1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>gr20_>>/docA.txt::user2", sizeof("File>>gr20_>>/docA.txt::user2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>gr20_>>/docA.txt::user3", sizeof("File>>gr20_>>/docA.txt::user3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>gr20_>>/docA.txt::user4", sizeof("File>>gr20_>>/docA.txt::user4")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false,"File>>gr20_>>/docB.txt::user2:seat1" , sizeof("File>>gr20_>>/docB.txt::user2:seat1")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat2" , sizeof("File>>gr20_>>/docB.txt::user2:seat2")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat3" , sizeof("File>>gr20_>>/docB.txt::user2:seat3")},
+ { PERS_ORG_SHARED_GROUP_CACHE_PATH_"20"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>gr20_>>/docB.txt::user2:seat4" , sizeof("File>>gr20_>>/docB.txt::user2:seat4")},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App1 *******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App1>>/doc1.txt" , sizeof("File>>App1>>/doc1.txt" )},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App1" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App1>>/Docs/doc2.txt" , sizeof("File>>App1>>/Docs/doc2.txt" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App1>>/docA.txt::user1" , sizeof("File>>App1>>/docA.txt::user1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App1>>/docA.txt::user2" , sizeof("File>>App1>>/docA.txt::user2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App1>>/docA.txt::user3" , sizeof("File>>App1>>/docA.txt::user3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App1>>/docA.txt::user4" , sizeof("File>>App1>>/docA.txt::user4" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false,"File>>App1>>/docB.txt::user2:seat1" , sizeof("File>>App1>>/docB.txt::user2:seat1" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat2" , sizeof("File>>App1>>/docB.txt::user2:seat2" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat3" , sizeof("File>>App1>>/docB.txt::user2:seat3" )},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App1"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App1>>/docB.txt::user2:seat4" , sizeof("File>>App1>>/docB.txt::user2:seat4" )},
+
+
+ /**********************************************************************************************************************************************
+ ***************************************** App2*******************************************************************************************
+ *********************************************************************************************************************************************/
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/doc1.txt", true, "File>>App2>>/doc1.txt" , sizeof("File>>App2>>/doc1.txt")},
+ { PERS_ORG_LOCAL_APP_WT_PATH_"App2" PERS_ORG_NODE_FOLDER_NAME_"/Docs/doc2.txt", true, "File>>App2>>/Docs/doc2.txt" , sizeof("File>>App2>>/Docs/doc2.txt")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"1/docA.txt", true, "File>>App2>>/docA.txt::user1" , sizeof("File>>App2>>/docA.txt::user1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2/docA.txt", true, "File>>App2>>/docA.txt::user2" , sizeof("File>>App2>>/docA.txt::user2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"3/docA.txt", true, "File>>App2>>/docA.txt::user3" , sizeof("File>>App2>>/docA.txt::user3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"4/docA.txt", true, "File>>App2>>/docA.txt::user4" , sizeof("File>>App2>>/docA.txt::user4")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"1/Docs/docB.txt", false,"File>>App2>>/docB.txt::user2:seat1" , sizeof("File>>App2>>/docB.txt::user2:seat1")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"2/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat2" , sizeof("File>>App2>>/docB.txt::user2:seat2")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"3/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat3" , sizeof("File>>App2>>/docB.txt::user2:seat3")},
+ { PERS_ORG_LOCAL_APP_CACHE_PATH_"App2"PERS_ORG_USER_FOLDER_NAME_"2"PERS_ORG_SEAT_FOLDER_NAME_"4/Docs/docB.txt", true, "File>>App2>>/docB.txt::user2:seat4" , sizeof("File>>App2>>/docB.txt::user2:seat4")}
+} ;
+
+
+//===================================================================================================================
+
+bool_t Test_Restore_Configurable_Default_User2Seat1(sint_t type, void* pv)
+{
+ bool_t bEverythingOK = true;
+ long lRetVal;
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Restore configurable default for User2Seat1..."));
+
+ lRetVal = persAdminDataRestore( PersASSelectionType_User,
+ PersASDefaultSource_Configurable,
+ "",
+ 0x02,
+ 0x01);
+
+ if(lRetVal < PAS_SUCCESS)
+ {
+ bEverythingOK = false;
+ }
+
+ DLT_LOG(persAdminSvcDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR),
+ DLT_STRING("Test_Restore_Configurable_Default_User2Seat1: persAdminDataRestore() - "),
+ DLT_STRING(bEverythingOK ? "OK" : "FAILED"));
+ return bEverythingOK ;
+} /* Test_Restore_Configurable_Default_User2Seat1 */
diff --git a/test/pers_svc_test/webtool_export/resource2.tar.gz b/test/pers_svc_test/webtool_export/resource2.tar.gz
new file mode 100644
index 0000000..11b214b
--- /dev/null
+++ b/test/pers_svc_test/webtool_export/resource2.tar.gz
Binary files differ
diff --git a/test/persadmin_tool/Makefile.am b/test/persadmin_tool/Makefile.am
new file mode 100644
index 0000000..95a5357
--- /dev/null
+++ b/test/persadmin_tool/Makefile.am
@@ -0,0 +1,38 @@
+#######################################################################################################################
+#
+# Copyright (C) 2012 Continental Automotive Systems, Inc.
+#
+# Author: Ana.Chisca@continental-corporation.com
+#
+# Makefile template for the Persistence Administration Service Test Framework
+#
+# Process this file with automake to produce a Makefile.in.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#######################################################################################################################
+
+bin_PROGRAMS = persadmin_tool
+
+#
+#
+# persistence administration service tool for development
+#
+#
+
+persadmin_tool_CFLAGS = \
+ -I $(top_srcdir)/Administrator/inc/private -I $(top_srcdir)/Administrator/inc/public -I inc -I generated \
+ $(DLT_CFLAGS) \
+ $(PERSCOMMON_CFLAGS)
+
+persadmin_tool_LDFLAGS = \
+ $(PLATFORM_LDFLAGS)
+
+persadmin_tool_LDADD = \
+ $(DLT_LIBS) \
+ $(top_srcdir)/Administrator/libpers_admin_access_lib.la
+
+persadmin_tool_SOURCES = \
+ src/persadmin_tool.c
diff --git a/test/persadmin_tool/src/persadmin_tool.c b/test/persadmin_tool/src/persadmin_tool.c
new file mode 100644
index 0000000..2f241cb
--- /dev/null
+++ b/test/persadmin_tool/src/persadmin_tool.c
@@ -0,0 +1,407 @@
+/*********************************************************************************************************************
+*
+* Copyright (C) 2013 Continental Automotive Systems, Inc.
+*
+* Author: Ionut.Ieremie@continental-corporation.com
+*
+* Small tool (only for development purpose) to access (part of) functionality provided by Persistence Administrator.
+* To be used until SWL will be available.
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* Date Author Reason
+* 2013.09.19 uidl9757 CSP_WZ#5759: Add support for "restore"
+* 2013.05.28 uidl9757 CSP_WZ#12152: Created
+*
+**********************************************************************************************************************/
+
+#include "persComTypes.h"
+#include "stdio.h"
+#include "string.h"
+#include "persistence_admin_service.h"
+#include "dlt/dlt.h"
+
+#define LT_HDR "[Persadmin_Tool]:"
+DLT_DECLARE_CONTEXT (persadminToolDLTCtx)
+
+typedef enum _pastool_commands_e
+{
+ PASTOOL_CMD_INSTALL = 0,
+ PASTOOL_CMD_BACKUP,
+ PASTOOL_CMD_EXPORT,
+ PASTOOL_CMD_RECOVERY,
+ PASTOOL_CMD_IMPORT,
+ PASTOOL_CMD_RESTORE,
+ PASTOOL_CMD_SHOW_HELP,
+ /* add new entries here */
+ PASTOOL_CMD_LAST_ENTRY
+}pastool_commands_e ;
+
+typedef struct
+{
+ pastool_commands_e eCommand ;
+ int iExpectedArgsNo ;
+ char* pCommandName ;
+}pastool_command_name_s;
+
+typedef struct
+{
+ pastool_commands_e eCommand ;
+ char path[256] ;
+ PersASSelectionType_e eSelectionType ;
+ char appName[256] ;
+ unsigned int user_no ;
+ unsigned int seat_no ;
+}pastool_input_s ;
+
+static const pastool_command_name_s a_sCommandNames[] =
+{
+ {PASTOOL_CMD_INSTALL, 3, "install"},
+ {PASTOOL_CMD_BACKUP, 7, "backup"},
+ {PASTOOL_CMD_EXPORT, 4, "export"},
+ {PASTOOL_CMD_RECOVERY, 7, "recovery"},
+ {PASTOOL_CMD_IMPORT, 4, "import"},
+ {PASTOOL_CMD_RESTORE, 7, "restore"},
+ {PASTOOL_CMD_SHOW_HELP, 2, "help"},
+ {PASTOOL_CMD_SHOW_HELP, 2, "-help"},
+ {PASTOOL_CMD_SHOW_HELP, 2, "-h"},
+ {PASTOOL_CMD_SHOW_HELP, 2, "-?"},
+};
+
+static char g_msg[512] ;
+static pastool_input_s sInputCommand = {0};
+
+static bool_t pastool_parseArguments(int argc, char *argv[]);
+static void pastool_printHelp(void) ;
+static bool_t pastool_getCommand(char* arg, pastool_commands_e* peCommand_out) ;
+static void pastool_printArguments(pastool_input_s* psArguments, int iNumberOfArguments) ;
+static bool_t pastool_executeCommand(pastool_input_s* psArguments) ;
+
+static bool_t pastool_parseArguments(int argc, char *argv[])
+{
+ bool_t bCanContinue = true ;
+ int iNumberOfArguments = argc ;
+ if(iNumberOfArguments < 2)
+ {
+ bCanContinue = false ;
+ snprintf(g_msg, sizeof(g_msg), "%s:invalid number of arguments =%d", __FUNCTION__, iNumberOfArguments) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+
+ if(bCanContinue)
+ {
+ if( ! pastool_getCommand(argv[1], &sInputCommand.eCommand))
+ {
+ bCanContinue = false ;
+ }
+ else
+ {
+ /* check if the right number of parameters provided */
+ if(iNumberOfArguments != a_sCommandNames[sInputCommand.eCommand].iExpectedArgsNo)
+ {
+ bCanContinue = false ;
+ snprintf(g_msg, sizeof(g_msg), "%s:invalid number of arguments for <<%s>> %d (expected %d)",
+ __FUNCTION__, argv[1], iNumberOfArguments, a_sCommandNames[sInputCommand.eCommand].iExpectedArgsNo) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+ if(bCanContinue && (iNumberOfArguments > 2) )
+ {
+ /* argv[2] is always <<path>>
+ * Don't check the path (PAS will do it)
+ */
+ strncpy(sInputCommand.path, argv[2], sizeof(sInputCommand.path)) ;
+ }
+
+ if(bCanContinue && (iNumberOfArguments > 3))
+ {
+ /* argv[3] is always <<selection type>>
+ */
+ if(1 == sscanf(argv[3], "%d", (int*)&sInputCommand.eSelectionType))
+ {
+ if((sInputCommand.eSelectionType < PersASSelectionType_All) || (sInputCommand.eSelectionType >= PersASSelectionType_LastEntry))
+ {
+ bCanContinue = false ;
+ snprintf(g_msg, sizeof(g_msg), "%s:selection type = <<%d>>",
+ __FUNCTION__, sInputCommand.eSelectionType) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ }
+ }
+
+ if(bCanContinue && (iNumberOfArguments > 4))
+ {
+ /* argv[4] is always <<application>>
+ * Don't check the path (PAS will do it)
+ */
+ strncpy(sInputCommand.appName, argv[4], sizeof(sInputCommand.appName)) ;
+ }
+
+ if(bCanContinue && (iNumberOfArguments > 5))
+ {
+ /* argv[5] is always <<user number>> */
+ if(1 != sscanf(argv[5], "%d", &sInputCommand.user_no))
+ {
+ bCanContinue = false ;
+ snprintf(g_msg, sizeof(g_msg), "%s:invalid user_no = <<%s>>",
+ __FUNCTION__, argv[5]) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ if((-1) == sInputCommand.user_no)
+ {
+ sInputCommand.user_no = PERSIST_SELECT_ALL_USERS ;
+ }
+ }
+ }
+
+ if(bCanContinue && (iNumberOfArguments > 6))
+ {
+ /* argv[4] is always <<seat number>> */
+ if(1 != sscanf(argv[6], "%d", &sInputCommand.seat_no))
+ {
+ bCanContinue = false ;
+ snprintf(g_msg, sizeof(g_msg), "%s:invalid seat_no = <<%s>>",
+ __FUNCTION__, argv[6]) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ }
+ else
+ {
+ if((-1) == sInputCommand.seat_no)
+ {
+ sInputCommand.seat_no = PERSIST_SELECT_ALL_SEATS ;
+ }
+ }
+ }
+
+ return bCanContinue ;
+}
+
+static void pastool_printHelp(void)
+{
+
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("==================== PAS Tool - help ===================================================="));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Command format:"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" /usr/bin/persadmin_tool command path [selection_type][application] [user_no] [seat_no]"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("-----------------------------------------------------------------------------------------"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("| command | path | selection type | application | user_no | seat_no |"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("-----------------------------------------------------------------------------------------"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("| install | mandatory | na | na | na | na |"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("-----------------------------------------------------------------------------------------"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("| backup | mandatory | mandatory | mandatory | mandatory | mandatory |"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("-----------------------------------------------------------------------------------------"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("| recovery | mandatory | mandatory | mandatory | mandatory | mandatory |"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("-----------------------------------------------------------------------------------------"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("| export | mandatory | mandatory | na | na | na |"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("-----------------------------------------------------------------------------------------"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("| import | mandatory | mandatory | na | na | na |"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("-----------------------------------------------------------------------------------------"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("| restore | mandatory | mandatory | mandatory | mandatory | mandatory |"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("-----------------------------------------------------------------------------------------"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("| help | mandatory | mandatory | na | na | na |"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("-----------------------------------------------------------------------------------------"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("path meaning:"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" for install : abs pathname to input installation file (.tar.gz)"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" for backup : abs pathname to output backup file (.tar.gz)"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" for recovery : abs pathname to input backup file (.tar.gz)"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" for export : abs path to destination folder"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" for import : abs path to source folder"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" for restore : choose one of: FactoryDefault or ConfigDefault"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("selection type meaning:"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" <<0>> : select all data/files: (node+user)->(application+shared)"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" <<1>> : select user data/files: (user)->(application+shared)"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" <<2>> : select application data/files: (application)->(node+user)"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("user_no and seat_no meaning:"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" <<1 to 4>> : select a single user/seat"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" <<-1>> : select all users/seats"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("Examples:"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" /usr/bin/persadmin_tool install /tmp/resource.tar.gz"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" /usr/bin/persadmin_tool backup /tmp/backup 2 MyApp -1 -1"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" /usr/bin/persadmin_tool backup /tmp/backup 2 MyApp 2 -1"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" /usr/bin/persadmin_tool export /tmp/export 0"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(" /usr/bin/persadmin_tool restore FactoryDefault 2 MyApp -1 -1"));
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING("=========================================================================================="));
+}
+
+static void pastool_printArguments(pastool_input_s* psArguments, int iNumberOfArguments)
+{
+ snprintf(g_msg, sizeof(g_msg), "Called with:") ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ snprintf(g_msg, sizeof(g_msg), "command = <<%s>>", a_sCommandNames[psArguments->eCommand].pCommandName) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ snprintf(g_msg, sizeof(g_msg), "path = <<%s>>", psArguments->path) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ snprintf(g_msg, sizeof(g_msg), "selection type = <<%d>>",
+ (iNumberOfArguments > 3) ? psArguments->eSelectionType : (-1)) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ snprintf(g_msg, sizeof(g_msg), "application = <<%s>>",
+ (iNumberOfArguments > 4) ? psArguments->appName : "Not Applicable") ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ snprintf(g_msg, sizeof(g_msg), "user_no = <<%d>>",
+ (iNumberOfArguments > 5) ? psArguments->user_no : -1) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ snprintf(g_msg, sizeof(g_msg), "seat_no = <<%d>>",
+ (iNumberOfArguments > 6) ? psArguments->seat_no : -1) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+
+}
+
+static bool_t pastool_getCommand(char* arg, pastool_commands_e* peCommand_out)
+{
+ bool_t bFoundCommand = false ;
+
+ if(NULL != arg)
+ {
+ int i = 0 ;
+ for(i = 0 ; i < sizeof(a_sCommandNames)/sizeof(a_sCommandNames[0]) ; i++)
+ {
+ if(0 == strcmp(a_sCommandNames[i].pCommandName, arg))
+ {
+ *peCommand_out = a_sCommandNames[i].eCommand ;
+ bFoundCommand = true ;
+ break ;
+ }
+ }
+ }
+ else
+ {
+ bFoundCommand = false ;
+ }
+
+ return bFoundCommand ;
+}
+
+static bool_t pastool_executeCommand(pastool_input_s* psArguments)
+{
+ bool_t bEverythingOK = true ;
+ long result = -1 ;
+
+ switch(psArguments->eCommand)
+ {
+ case PASTOOL_CMD_SHOW_HELP:
+ {
+ pastool_printHelp() ;
+ break ;
+ }
+ case PASTOOL_CMD_INSTALL:
+ {
+ result = persAdminResourceConfigAdd(psArguments->path) ;
+ snprintf(g_msg, sizeof(g_msg), "persAdminResourceConfigAdd(%s) returned <<%ld>>", psArguments->path, result) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+ break ;
+ }
+ case PASTOOL_CMD_BACKUP:
+ {
+ result = persAdminDataBackupCreate(psArguments->eSelectionType, psArguments->path, psArguments->appName, psArguments->user_no, psArguments->seat_no);
+ snprintf(g_msg, sizeof(g_msg), "persAdminDataBackupCreate(<<%d>>, <<%s>>, <<%s>>, <<%d>>, <<%d>>) returned <<%ld>>",
+ psArguments->eSelectionType, psArguments->path, psArguments->appName, psArguments->user_no, psArguments->seat_no, result) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+ break ;
+ }
+ case PASTOOL_CMD_EXPORT:
+ {
+ result = persAdminDataFolderExport(psArguments->eSelectionType, psArguments->path);
+ snprintf(g_msg, sizeof(g_msg), "persAdminDataFolderExport(<<%d>>, <<%s>>) returned <<%ld>>",
+ psArguments->eSelectionType, psArguments->path, result) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+ break ;
+ }
+ case PASTOOL_CMD_RECOVERY:
+ {
+ long result = persAdminDataBackupRecovery(psArguments->eSelectionType, psArguments->path, psArguments->appName, psArguments->user_no, psArguments->seat_no);
+ snprintf(g_msg, sizeof(g_msg), "persAdminDataBackupRecovery(<<%d>>, <<%s>>, <<%s>>, <<%d>>, <<%d>>) returned <<%ld>>",
+ psArguments->eSelectionType, psArguments->path, psArguments->appName, psArguments->user_no, psArguments->seat_no, result) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+ break ;
+ }
+ case PASTOOL_CMD_IMPORT:
+ {
+ long result = persAdminDataFolderImport(psArguments->eSelectionType, psArguments->path);
+ snprintf(g_msg, sizeof(g_msg), "persAdminDataFolderImport(<<%d>>, <<%s>>) returned <<%ld>>",
+ psArguments->eSelectionType, psArguments->path, result) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+ break ;
+ }
+ case PASTOOL_CMD_RESTORE:
+ {
+ PersASDefaultSource_e defaultSource = PersASDefaultSource_Configurable;
+ if(0 == strcmp(psArguments->path, "ConfigDefault"))
+ {
+ defaultSource = PersASDefaultSource_Configurable;
+ }
+ result = persAdminDataRestore(psArguments->eSelectionType, defaultSource, psArguments->appName, psArguments->user_no, psArguments->seat_no);
+ snprintf(g_msg, sizeof(g_msg), "persAdminDataRestore(<<%d>>, <<%s>>, <<%s>>, <<%d>>, <<%d>>) returned <<%ld>>",
+ psArguments->eSelectionType, (PersASDefaultSource_Configurable==defaultSource)?"ConfigDefault":"FactoryDefault",
+ psArguments->appName, psArguments->user_no, psArguments->seat_no, result) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_INFO, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ if(result < 0)
+ {
+ bEverythingOK = false ;
+ }
+ break ;
+ }
+ default:
+ {
+ /* not possible, but just to be sure */
+ bEverythingOK = false ;
+ snprintf(g_msg, sizeof(g_msg), "unexpected command <<%d>> !!!", psArguments->eCommand) ;
+ DLT_LOG(persadminToolDLTCtx, DLT_LOG_ERROR, DLT_STRING(LT_HDR), DLT_STRING(g_msg));
+ break ;
+ }
+ }
+
+ return bEverythingOK ;
+}
+
+int main(int argc, char *argv[])
+{
+ bool_t bEverythingOK = true ;
+
+ DLT_REGISTER_APP("0037","PAS_Tool"); /* 0x0037 <=> OIP_SSW_PERSADMIN_TOOL */
+ DLT_REGISTER_CONTEXT(persadminToolDLTCtx,"PASt", "PAS_Tool");
+ DLT_ENABLE_LOCAL_PRINT() ;
+
+ if(pastool_parseArguments(argc, argv))
+ {
+ pastool_printArguments(&sInputCommand, argc);
+ if(! pastool_executeCommand(&sInputCommand))
+ {
+ bEverythingOK = false ;
+ }
+ }
+ else
+ {
+ bEverythingOK = false ;
+ pastool_printHelp() ;
+ }
+
+ DLT_UNREGISTER_CONTEXT(persadminToolDLTCtx) ;
+ DLT_UNREGISTER_APP() ;
+
+ return bEverythingOK ? 0 : (-1) ;
+}