diff options
author | Guy Sagnes <guy.sagnes@continental-corporation.com> | 2014-02-25 10:48:09 +0100 |
---|---|---|
committer | Guy Sagnes <guy.sagnes@continental-corporation.com> | 2014-02-25 12:00:15 +0100 |
commit | 07c6ef3793385b6237092910e5a585253e44c979 (patch) | |
tree | e8a49a4e054de83794ebea7b0ae7e271d5b772d7 | |
download | persistence-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>
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 @@ -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 Binary files differnew file mode 100644 index 0000000..114abdc --- /dev/null +++ b/Administrator/doc/AutoTools HowTo.docx 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 (¬ifThreadFlagMtx); + notifThreadFlag = REG_FLAG_SET; + pthread_cond_signal (¬ifThreadFlagCV); + pthread_mutex_unlock (¬ifThreadFlagMtx); + #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 (¬ifThreadFlagMtx); + while (!notifThreadFlag) + { + pthread_cond_wait (¬ifThreadFlagCV, ¬ifThreadFlagMtx); + } + pthread_mutex_unlock (¬ifThreadFlagMtx); + + + /* 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(×tamp, 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 ) ; +} @@ -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 @@ -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 @@ -0,0 +1,3 @@ +1.0.1 +===== +* Initial release of the PersistenceAdministrationService @@ -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 Binary files differnew file mode 100644 index 0000000..11b214b --- /dev/null +++ b/test/pers_svc_test/webtool_export/resource2.tar.gz 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) ;
+}
|