ladishd: save/load project description and notes

This commit is contained in:
Nedko Arnaudov 2010-11-18 05:07:34 +02:00
parent 18e317ff4b
commit dba04d196e
5 changed files with 123 additions and 15 deletions

View File

@ -51,6 +51,8 @@
#define PARSE_CONTEXT_ROOMS 15
#define PARSE_CONTEXT_ROOM 16
#define PARSE_CONTEXT_PROJECT 17
#define PARSE_CONTEXT_DESCRIPTION 18
#define PARSE_CONTEXT_NOTES 19
#define MAX_STACK_DEPTH 10
#define MAX_DATA_SIZE 10240

View File

@ -51,7 +51,9 @@ static void callback_chrdata(void * data, const XML_Char * s, int len)
if (context_ptr->element[context_ptr->depth] == PARSE_CONTEXT_PARAMETER ||
context_ptr->element[context_ptr->depth] == PARSE_CONTEXT_KEY ||
context_ptr->element[context_ptr->depth] == PARSE_CONTEXT_APPLICATION)
context_ptr->element[context_ptr->depth] == PARSE_CONTEXT_APPLICATION ||
context_ptr->element[context_ptr->depth] == PARSE_CONTEXT_DESCRIPTION ||
context_ptr->element[context_ptr->depth] == PARSE_CONTEXT_NOTES)
{
if (context_ptr->data_used + len >= sizeof(context_ptr->data))
{
@ -119,6 +121,38 @@ static void callback_elstart(void * data, const char * el, const char ** attr)
return;
}
if (strcmp(el, "description") == 0)
{
//log_info("<description>");
if (room_ptr->project_description != NULL)
{
log_error("project description is already set");
context_ptr->error = XML_TRUE;
return;
}
context_ptr->element[++context_ptr->depth] = PARSE_CONTEXT_DESCRIPTION;
context_ptr->data_used = 0;
return;
}
if (strcmp(el, "notes") == 0)
{
//log_info("<notes>");
if (room_ptr->project_notes != NULL)
{
log_error("project notes are already set");
context_ptr->error = XML_TRUE;
return;
}
context_ptr->element[++context_ptr->depth] = PARSE_CONTEXT_NOTES;
context_ptr->data_used = 0;
return;
}
if (strcmp(el, "jack") == 0)
{
//log_info("<jack>");
@ -631,6 +665,32 @@ static void callback_elend(void * data, const char * el)
context_ptr->error = XML_TRUE;
}
}
else if (context_ptr->element[context_ptr->depth] == PARSE_CONTEXT_DESCRIPTION)
{
context_ptr->data[unescape(context_ptr->data, context_ptr->data_used, context_ptr->data)] = 0;
//log_info("</description>");
//log_info("[%s]", context_ptr->data);
ASSERT(room_ptr->project_description == NULL);
room_ptr->project_description = strdup(context_ptr->data);
if (room_ptr->project_description == NULL)
{
ladish_notify_simple(LADISH_NOTIFY_URGENCY_HIGH, "Project description failed to load", LADISH_CHECK_LOG_TEXT);
}
}
else if (context_ptr->element[context_ptr->depth] == PARSE_CONTEXT_NOTES)
{
context_ptr->data[unescape(context_ptr->data, context_ptr->data_used, context_ptr->data)] = 0;
//log_info("</notes>");
//log_info("[%s]", context_ptr->data);
ASSERT(room_ptr->project_notes == NULL);
room_ptr->project_notes = strdup(context_ptr->data);
if (room_ptr->project_notes == NULL)
{
ladish_notify_simple(LADISH_NOTIFY_URGENCY_HIGH, "Project notes failed to load", LADISH_CHECK_LOG_TEXT);
}
}
context_ptr->depth--;

View File

@ -49,7 +49,6 @@ static bool ladish_room_save_project_do(struct ladish_room * room_ptr)
char uuid_str[37];
char * filename;
char * bak_filename;
char * escaped_project_name;
int fd;
log_info("Saving project '%s' in room '%s' to '%s'", room_ptr->project_name, room_ptr->name, room_ptr->project_dir);
@ -68,22 +67,13 @@ static bool ladish_room_save_project_do(struct ladish_room * room_ptr)
uuid_generate(room_ptr->project_uuid); /* TODO: the uuid should be changed on "save as" but not on "rename" */
uuid_unparse(room_ptr->project_uuid, uuid_str);
escaped_project_name = malloc(max_escaped_length(strlen(room_ptr->project_name)) + 1);
if (escaped_project_name == NULL)
{
log_error("malloc() failed to allocate buffer for storing escaped project name");
goto exit;
}
filename = catdup(room_ptr->project_dir, LADISH_PROJECT_FILENAME);
if (filename == NULL)
{
log_error("catdup() failed to compose project xml filename");
goto free_escaped_project_name;
goto exit;
}
escape_simple(room_ptr->project_name, escaped_project_name);
bak_filename = catdup(filename, ".bak");
if (bak_filename == NULL)
{
@ -138,7 +128,7 @@ static bool ladish_room_save_project_do(struct ladish_room * room_ptr)
goto close;
}
if (!ladish_write_string(fd, escaped_project_name))
if (!ladish_write_string_escape(fd, room_ptr->project_name))
{
return false;
}
@ -158,6 +148,42 @@ static bool ladish_room_save_project_do(struct ladish_room * room_ptr)
goto close;
}
if (room_ptr->project_description != NULL)
{
if (!ladish_write_indented_string(fd, 1, "<description>"))
{
goto close;
}
if (!ladish_write_string_escape(fd, room_ptr->project_description))
{
goto close;
}
if (!ladish_write_string(fd, "</description>\n"))
{
goto close;
}
}
if (room_ptr->project_notes != NULL)
{
if (!ladish_write_indented_string(fd, 1, "<notes>"))
{
goto close;
}
if (!ladish_write_string_escape(fd, room_ptr->project_notes))
{
goto close;
}
if (!ladish_write_string(fd, "</notes>\n"))
{
goto close;
}
}
if (!ladish_write_indented_string(fd, 1, "<room>\n"))
{
goto close;
@ -218,8 +244,6 @@ free_bak_filename:
free(bak_filename);
free_filename:
free(filename);
free_escaped_project_name:
free(escaped_project_name);
exit:
return ret;
}

View File

@ -71,6 +71,27 @@ bool ladish_write_indented_string(int fd, int indent, const char * string)
return true;
}
bool ladish_write_string_escape(int fd, const char * string)
{
bool ret;
char * escaped_buffer;
escaped_buffer = malloc(max_escaped_length(strlen(string)));
if (escaped_buffer == NULL)
{
log_error("malloc() failed to allocate buffer for escaped string");
return false;
}
escape_simple(string, escaped_buffer);
ret = ladish_write_string(fd, escaped_buffer);
free(escaped_buffer);
return ret;
}
#define fd (((struct ladish_write_context *)context)->fd)
#define indent (((struct ladish_write_context *)context)->indent)

View File

@ -43,6 +43,7 @@ struct ladish_write_context
bool ladish_write_string(int fd, const char * string);
bool ladish_write_indented_string(int fd, int indent, const char * string);
bool ladish_write_string_escape(int fd, const char * string);
bool ladish_write_dict(int fd, int indent, ladish_dict_handle dict);
bool ladish_write_vgraph(int fd, int indent, ladish_graph_handle vgraph, ladish_app_supervisor_handle app_supervisor);
bool ladish_write_room_link_ports(int fd, int indent, ladish_room_handle room);