icwmp/src/backupSession.c
2025-03-24 11:56:58 +00:00

775 lines
27 KiB
C

/*
* backupSession.c - API to store/load CWMP session in/from backup XML files
*
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
*
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
* Author Omar Kallel <omar.kallel@pivasoftware.com>
*
* See LICENSE file for license related information.
*
*/
#include <unistd.h>
#include "backupSession.h"
#include "log.h"
#include "event.h"
#include "sched_inform.h"
#include "download.h"
#include "upload.h"
#include "cwmp_du_state.h"
#include "notifications.h"
#include "xml.h"
#include "cwmp_event.h"
static mxml_node_t *bkp_tree = NULL;
struct search_keywords {
const char *name;
const char *value;
};
static int bkp_session_check_file();
int cwmp_init_backup_session(char **ret, enum backup_loading load)
{
if (bkp_session_check_file())
return 0;
return cwmp_load_saved_session(ret, load);
}
void bkp_tree_clean(void)
{
if (bkp_tree != NULL)
MXML_DELETE(bkp_tree);
return;
}
void bkp_session_save()
{
FILE *fp;
if (!bkp_tree)
return;
// cppcheck-suppress cert-MSC24-C
fp = fopen(CWMP_BKP_FILE, "w");
mxmlSaveFile(bkp_tree, fp, MXML_NO_CALLBACK);
fclose(fp);
}
void bkp_session_create_file()
{
FILE *pFile;
// cppcheck-suppress cert-MSC24-C
pFile = fopen(CWMP_BKP_FILE, "w");
if (pFile == NULL) {
CWMP_LOG(ERROR, "Unable to create %s file", CWMP_BKP_FILE);
return;
}
fprintf(pFile, "%s", CWMP_BACKUP_SESSION);
if (bkp_tree != NULL)
MXML_DELETE(bkp_tree);
bkp_tree = mxmlLoadString(NULL, CWMP_BACKUP_SESSION, MXML_OPAQUE_CALLBACK);
fclose(pFile);
}
int bkp_session_check_file()
{
if (!file_exists(CWMP_BKP_FILE)) {
bkp_session_create_file();
return -1;
}
if (bkp_tree == NULL) {
FILE *pFile;
// cppcheck-suppress cert-MSC24-C
pFile = fopen(CWMP_BKP_FILE, "r");
bkp_tree = mxmlLoadFile(NULL, pFile, MXML_OPAQUE_CALLBACK);
fclose(pFile);
}
if (bkp_tree == NULL) {
bkp_session_create_file();
return -1;
}
bkp_session_save();
return 0;
}
int save_acs_bkp_config()
{
CWMP_LOG(DEBUG, "%s:%d entry", __func__, __LINE__);
bkp_session_simple_insert("acs", "URL", cwmp_ctx.conf.acs_url);
bkp_session_save();
CWMP_LOG(DEBUG, "%s:%d exit", __func__, __LINE__);
return CWMP_OK;
}
static mxml_node_t *bkp_session_node_found(mxml_node_t *tree, const char *name, struct search_keywords *keys, int size)
{
mxml_node_t *b = tree, *c, *d;
struct search_keywords;
int i = 0;
if (!tree)
return NULL;
b = mxmlFindElement(b, b, name, NULL, NULL, MXML_DESCEND_FIRST);
while (b) {
c = mxmlGetFirstChild(b);
if (c) {
i = 0;
while (c && i < size) {
if (mxmlGetType(c) == MXML_ELEMENT && CWMP_STRCMP(keys[i].name, (char *) mxmlGetElement(c)) == 0) {
d = c;
d = mxmlWalkNext(d, c, MXML_DESCEND);
if ((keys[i].value == NULL) || (d && mxmlGetType(d) == MXML_OPAQUE && CWMP_STRCMP(keys[i].value, mxmlGetOpaque(d)) == 0))
i++;
}
c = mxmlWalkNext(c, b, MXML_NO_DESCEND);
}
}
if (i == size)
break;
b = mxmlWalkNext(b, tree, MXML_NO_DESCEND);
}
return b;
}
static mxml_node_t *get_bkp_session_node_by_id(mxml_node_t *tree, const char *name, int id)
{
struct search_keywords keys[1];
char bkp_id[32];
snprintf(bkp_id, sizeof(bkp_id), "%d", id);
keys[0].name = "id";
keys[0].value = bkp_id;
return bkp_session_node_found(tree, name, keys, 1);
}
static mxml_node_t *get_bkp_session_node_by_key(mxml_node_t *tree, const char *name, const char *key_name, const char *key_value)
{
struct search_keywords keys[1];
keys[0].name = key_name;
keys[0].value = key_value;
return bkp_session_node_found(tree, name, keys, 1);
}
/*
* Insert Backup Session
*/
mxml_node_t *bkp_session_insert(mxml_node_t *tree, const char *name, const char *value)
{
mxml_node_t *b;
if (tree == NULL || name == NULL) {
CWMP_LOG(ERROR, "backup %s: tree or name is null: %p %p", __FUNCTION__, tree, name);
return NULL;
}
b = mxmlNewElement(tree, name);
if (b == NULL)
return NULL;
if (value != NULL)
mxmlNewOpaque(b, value);
return b;
}
void bkp_session_simple_insert(const char *parent, const char *child, const char *value)
{
mxml_node_t *b = bkp_tree;
if (parent == NULL || child == NULL) {
CWMP_LOG(ERROR, "backup %s: parent or child is null %p %p", __FUNCTION__, parent, child);
return;
}
b = mxmlFindElement(b, b, parent, NULL, NULL, MXML_DESCEND);
if (b)
mxmlDelete(b);
b = bkp_session_insert(bkp_tree, parent, NULL);
bkp_session_insert(b, child, value);
}
void bkp_session_simple_insert_in_parent(const char *parent, const char *child, const char *value)
{
mxml_node_t *n, *b = bkp_tree;
if (parent == NULL || child == NULL) {
CWMP_LOG(ERROR, "backup %s: parent or child is null %p %p", __FUNCTION__, parent, child);
return;
}
n = mxmlFindElement(b, b, parent, NULL, NULL, MXML_DESCEND);
if (!n)
n = bkp_session_insert(bkp_tree, parent, NULL);
b = mxmlFindElement(n, n, child, NULL, NULL, MXML_DESCEND);
if (b)
mxmlDelete(b);
bkp_session_insert(n, child, value);
}
mxml_node_t *bkp_session_insert_event(int index, char *command_key, int id)
{
mxml_node_t *b;
b = get_bkp_session_node_by_id(bkp_tree, "cwmp_event", id);
if (!b) {
struct xml_data_struct bkp_xml_event = {0};
bkp_xml_event.command_key = command_key ? &command_key : NULL;
bkp_xml_event.id = &id;
bkp_xml_event.index = &index;
int fault = build_xml_node_data(BKP_EVT_BUILD, bkp_tree, &bkp_xml_event);
if (fault != CWMP_OK)
return NULL;
b = get_bkp_session_node_by_id(bkp_tree, "cwmp_event", id);
}
return b;
}
void bkp_session_insert_schedule_inform(int id, time_t time, char *command_key)
{
mxml_node_t *b;
b = get_bkp_session_node_by_id(bkp_tree, "schedule_inform", id);
if (!b) {
struct xml_data_struct bkp_xml_sched_inform = {0};
bkp_xml_sched_inform.command_key = command_key ? &command_key : NULL;
bkp_xml_sched_inform.time = (int *)&time;
bkp_xml_sched_inform.id = &id;
build_xml_node_data(BKP_SCHEDULE_INFORM_BUILD, bkp_tree, &bkp_xml_sched_inform);
}
}
void bkp_session_insert_download(struct download *pdownload)
{
mxml_node_t *b;
b = get_bkp_session_node_by_id(bkp_tree, "download", pdownload->id);
if (!b) {
struct xml_data_struct bkp_xml_download = {0};
bkp_xml_download.url = pdownload->url ? &pdownload->url : NULL;
bkp_xml_download.command_key = pdownload->command_key ? &pdownload->command_key : NULL;
bkp_xml_download.file_type = pdownload->file_type ? &pdownload->file_type : NULL;
bkp_xml_download.username = pdownload->username ? &pdownload->username : NULL;
bkp_xml_download.password = pdownload->password ? &pdownload->password : NULL;
bkp_xml_download.file_size = &pdownload->file_size;
bkp_xml_download.time = (int *)&pdownload->scheduled_time;
bkp_xml_download.id = &pdownload->id;
build_xml_node_data(BKP_DOWNLOAD_BUILD, bkp_tree, &bkp_xml_download);
}
}
void bkp_session_insert_schedule_download(struct download *pschedule_download)
{
mxml_node_t *b;
b = get_bkp_session_node_by_id(bkp_tree, "schedule_download", pschedule_download->id);
if (!b) {
struct xml_data_struct bkp_xml_sched_download = {0};
bkp_xml_sched_download.url = pschedule_download->url ? &pschedule_download->url : NULL;
bkp_xml_sched_download.command_key = pschedule_download->command_key ? &pschedule_download->command_key : NULL;
bkp_xml_sched_download.file_type = pschedule_download->file_type ? &pschedule_download->file_type : NULL;
bkp_xml_sched_download.username = pschedule_download->username ? &pschedule_download->username : NULL;
bkp_xml_sched_download.password = pschedule_download->password ? &pschedule_download->password : NULL;
bkp_xml_sched_download.file_size = &pschedule_download->file_size;
bkp_xml_sched_download.window_start1 = &pschedule_download->timewindowstruct[0].windowstart;
bkp_xml_sched_download.window_start2 = &pschedule_download->timewindowstruct[1].windowstart;
bkp_xml_sched_download.window_end1 = &pschedule_download->timewindowstruct[0].windowend;
bkp_xml_sched_download.window_end2 = &pschedule_download->timewindowstruct[1].windowend;
bkp_xml_sched_download.user_message1 = &pschedule_download->timewindowstruct[0].usermessage;
bkp_xml_sched_download.user_message2 = &pschedule_download->timewindowstruct[1].usermessage;
bkp_xml_sched_download.window_mode1 = &pschedule_download->timewindowstruct[0].windowmode;
bkp_xml_sched_download.window_mode2 = &pschedule_download->timewindowstruct[1].windowmode;
bkp_xml_sched_download.max_retries1 = &pschedule_download->timewindowstruct[0].maxretries;
bkp_xml_sched_download.max_retries2 = &pschedule_download->timewindowstruct[1].maxretries;
bkp_xml_sched_download.id = &pschedule_download->id;
build_xml_node_data(BKP_SCHED_DOWNLOAD_BUILD, bkp_tree, &bkp_xml_sched_download);
}
}
void bkp_session_insert_change_du_state(struct change_du_state *pchange_du_state)
{
LIST_HEAD(cdu_operations_xml_list);
struct xml_data_struct bkp_xml_cdu = {0};
bkp_xml_cdu.time = (int *)&pchange_du_state->timeout;
bkp_xml_cdu.command_key = &pchange_du_state->command_key;
bkp_xml_cdu.id = &pchange_du_state->id;
cdu_operations_list_to_xml_data_list(&(pchange_du_state->list_operation), &cdu_operations_xml_list);
bkp_xml_cdu.data_list = &cdu_operations_xml_list;
build_xml_node_data(BKP_CDU_BUILD, bkp_tree, &bkp_xml_cdu);
}
void bkp_session_insert_upload(struct upload *pupload)
{
mxml_node_t *b;
b = get_bkp_session_node_by_id(bkp_tree, "upload", pupload->id);
if (!b) {
struct xml_data_struct bkp_xml_upload = {0};
bkp_xml_upload.command_key = &pupload->command_key;
bkp_xml_upload.file_type = &pupload->file_type;
bkp_xml_upload.username = &pupload->username;
bkp_xml_upload.password = &pupload->password;
bkp_xml_upload.time = (int *)&pupload->scheduled_time;
bkp_xml_upload.url = &pupload->url;
bkp_xml_upload.id = &pupload->id;
build_xml_node_data(BKP_UPLOAD_BUILD, bkp_tree, &bkp_xml_upload);
}
}
void bkp_session_insert_autonomous_du_state_change(auto_du_state_change_compl *data)
{
mxml_node_t *b;
if (data == NULL)
return;
b = get_bkp_session_node_by_id(bkp_tree, "autonomous_du_state_change_complete", data->id);
if (!b) {
struct xml_data_struct bkp_xml_auto_cdu = {0};
bkp_xml_auto_cdu.uuid = &data->uuid;
bkp_xml_auto_cdu.version = data->ver ? &data->ver : NULL;
bkp_xml_auto_cdu.current_state = data->current_state ? &data->current_state : NULL;
bkp_xml_auto_cdu.resolved = &data->resolved;
bkp_xml_auto_cdu.start_time = data->start_time ? &data->start_time : NULL;
bkp_xml_auto_cdu.complete_time = data->complete_time ? &data->complete_time : NULL;
bkp_xml_auto_cdu.fault_code = &data->fault_code;
bkp_xml_auto_cdu.fault_string = data->fault_string ? &data->fault_string : NULL;
bkp_xml_auto_cdu.operation = data->operation ? &data->operation : NULL;
bkp_xml_auto_cdu.id = &data->id;
build_xml_node_data(BKP_AUTO_CDU_BUILD, bkp_tree, &bkp_xml_auto_cdu);
}
}
void bkp_session_insert_autonomous_transfer_complete(auto_transfer_complete *data)
{
mxml_node_t *b;
if (data == NULL)
return;
b = get_bkp_session_node_by_id(bkp_tree, "autonomous_transfer_complete", data->id);
if (!b) {
struct xml_data_struct bkp_xml_auto_tc = {0};
bkp_xml_auto_tc.announce_url = data->announce_url ? &data->announce_url : NULL;
bkp_xml_auto_tc.transfer_url = data->transfer_url ? &data->transfer_url : NULL;
bkp_xml_auto_tc.is_download = &data->is_download;
bkp_xml_auto_tc.file_type = data->file_type ? &data->file_type : NULL;
bkp_xml_auto_tc.file_size = &data->file_size;
bkp_xml_auto_tc.start_time = data->start_time ? &data->start_time : NULL;
bkp_xml_auto_tc.complete_time = data->complete_time ? &data->complete_time : NULL;
bkp_xml_auto_tc.fault_code = &data->fault_code;
bkp_xml_auto_tc.fault_string = data->fault_string ? &data->fault_string : NULL;
bkp_xml_auto_tc.id = &data->id;
build_xml_node_data(BKP_AUTO_TRANSFER_COMPLETE_BUILD, bkp_tree, &bkp_xml_auto_tc);
}
}
void bkp_session_insert_du_state_change_complete(struct du_state_change_complete *pdu_state_change_complete)
{
struct xml_data_struct bkp_xml_auto_cdu_complete = {0};
LIST_HEAD(opresult_xml_data_list);
cdu_operations_result_list_to_xml_data_list(&(pdu_state_change_complete->list_opresult), &opresult_xml_data_list);
bkp_xml_auto_cdu_complete.command_key = &pdu_state_change_complete->command_key;
bkp_xml_auto_cdu_complete.time = (int *)&pdu_state_change_complete->timeout;
bkp_xml_auto_cdu_complete.data_list = &opresult_xml_data_list;
bkp_xml_auto_cdu_complete.id = &pdu_state_change_complete->id;
build_xml_node_data(BKP_CDU_COMPLETE_BUILD, bkp_tree, &bkp_xml_auto_cdu_complete);
}
void bkp_session_insert_transfer_complete(struct transfer_complete *ptransfer_complete)
{
mxml_node_t *b;
b = get_bkp_session_node_by_key(bkp_tree, "transfer_complete", "start_time", ptransfer_complete->start_time);
if (!b) {
struct xml_data_struct bkp_xml_tc = {0};
bkp_xml_tc.command_key = ptransfer_complete->command_key ? &ptransfer_complete->command_key : NULL;
bkp_xml_tc.start_time = ptransfer_complete->start_time ? &ptransfer_complete->start_time : NULL;
bkp_xml_tc.complete_time = ptransfer_complete->complete_time ? &ptransfer_complete->complete_time : NULL;
bkp_xml_tc.old_software_version = ptransfer_complete->old_software_version ? &ptransfer_complete->old_software_version : NULL;
bkp_xml_tc.fault_code = &ptransfer_complete->fault_code;
bkp_xml_tc.fault_string = ptransfer_complete->fault_string ? &ptransfer_complete->fault_string : NULL;
bkp_xml_tc.type = &ptransfer_complete->type;
build_xml_node_data(BKP_TRANSFER_COMPLETE_BUILD, bkp_tree, &bkp_xml_tc);
}
}
/*
* Load backup session
*/
static char *load_child_value(mxml_node_t *tree, const char *sub_name)
{
char *value = NULL;
mxml_node_t *b = tree;
if (b) {
b = mxmlFindElement(b, b, sub_name, NULL, NULL, MXML_DESCEND);
if (b) {
b = mxmlWalkNext(b, tree, MXML_DESCEND);
if (b && mxmlGetType(b) == MXML_OPAQUE) {
const char *opaque = mxmlGetOpaque(b);
if (opaque != NULL) {
value = strdup(opaque);
}
}
}
}
return value;
}
static void load_queue_event(mxml_node_t *tree)
{
int idx = -1, id = -1;
struct xml_data_struct bkp_xml_evt = {0};
bkp_xml_evt.index = &idx;
bkp_xml_evt.id = &id;
load_xml_node_data(BKP_EVT_LOAD, tree, &bkp_xml_evt);
}
static void load_schedule_inform(mxml_node_t *tree)
{
char *command_key = NULL;
time_t scheduled_time = 0;
struct schedule_inform *schedule_inform = NULL;
struct list_head *ilist = NULL;
struct xml_data_struct bkp_xml_schedule_inform = {0};
bkp_xml_schedule_inform.command_key = &command_key;
bkp_xml_schedule_inform.time = (int *)&scheduled_time;
load_xml_node_data(BKP_SCHEDULE_INFORM, tree, &bkp_xml_schedule_inform);
list_for_each (ilist, &(list_schedule_inform)) {
schedule_inform = list_entry(ilist, struct schedule_inform, list);
if (schedule_inform->scheduled_time > scheduled_time) {
break;
}
}
schedule_inform = calloc(1, sizeof(struct schedule_inform));
if (schedule_inform != NULL) {
schedule_inform->commandKey = command_key;
schedule_inform->scheduled_time = scheduled_time;
list_add(&(schedule_inform->list), ilist->prev);
}
}
static void load_download(mxml_node_t *tree)
{
struct download *download_request = NULL;
struct list_head *ilist = NULL;
struct download *idownload_request = NULL;
if (tree == NULL) {
CWMP_LOG(ERROR, "backup %s: tree is null", __FUNCTION__);
return;
}
download_request = calloc(1, sizeof(struct download));
if (download_request == NULL) {
CWMP_LOG(ERROR, "backup %s: download_request is null", __FUNCTION__);
return;
}
struct xml_data_struct bkp_xml_download = {0};
bkp_xml_download.command_key = &download_request->command_key;
bkp_xml_download.url = &download_request->url;
bkp_xml_download.file_type = &download_request->file_type;
bkp_xml_download.username = &download_request->username;
bkp_xml_download.password = &download_request->password;
bkp_xml_download.file_size = &download_request->file_size;
bkp_xml_download.time = (int *)&download_request->scheduled_time;
bkp_xml_download.id = &download_request->id;
load_xml_node_data(BKP_DOWNLOAD, tree, &bkp_xml_download);
download_request->handler_timer.cb = cwmp_start_download;
list_for_each (ilist, &(list_download)) {
idownload_request = list_entry(ilist, struct download, list);
if (idownload_request->scheduled_time > download_request->scheduled_time) {
break;
}
}
list_add(&(download_request->list), ilist->prev);
if (download_request->scheduled_time != 0)
count_download_queue++;
cwmp_set_end_session(END_SESSION_DOWNLOAD);
}
static void load_schedule_download(mxml_node_t *tree)
{
struct download *download_request = NULL;
struct list_head *ilist = NULL;
struct download *idownload_request = NULL;
if (tree == NULL) {
CWMP_LOG(ERROR, "backup %s: tree is null", __FUNCTION__);
return;
}
download_request = calloc(1, sizeof(struct download));
if (download_request == NULL) {
CWMP_LOG(ERROR, "backup %s: download_request is null", __FUNCTION__);
return;
}
struct xml_data_struct bkp_xml_sched_download = {0};
bkp_xml_sched_download.command_key = &download_request->command_key;
bkp_xml_sched_download.url = &download_request->url;
bkp_xml_sched_download.file_type = &download_request->file_type;
bkp_xml_sched_download.username = &download_request->username;
bkp_xml_sched_download.password = &download_request->password;
bkp_xml_sched_download.file_size = &download_request->file_size;
bkp_xml_sched_download.window_start1 = &download_request->timewindowstruct[0].windowstart;
bkp_xml_sched_download.window_start2 = &download_request->timewindowstruct[1].windowstart;
bkp_xml_sched_download.window_end1 = &download_request->timewindowstruct[0].windowend;
bkp_xml_sched_download.window_end2 = &download_request->timewindowstruct[1].windowend;
bkp_xml_sched_download.window_mode1 = &download_request->timewindowstruct[0].windowmode;
bkp_xml_sched_download.window_mode2 = &download_request->timewindowstruct[1].windowmode;
bkp_xml_sched_download.user_message1 = &download_request->timewindowstruct[0].usermessage;
bkp_xml_sched_download.user_message2 = &download_request->timewindowstruct[1].usermessage;
bkp_xml_sched_download.max_retries1 = &download_request->timewindowstruct[0].maxretries;
bkp_xml_sched_download.max_retries2 = &download_request->timewindowstruct[1].maxretries;
bkp_xml_sched_download.id = &download_request->id;
load_xml_node_data(BKP_SCHED_DOWNLOAD, tree, &bkp_xml_sched_download);
list_for_each (ilist, &(list_schedule_download)) {
idownload_request = list_entry(ilist, struct download, list);
if (idownload_request->timewindowstruct[0].windowstart > download_request->timewindowstruct[0].windowstart) {
break;
}
}
list_add(&(download_request->list), ilist->prev);
if (download_request->timewindowstruct[0].windowstart != 0)
count_download_queue++;
cwmp_set_end_session(END_SESSION_SCHEDULE_DOWNLOAD);
}
static void load_upload(mxml_node_t *tree)
{
struct upload *upload_request = NULL;
struct list_head *ilist = NULL;
struct upload *iupload_request = NULL;
if (tree == NULL) {
CWMP_LOG(ERROR, "backup %s: tree is null", __FUNCTION__);
return;
}
upload_request = calloc(1, sizeof(struct upload));
if (upload_request == NULL) {
CWMP_LOG(ERROR, "backup %s: download_request is null", __FUNCTION__);
return;
}
struct xml_data_struct bkp_xml_upload = {0};
bkp_xml_upload.url = &upload_request->url;
bkp_xml_upload.command_key = &upload_request->command_key;
bkp_xml_upload.file_type = &upload_request->file_type;
bkp_xml_upload.username = &upload_request->username;
bkp_xml_upload.password = &upload_request->password;
bkp_xml_upload.time = (int *)&upload_request->scheduled_time;
bkp_xml_upload.id = &upload_request->id;
load_xml_node_data(BKP_UPLOAD, tree, &bkp_xml_upload);
list_for_each (ilist, &(list_upload)) {
iupload_request = list_entry(ilist, struct upload, list);
if (iupload_request->scheduled_time > upload_request->scheduled_time) {
break;
}
}
list_add(&(upload_request->list), ilist->prev);
if (upload_request->scheduled_time != 0)
count_upload_queue++;
cwmp_set_end_session(END_SESSION_UPLOAD);
}
static void load_change_du_state(mxml_node_t *tree)
{
if (tree == NULL) {
CWMP_LOG(ERROR, "backup %s: tree is null", __FUNCTION__);
return;
}
struct change_du_state *change_du_state_request = NULL;
change_du_state_request = calloc(1, sizeof(struct change_du_state));
INIT_LIST_HEAD(&(change_du_state_request->list_operation));
struct xml_data_struct bkp_xml_cdu = {0};
bkp_xml_cdu.command_key = &change_du_state_request->command_key;
bkp_xml_cdu.time = (int *)&change_du_state_request->timeout;
bkp_xml_cdu.cdu = change_du_state_request;
bkp_xml_cdu.id = &change_du_state_request->id;
load_xml_node_data(BKP_CDU, tree, &bkp_xml_cdu);
list_add_tail(&(change_du_state_request->list_operation), &(list_change_du_state));
cwmp_set_end_session(END_SESSION_CDU);
}
void load_du_state_change_complete(mxml_node_t *tree)
{
struct du_state_change_complete *du_state_change_complete_request = NULL;
du_state_change_complete_request = calloc(1, sizeof(struct du_state_change_complete));
INIT_LIST_HEAD(&(du_state_change_complete_request->list_opresult));
struct xml_data_struct bkp_xml_cdu_complete = {0};
bkp_xml_cdu_complete.command_key = &du_state_change_complete_request->command_key;
bkp_xml_cdu_complete.time = (int *)&du_state_change_complete_request->timeout;
bkp_xml_cdu_complete.id = &du_state_change_complete_request->id;
bkp_xml_cdu_complete.cdu_complete = du_state_change_complete_request;
load_xml_node_data(BKP_CDU_COMPLETE, tree, &bkp_xml_cdu_complete);
cwmp_root_cause_changedustate_complete(du_state_change_complete_request);
}
static void load_transfer_complete(mxml_node_t *tree)
{
struct transfer_complete *ptransfer_complete;
ptransfer_complete = calloc(1, sizeof(struct transfer_complete));
struct xml_data_struct bkp_xml_transfer_complete = {0};
bkp_xml_transfer_complete.command_key = &ptransfer_complete->command_key;
bkp_xml_transfer_complete.start_time = &ptransfer_complete->start_time;
bkp_xml_transfer_complete.complete_time = &ptransfer_complete->complete_time;
bkp_xml_transfer_complete.old_software_version = &ptransfer_complete->old_software_version;
bkp_xml_transfer_complete.fault_code = &ptransfer_complete->fault_code;
bkp_xml_transfer_complete.fault_string = &ptransfer_complete->fault_string;
bkp_xml_transfer_complete.type = &ptransfer_complete->type;
load_xml_node_data(BKP_TRANSFER_COMPLETE, tree, &bkp_xml_transfer_complete);
cwmp_root_cause_transfer_complete(ptransfer_complete);
sotfware_version_value_change(ptransfer_complete);
}
static void load_autonomous_du_state_change_complete(mxml_node_t *tree)
{
auto_du_state_change_compl *p;
p = calloc(1, sizeof(auto_du_state_change_compl));
struct xml_data_struct bkp_xml_auto_change_complete = {0};
bkp_xml_auto_change_complete.uuid = &p->uuid;
bkp_xml_auto_change_complete.version = &p->ver;
bkp_xml_auto_change_complete.current_state = &p->current_state;
bkp_xml_auto_change_complete.resolved = &p->resolved;
bkp_xml_auto_change_complete.start_time = &p->start_time;
bkp_xml_auto_change_complete.complete_time = &p->complete_time;
bkp_xml_auto_change_complete.fault_code = &p->fault_code;
bkp_xml_auto_change_complete.fault_string = &p->fault_string;
bkp_xml_auto_change_complete.operation = &p->operation;
bkp_xml_auto_change_complete.id = &p->id;
load_xml_node_data(BKP_AUTO_CDU, tree, &bkp_xml_auto_change_complete);
cwmp_root_cause_autonomous_cdu_complete(p);
}
static void load_autonomous_transfer_complete(mxml_node_t *tree)
{
auto_transfer_complete *p;
p = calloc(1, sizeof(auto_transfer_complete));
struct xml_data_struct bkp_xml_auto_transfer_complete = {0};
bkp_xml_auto_transfer_complete.announce_url = &p->announce_url;
bkp_xml_auto_transfer_complete.transfer_url = &p->transfer_url;
bkp_xml_auto_transfer_complete.is_download = &p->is_download;
bkp_xml_auto_transfer_complete.file_type = &p->file_type;
bkp_xml_auto_transfer_complete.file_size = &p->file_size;
bkp_xml_auto_transfer_complete.start_time = &p->start_time;
bkp_xml_auto_transfer_complete.complete_time = &p->complete_time;
bkp_xml_auto_transfer_complete.fault_code = &p->fault_code;
bkp_xml_auto_transfer_complete.fault_string = &p->fault_string;
bkp_xml_auto_transfer_complete.id = &p->id;
load_xml_node_data(BKP_AUTO_TRANSFER_COMPLETE, tree, &bkp_xml_auto_transfer_complete);
cwmp_root_cause_autonomous_transfer_complete(p);
}
int cwmp_load_saved_session(char **ret, enum backup_loading load)
{
mxml_node_t *b;
b = bkp_tree;
b = mxmlWalkNext(b, bkp_tree, MXML_DESCEND);
while (b) {
mxml_type_t ntype = mxmlGetType(b);
const char *elem_name = mxmlGetElement(b);
if (load == ACS) {
if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "acs") == 0) {
*ret = load_child_value(b, "URL");
break;
}
}
if (load == CR_IP) {
if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "connection_request") == 0) {
*ret = load_child_value(b, "ip");
break;
}
}
if (load == CR_IPv6) {
if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "connection_request") == 0) {
*ret = load_child_value(b, "ipv6");
break;
}
}
if (load == CR_PORT) {
if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "connection_request") == 0) {
*ret = load_child_value(b, "port");
break;
}
}
if (load == ALL) {
if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "cwmp_event") == 0) {
load_queue_event(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "download") == 0) {
load_download(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "upload") == 0) {
load_upload(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "transfer_complete") == 0) {
load_transfer_complete(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "schedule_inform") == 0) {
load_schedule_inform(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "change_du_state") == 0) {
load_change_du_state(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "du_state_change_complete") == 0) {
load_du_state_change_complete(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "schedule_download") == 0) {
load_schedule_download(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "autonomous_du_state_change_complete") == 0) {
load_autonomous_du_state_change_complete(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "autonomous_transfer_complete") == 0) {
load_autonomous_transfer_complete(b);
}
}
b = mxmlWalkNext(b, bkp_tree, MXML_NO_DESCEND);
}
return CWMP_OK;
}
/*
* Delete Backup Session
*/
void bkp_session_delete_element(const char *element_name, int id)
{
mxml_node_t *b = get_bkp_session_node_by_id(bkp_tree, element_name, id);
if (b)
mxmlDelete(b);
}
void bkp_session_delete_element_by_key(const char *element_name, const char *key_name, const char *key_value)
{
mxml_node_t *b = get_bkp_session_node_by_key(bkp_tree, element_name, key_name, key_value);
if (b)
mxmlDelete(b);
}