Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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;
}
Пример #4
0
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);
}
Пример #5
0
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;
}
Пример #6
0
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;
}