gboolean mrp_parser_to_xml (MrpStorageMrproject *module, gchar **str, GError **error) { xmlDocPtr doc; xmlChar *buf; int len; g_return_val_if_fail (MRP_IS_STORAGE_MRPROJECT (module), FALSE); doc = parser_build_xml_doc (module, error); if (!doc) { return FALSE; } xmlDocDumpFormatMemory (doc, &buf, &len, 1); xmlFreeDoc (doc); *str = g_strdup (buf); xmlFree (buf); if (len <= 0) { g_set_error (error, MRP_ERROR, MRP_ERROR_SAVE_WRITE_FAILED, _("Could not create XML tree")); return FALSE; } return TRUE; }
static gboolean mpsm_from_xml (MrpStorageModule *module, const gchar *str, GError **error) { g_return_val_if_fail (MRP_IS_STORAGE_MRPROJECT (module), FALSE); return mrp_parser_from_xml (MRP_STORAGE_MRPROJECT (module), str, error); }
gboolean mrp_parser_save (MrpStorageMrproject *module, const gchar *uri, gboolean force, GError **error) { gchar *real_filename; gint ret; gboolean file_exist; xmlDocPtr doc; g_return_val_if_fail (MRP_IS_STORAGE_MRPROJECT (module), FALSE); g_return_val_if_fail (uri != NULL && uri[0] != 0, FALSE); if (!strstr (uri, ".mrproject") && !strstr (uri, ".planner")) { real_filename = g_strconcat (uri, ".planner", NULL); } else { real_filename = g_strdup (uri); } file_exist = g_file_test ( real_filename, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR); if (file_exist && !force) { g_set_error (error, MRP_ERROR, MRP_ERROR_SAVE_FILE_EXIST, "%s", real_filename); g_free (real_filename); return FALSE; } doc = parser_build_xml_doc (module, error); if (!doc) { g_free (real_filename); return FALSE; } ret = xmlSaveFormatFile (real_filename, doc, 1); g_free (real_filename); xmlFreeDoc (doc); if (ret == -1) { g_set_error (error, MRP_ERROR, MRP_ERROR_SAVE_WRITE_FAILED, _("Could not write XML file")); return FALSE; } return TRUE; }
static gboolean mpsm_save (MrpStorageModule *module, const gchar *uri, gboolean force, GError **error) { g_return_val_if_fail (MRP_IS_STORAGE_MRPROJECT (module), FALSE); return mrp_parser_save (MRP_STORAGE_MRPROJECT (module), uri, force, error); }
static gboolean mpsm_load (MrpStorageModule *module, const gchar *uri, GError **error) { MrpStorageMrproject *sm; MrpTaskManager *task_manager; MrpAssignment *assignment; GList *node; g_return_val_if_fail (MRP_IS_STORAGE_MRPROJECT (module), FALSE); sm = MRP_STORAGE_MRPROJECT (module); /* FIXME: Check that we don't load twice? Free before loading? */ #if 0 if (!mrp_parser_load (MRP_STORAGE_MRPROJECT (module), uri, error)) { return FALSE; } #endif task_manager = imrp_project_get_task_manager (sm->project); mrp_task_manager_set_root (task_manager, sm->root_task); g_object_set (sm->project, "project-start", sm->project_start, "default-group", sm->default_group, NULL); mpsm_process_delayed_relations (sm); g_hash_table_destroy (sm->task_id_hash); g_list_free (sm->delayed_relations); imrp_project_set_groups (sm->project, sm->groups); for (node = sm->assignments; node; node = node->next) { assignment = MRP_ASSIGNMENT (node->data); imrp_task_add_assignment (mrp_assignment_get_task (assignment), assignment); imrp_resource_add_assignment (mrp_assignment_get_resource (assignment), assignment); g_object_unref (assignment); } return TRUE; }
static xmlDocPtr parser_build_xml_doc (MrpStorageMrproject *module, GError **error) { MrpParser parser; g_return_val_if_fail (MRP_IS_STORAGE_MRPROJECT (module), FALSE); /* We want indentation. */ xmlKeepBlanksDefault (0); memset (&parser, 0, sizeof (parser)); parser.project = module->project; parser.task_hash = g_hash_table_new_full (NULL, NULL, NULL, g_free); parser.group_hash = g_hash_table_new_full (NULL, NULL, NULL, g_free); parser.resource_hash = g_hash_table_new_full (NULL, NULL, NULL, g_free); parser.day_hash = g_hash_table_new (NULL, NULL); parser.calendar_hash = g_hash_table_new (NULL, NULL); parser.root_task = mrp_project_get_root_task (parser.project); parser.next_day_type_id = MRP_DAY_NEXT; parser.next_calendar_id = 1; parser.doc = xmlNewDoc ("1.0"); if (!mpp_write_project (&parser)) { g_set_error (error, MRP_ERROR, MRP_ERROR_SAVE_WRITE_FAILED, _("Could not create XML tree")); xmlFreeDoc (parser.doc); parser.doc = NULL; } g_hash_table_destroy (parser.task_hash); g_hash_table_destroy (parser.group_hash); g_hash_table_destroy (parser.resource_hash); g_hash_table_destroy (parser.day_hash); g_hash_table_destroy (parser.calendar_hash); return parser.doc; }