Task UID

View: New views
3 Messages — Rating Filter:   Alert me  

Task UID

by Kurt Maute :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi all,

I'm working on adding a unique id to the tasks (bug # 318480).  Attached
is the first draft for your perusal.

It creates a 'uid' attribute for each task and successfully saves it to
the xml file without changing it each time the project is modified and
saved again.  The xml for a task looks like this:

<task id="1" uid="3" name="blah" note="" work="28800"
start="20090908T000000Z" end="20090908T170000Z"
work-start="20090908T080000Z" percent-complete="0" priority="0"
type="normal" scheduling="fixed-work"/>

The uid is unique and constant for each task within a project (but no
attempt is made to make it universally unique).  They're assigned
sequentially as tasks are created (or as they're loaded from a previous
version file where uid is missing).

Maurice - In this patch, I started addressing some compile warnings as
well, specifically for mrp-parser.  I think maybe I should break them
out as a separate patch so as not to muddy the water on this one.

Also curious if you have an opinion as to how to handle patches gong
forward.  I was thinking it might be a good idea to set up a personal
repo on GitHub and host my work there... might be easier than creating
and sending patches via the list, no?



--
Kurt Maute <kurt@...>

[uid-draft1.patch]

diff --git a/data/dtd/Makefile.am b/data/dtd/Makefile.am
index 16ac2ab..cc61dbd 100644
--- a/data/dtd/Makefile.am
+++ b/data/dtd/Makefile.am
@@ -2,7 +2,8 @@ dtddir = $(datadir)/planner/dtd
 
 dtd_DATA = \
  mrproject-0.5.1.dtd \
- mrproject-0.6.dtd
+ mrproject-0.6.dtd \
+ mrproject-0.7.dtd
 
 EXTRA_DIST = $(dtd_DATA)
 
diff --git a/libplanner/mrp-old-xml.c b/libplanner/mrp-old-xml.c
index 2703a9a..006c5e4 100644
--- a/libplanner/mrp-old-xml.c
+++ b/libplanner/mrp-old-xml.c
@@ -209,6 +209,7 @@ old_xml_read_task (MrpParser *parser, xmlNodePtr tree, MrpTask *parent)
  xmlNodePtr     child;
  gchar          *name;
  gint           id;
+ gint           uid;
  mrptime        start = 0, end = 0;
  MrpTask       *task;
  MrpConstraint  constraint;
@@ -228,6 +229,7 @@ old_xml_read_task (MrpParser *parser, xmlNodePtr tree, MrpTask *parent)
  name = old_xml_get_string (tree, "name");
  note = old_xml_get_string (tree, "note");
  id = old_xml_get_int (tree, "id");
+ uid = old_xml_get_int (tree, "uid");
  percent_complete = old_xml_get_int (tree, "percent-complete");
  priority = old_xml_get_int (tree, "priority");
  type = old_xml_get_task_type (tree, "type");
@@ -250,6 +252,7 @@ old_xml_read_task (MrpParser *parser, xmlNodePtr tree, MrpTask *parent)
 
  task = g_object_new (MRP_TYPE_TASK,
      "project", parser->project,
+             "uid", uid,
      "name", name,
      "duration", duration,
      "percent_complete", percent_complete,
@@ -282,6 +285,7 @@ old_xml_read_task (MrpParser *parser, xmlNodePtr tree, MrpTask *parent)
 
  task = g_object_new (MRP_TYPE_TASK,
      "project", parser->project,
+             "uid", uid,
      "name", name,
      "sched", sched,
      "type", type,
diff --git a/libplanner/mrp-parser.c b/libplanner/mrp-parser.c
index 8548623..1d70e9b 100644
--- a/libplanner/mrp-parser.c
+++ b/libplanner/mrp-parser.c
@@ -119,10 +119,10 @@ mpp_write_project_properties (MrpParser *parser, xmlNodePtr node)
       "phase", &phase,
       NULL);
 
- xmlSetProp (node, "name", name);
- xmlSetProp (node, "company", org);
- xmlSetProp (node, "manager", manager);
- xmlSetProp (node, "phase", phase);
+ xmlSetProp (node, (unsigned char*)"name", (unsigned char*)name);
+ xmlSetProp (node, (unsigned char*)"company", (unsigned char*)org);
+ xmlSetProp (node, (unsigned char*)"manager", (unsigned char*)manager);
+ xmlSetProp (node, (unsigned char*)"phase", (unsigned char*)phase);
 
  mpp_xml_set_date (node, "project-start", pstart);
  mpp_xml_set_int (node, "mrproject-version", 2);
@@ -233,21 +233,21 @@ mpp_write_property_specs (MrpParser *parser, xmlNodePtr node)
  properties = mrp_project_get_properties_from_type (parser->project,
    MRP_TYPE_PROJECT);
 
- node = xmlNewChild (node, NULL, "properties", NULL);
+ node = xmlNewChild (node, NULL, (unsigned char*)"properties", NULL);
 
  for (l = properties; l; l = l->next) {
  property = l->data;
 
- child = xmlNewChild (node, NULL, "property", NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"property", NULL);
 
- xmlSetProp (child, "name", mrp_property_get_name (property));
+ xmlSetProp (child, (unsigned char*)"name", (unsigned char*)mrp_property_get_name (property));
 
  type = mrp_property_get_property_type (property);
- xmlSetProp (child, "type", mpp_property_type_to_string (type));
+ xmlSetProp (child, (unsigned char*)"type", (unsigned char*)mpp_property_type_to_string (type));
 
- xmlSetProp (child, "owner", "project");
- xmlSetProp (child, "label", mrp_property_get_label (property));
- xmlSetProp (child, "description", mrp_property_get_description (property));
+ xmlSetProp (child, (unsigned char*)"owner", (unsigned char*)"project");
+ xmlSetProp (child, (unsigned char*)"label", (unsigned char*)mrp_property_get_label (property));
+ xmlSetProp (child, (unsigned char*)"description", (unsigned char*)mrp_property_get_description (property));
  }
 
  g_list_free (properties);
@@ -258,16 +258,16 @@ mpp_write_property_specs (MrpParser *parser, xmlNodePtr node)
  for (l = properties; l; l = l->next) {
  property = l->data;
 
- child = xmlNewChild (node, NULL, "property", NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"property", NULL);
 
- xmlSetProp (child, "name", mrp_property_get_name (property));
+ xmlSetProp (child, (unsigned char*)"name", (unsigned char*)mrp_property_get_name (property));
 
  type = mrp_property_get_property_type (property);
- xmlSetProp (child, "type", mpp_property_type_to_string (type));
+ xmlSetProp (child, (unsigned char*)"type", (unsigned char*)mpp_property_type_to_string (type));
 
- xmlSetProp (child, "owner", "task");
- xmlSetProp (child, "label", mrp_property_get_label (property));
- xmlSetProp (child, "description", mrp_property_get_description (property));
+ xmlSetProp (child, (unsigned char*)"owner", (unsigned char*)"task");
+ xmlSetProp (child, (unsigned char*)"label", (unsigned char*)mrp_property_get_label (property));
+ xmlSetProp (child, (unsigned char*)"description", (unsigned char*)mrp_property_get_description (property));
  }
 
  g_list_free (properties);
@@ -278,16 +278,16 @@ mpp_write_property_specs (MrpParser *parser, xmlNodePtr node)
  for (l = properties; l; l = l->next) {
  property = l->data;
 
- child = xmlNewChild (node, NULL, "property", NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"property", NULL);
 
- xmlSetProp (child, "name", mrp_property_get_name (property));
+ xmlSetProp (child, (unsigned char*)"name", (unsigned char*)mrp_property_get_name (property));
 
  type = mrp_property_get_property_type (property);
- xmlSetProp (child, "type", mpp_property_type_to_string (type));
+ xmlSetProp (child, (unsigned char*)"type", (unsigned char*)mpp_property_type_to_string (type));
 
- xmlSetProp (child, "owner", "resource");
- xmlSetProp (child, "label", mrp_property_get_label (property));
- xmlSetProp (child, "description", mrp_property_get_description (property));
+ xmlSetProp (child, (unsigned char*)"owner", (unsigned char*)"resource");
+ xmlSetProp (child, (unsigned char*)"label", (unsigned char*)mrp_property_get_label (property));
+ xmlSetProp (child, (unsigned char*)"description", (unsigned char*)mrp_property_get_description (property));
  }
 
  g_list_free (properties);
@@ -301,12 +301,12 @@ mpp_write_phases (MrpParser *parser, xmlNodePtr node)
 
  g_object_get (parser->project, "phases", &phases, NULL);
 
- node = xmlNewChild (node, NULL, "phases", NULL);
+ node = xmlNewChild (node, NULL, (unsigned char*)"phases", NULL);
 
  for (l = phases; l; l = l->next) {
- child = xmlNewChild (node, NULL, "phase", NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"phase", NULL);
 
- xmlSetProp (child, "name", l->data);
+ xmlSetProp (child, (unsigned char*)"name", (unsigned char*)l->data);
  }
 
  mrp_string_list_free (phases);
@@ -321,9 +321,9 @@ mpp_write_predecessor (MrpParser   *parser,
  NodeEntry *entry;
  gint       lag;
 
- node = xmlNewChild (node, NULL, "predecessor", NULL);
+ node = xmlNewChild (node, NULL, (unsigned char*)"predecessor", NULL);
 
- xmlSetProp (node, "id", "1"); /* Don't need id here. */
+ xmlSetProp (node, (unsigned char*)"id", (unsigned char*)"1"); /* Don't need id here. */
 
  entry = g_hash_table_lookup (parser->task_hash,
      mrp_relation_get_predecessor (relation));
@@ -346,7 +346,7 @@ mpp_write_predecessor (MrpParser   *parser,
  str = "FS";
  }
 
- xmlSetProp (node, "type", str);
+ xmlSetProp (node, (unsigned char*)"type", (unsigned char*)str);
 
  lag = mrp_relation_get_lag (relation);
  if (lag) {
@@ -383,7 +383,7 @@ mpp_write_constraint (xmlNodePtr node, MrpConstraint *constraint)
  return;
  }
 
- child = xmlNewChild (node, NULL, "constraint", NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"constraint", NULL);
 
  switch (constraint->type) {
  case MRP_CONSTRAINT_MSO:
@@ -401,7 +401,7 @@ mpp_write_constraint (xmlNodePtr node, MrpConstraint *constraint)
  break;
  }
 
- xmlSetProp (child, "type", str);
+ xmlSetProp (child, (unsigned char*)"type", (unsigned char*)str);
  mpp_xml_set_date (child, "time", constraint->time);
 }
 
@@ -423,8 +423,8 @@ mpp_write_string_list (xmlNodePtr   node,
  for (i = 0; i < array->n_values; i++) {
  value = g_value_array_get_nth (array, i);
 
- child = xmlNewChild (node, NULL, "list-item", NULL);
- xmlSetProp (child, "value", g_value_get_string (value));
+ child = xmlNewChild (node, NULL, (unsigned char*)"list-item", NULL);
+ xmlSetProp (child, (unsigned char*)"value", (unsigned char*)g_value_get_string (value));
  }
 
  g_value_array_free (array);
@@ -447,21 +447,21 @@ mpp_write_custom_properties (MrpParser  *parser,
  return;
  }
 
- node = xmlNewChild (node, NULL, "properties", NULL);
+ node = xmlNewChild (node, NULL, (unsigned char*)"properties", NULL);
 
  for (l = properties; l; l = l->next) {
  property = l->data;
 
- child = xmlNewChild (node, NULL, "property", NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"property", NULL);
 
- xmlSetProp (child, "name", mrp_property_get_name (property));
+ xmlSetProp (child, (unsigned char*)"name", (unsigned char*)mrp_property_get_name (property));
 
  if (mrp_property_get_property_type (property) == MRP_PROPERTY_TYPE_STRING_LIST) {
  mpp_write_string_list (child, property, object);
  } else {
  value = mpp_property_to_string (object, property);
 
- xmlSetProp (child, "value", value);
+ xmlSetProp (child, (unsigned char*)"value", (unsigned char*)value);
 
  g_free (value);
  }
@@ -484,6 +484,7 @@ mpp_write_task_cb (MrpTask *task, MrpParser *parser)
  gint           work;
  gint           complete;
  gint           priority;
+ gint           uid;
  MrpTaskType    type;
  MrpTaskSched   sched;
  GList         *predecessors, *l;
@@ -498,12 +499,13 @@ mpp_write_task_cb (MrpTask *task, MrpParser *parser)
  entry = g_hash_table_lookup (parser->task_hash, parent);
  parent_node = entry->node;
 
- node = xmlNewChild (parent_node, NULL, "task", NULL);
+ node = xmlNewChild (parent_node, NULL, (unsigned char*)"task", NULL);
 
  entry = g_hash_table_lookup (parser->task_hash, task);
  entry->node = node;
 
  g_object_get (task,
+          "uid", &uid,
       "name", &name,
       "note", ¬e,
       "start", &start,
@@ -526,8 +528,9 @@ mpp_write_task_cb (MrpTask *task, MrpParser *parser)
  }
 
  mpp_xml_set_int (node, "id", entry->id);
- xmlSetProp (node, "name", name);
- xmlSetProp (node, "note", note);
+ mpp_xml_set_int (node, "uid", uid);
+ xmlSetProp (node, (unsigned char*)"name", (unsigned char*)name);
+ xmlSetProp (node, (unsigned char*)"note", (unsigned char*)note);
  mpp_xml_set_int (node, "work", work);
 
  if (sched == MRP_TASK_SCHED_FIXED_DURATION) {
@@ -550,7 +553,7 @@ mpp_write_task_cb (MrpTask *task, MrpParser *parser)
 
  predecessors = mrp_task_get_predecessor_relations (task);
  if (predecessors != NULL) {
- node = xmlNewChild (node, NULL, "predecessors", NULL);
+ node = xmlNewChild (node, NULL, (unsigned char*)"predecessors", NULL);
  for (l = predecessors; l; l = l->next) {
  mpp_write_predecessor (parser, node, l->data);
  }
@@ -585,7 +588,7 @@ mpp_write_group (MrpParser *parser, xmlNodePtr parent, MrpGroup *group)
 
  node = xmlNewChild (parent,
                             NULL,
-    "group",
+    (unsigned char*)"group",
     NULL);
 
  entry = g_hash_table_lookup (parser->group_hash, group);
@@ -600,10 +603,10 @@ mpp_write_group (MrpParser *parser, xmlNodePtr parent, MrpGroup *group)
       "manager-email", &admin_email,
       NULL);
 
- xmlSetProp (node, "name", name);
- xmlSetProp (node, "admin-name", admin_name);
- xmlSetProp (node, "admin-phone", admin_phone);
- xmlSetProp (node, "admin-email", admin_email);
+ xmlSetProp (node, (unsigned char*)"name", (unsigned char*)name);
+ xmlSetProp (node, (unsigned char*)"admin-name", (unsigned char*)admin_name);
+ xmlSetProp (node, (unsigned char*)"admin-phone", (unsigned char*)admin_phone);
+ xmlSetProp (node, (unsigned char*)"admin-email", (unsigned char*)admin_email);
 
  g_free (name);
  g_free (admin_name);
@@ -642,7 +645,7 @@ mpp_write_resource (MrpParser   *parser,
 
  node = xmlNewChild (parent,
                             NULL,
-    "resource",
+    (unsigned char*)"resource",
     NULL);
 
  mrp_object_get (MRP_OBJECT (resource),
@@ -668,15 +671,15 @@ mpp_write_resource (MrpParser   *parser,
  resource_entry = g_hash_table_lookup (parser->resource_hash, resource);
  mpp_xml_set_int (node, "id", resource_entry->id);
 
- xmlSetProp (node, "name", name);
- xmlSetProp (node, "short-name", short_name);
+ xmlSetProp (node, (unsigned char*)"name", (unsigned char*)name);
+ xmlSetProp (node, (unsigned char*)"short-name", (unsigned char*)short_name);
 
  mpp_xml_set_int (node, "type", type);
 
  mpp_xml_set_int (node, "units", units);
- xmlSetProp (node, "email", email);
+ xmlSetProp (node, (unsigned char*)"email", (unsigned char*)email);
 
- xmlSetProp (node, "note", note);
+ xmlSetProp (node, (unsigned char*)"note", (unsigned char*)note);
 
  mpp_xml_set_float (node, "std-rate", std_rate);
  /*mpp_xml_set_float (node, "ovt-rate", ovt_rate);*/
@@ -715,7 +718,7 @@ mpp_write_assignment (MrpParser     *parser,
 
  node = xmlNewChild (parent,
                             NULL,
-    "allocation",
+    (unsigned char*)"allocation",
     NULL);
 
  g_object_get (assignment,
@@ -739,16 +742,16 @@ mpp_write_interval (xmlNodePtr parent, MrpInterval *interval)
  mrptime     start, end;
  gchar      *str;
 
- child = xmlNewChild (parent, NULL, "interval", NULL);
+ child = xmlNewChild (parent, NULL, (unsigned char*)"interval", NULL);
 
  mrp_interval_get_absolute (interval, 0, &start, &end);
 
  str = mrp_time_format ("%H%M", start);
- xmlSetProp (child, "start", str);
+ xmlSetProp (child, (unsigned char*)"start", (unsigned char*)str);
  g_free (str);
 
  str = mrp_time_format ("%H%M", end);
- xmlSetProp (child, "end", str);
+ xmlSetProp (child, (unsigned char*)"end", (unsigned char*)str);
  g_free (str);
 }
 
@@ -760,7 +763,7 @@ mpp_write_day (MrpParser *parser, xmlNodePtr parent, MrpDay *day)
 
  g_return_if_fail (day != NULL);
 
- node = xmlNewChild (parent, NULL, "day-type", NULL);
+ node = xmlNewChild (parent, NULL, (unsigned char*)"day-type", NULL);
 
  day_entry = g_new0 (NodeEntry, 1);
  if (day == mrp_day_get_work ()) {
@@ -778,8 +781,8 @@ mpp_write_day (MrpParser *parser, xmlNodePtr parent, MrpDay *day)
  g_hash_table_insert (parser->day_hash, day, day_entry);
 
  mpp_xml_set_int (node, "id", day_entry->id);
- xmlSetProp (node, "name", mrp_day_get_name (day));
- xmlSetProp (node, "description", mrp_day_get_description (day));
+ xmlSetProp (node, (unsigned char*)"name", (unsigned char*)mrp_day_get_name (day));
+ xmlSetProp (node, (unsigned char*)"description", (unsigned char*)mrp_day_get_description (day));
 }
 
 static void
@@ -813,7 +816,7 @@ mpp_write_overridden_day (MrpParser           *parser,
 
  entry = g_hash_table_lookup (parser->day_hash, di->day);
  if (entry) {
- child = xmlNewChild (parent, NULL, "overridden-day-type", NULL);
+ child = xmlNewChild (parent, NULL, (unsigned char*)"overridden-day-type", NULL);
  mpp_xml_set_int (child, "id", entry->id);
 
  for (l = di->intervals; l; l = l->next) {
@@ -835,13 +838,13 @@ mpp_write_overridden_date (MrpParser      *parser,
 
  entry = g_hash_table_lookup (parser->day_hash, dd->day);
  if (entry) {
- child = xmlNewChild (parent, NULL, "day", NULL);
+ child = xmlNewChild (parent, NULL, (unsigned char*)"day", NULL);
 
  str = mrp_time_format ("%Y%m%d", dd->date);
- xmlSetProp (child, "date", str);
+ xmlSetProp (child, (unsigned char*)"date", (unsigned char*)str);
  g_free (str);
 
- xmlSetProp (child, "type", "day-type");
+ xmlSetProp (child, (unsigned char*)"type", (unsigned char*)"day-type");
  mpp_xml_set_int (child, "id", entry->id);
  }
 
@@ -859,7 +862,7 @@ mpp_write_calendar (MrpParser   *parser,
 
  g_return_if_fail (MRP_IS_CALENDAR (calendar));
 
- node = xmlNewChild (parent, NULL, "calendar", NULL);
+ node = xmlNewChild (parent, NULL, (unsigned char*)"calendar", NULL);
 
  id = parser->next_calendar_id++;
  mpp_xml_set_int (node, "id", id);
@@ -868,10 +871,10 @@ mpp_write_calendar (MrpParser   *parser,
      calendar,
      GINT_TO_POINTER (id));
 
- xmlSetProp (node, "name", mrp_calendar_get_name (calendar));
+ xmlSetProp (node, (unsigned char*)"name", (unsigned char*)mrp_calendar_get_name (calendar));
 
  /* Write the default week */
- child = xmlNewChild (node, NULL, "default-week", NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"default-week", NULL);
 
  mpp_write_default_day (parser, child, calendar,
        "mon", MRP_CALENDAR_DAY_MON);
@@ -889,7 +892,7 @@ mpp_write_calendar (MrpParser   *parser,
        "sun", MRP_CALENDAR_DAY_SUN);
 
  /* Override days */
- child = xmlNewChild (node, NULL, "overridden-day-types", NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"overridden-day-types", NULL);
  days = mrp_calendar_get_overridden_days (calendar);
 
  for (l = days; l; l = l->next) {
@@ -900,7 +903,7 @@ mpp_write_calendar (MrpParser   *parser,
  g_list_free (days);
 
  /* Write the overriden dates */
- child = xmlNewChild (node, NULL, "days", NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"days", NULL);
  dates = mrp_calendar_get_all_overridden_dates (calendar);
  for (l = dates; l; l = l->next) {
  MrpDateWithDay *date_day = l->data;
@@ -927,7 +930,7 @@ mpp_write_project (MrpParser *parser)
  NodeEntry   *entry;
  MrpCalendar *root_calendar;
 
- node = xmlNewDocNode (parser->doc, NULL, "project", NULL);
+ node = xmlNewDocNode (parser->doc, NULL, (unsigned char*)"project", NULL);
  parser->doc->xmlRootNode = node;
 
  mpp_write_property_specs (parser, node);
@@ -936,8 +939,8 @@ mpp_write_project (MrpParser *parser)
  mpp_write_phases (parser, node);
 
  /* Write calendars */
- calendars_node = xmlNewChild (node, NULL, "calendars", NULL);
- child = xmlNewChild (calendars_node, NULL, "day-types", NULL);
+ calendars_node = xmlNewChild (node, NULL, (unsigned char*)"calendars", NULL);
+ child = xmlNewChild (calendars_node, NULL, (unsigned char*)"day-types", NULL);
 
  mpp_write_day (parser, child, mrp_day_get_work ());
  mpp_write_day (parser, child, mrp_day_get_nonwork ());
@@ -958,7 +961,7 @@ mpp_write_project (MrpParser *parser)
  mpp_write_project_properties (parser, node);
 
  /* Write tasks. */
- child = xmlNewChild (node, NULL, "tasks",NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"tasks",NULL);
 
  entry = g_new0 (NodeEntry, 1);
  entry->id = 0;
@@ -979,7 +982,7 @@ mpp_write_project (MrpParser *parser)
    parser);
 
  /* Write resource groups. */
- child = xmlNewChild (node, NULL, "resource-groups",NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"resource-groups",NULL);
  list = mrp_project_get_groups (parser->project);
 
  /* Generate IDs and hash table. */
@@ -1001,7 +1004,7 @@ mpp_write_project (MrpParser *parser)
  }
 
  /* Write resources. */
- child = xmlNewChild (node, NULL, "resources",NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"resources",NULL);
  list = mrp_project_get_resources (parser->project);
 
  /* Generate IDs and hash table. */
@@ -1019,7 +1022,7 @@ mpp_write_project (MrpParser *parser)
  }
 
  /* Write assignments. */
- child = xmlNewChild (node, NULL, "allocations", NULL);
+ child = xmlNewChild (node, NULL, (unsigned char*)"allocations", NULL);
 
  for (l = assignments; l; l = l->next) {
  mpp_write_assignment (parser, child, l->data);
@@ -1053,7 +1056,7 @@ parser_build_xml_doc (MrpStorageMrproject  *module,
  parser.next_day_type_id = MRP_DAY_NEXT;
  parser.next_calendar_id = 1;
 
- parser.doc = xmlNewDoc ("1.0");
+ parser.doc = xmlNewDoc ((unsigned char*)"1.0");
 
  if (!mpp_write_project (&parser)) {
  g_set_error (error,
@@ -1183,7 +1186,7 @@ mpp_xml_set_date (xmlNodePtr node, const gchar *prop, mrptime time)
  gchar *str;
 
  str = mrp_time_to_string (time);
- xmlSetProp (node, prop, str);
+ xmlSetProp (node, (unsigned char*)prop, (unsigned char*)str);
  g_free (str);
 }
 
@@ -1193,7 +1196,7 @@ mpp_xml_set_int (xmlNodePtr node, const gchar *prop, gint value)
  gchar *str;
 
  str = g_strdup_printf ("%d", value);
- xmlSetProp (node, prop, str);
+ xmlSetProp (node, (unsigned char*)prop, (unsigned char*)str);
  g_free (str);
 }
 
@@ -1204,7 +1207,7 @@ mpp_xml_set_float (xmlNodePtr node, const gchar *prop, gfloat value)
  gchar *str;
 
  str = g_ascii_dtostr (buf, sizeof(buf) - 1, value);
- xmlSetProp (node, prop, str);
+ xmlSetProp (node, (unsigned char*)prop, (unsigned char*)str);
 }
 
 static void
@@ -1223,7 +1226,7 @@ mpp_xml_set_task_type (xmlNodePtr node, const gchar *prop, MrpTaskType type)
  break;
  }
 
- xmlSetProp (node, prop, str);
+ xmlSetProp (node, (unsigned char*)prop, (unsigned char*)str);
 }
 
 static void
@@ -1242,5 +1245,5 @@ mpp_xml_set_task_sched (xmlNodePtr node, const gchar *prop, MrpTaskSched sched)
  break;
  }
 
- xmlSetProp (node, prop, str);
+ xmlSetProp (node, (unsigned char*)prop, (unsigned char*)str);
 }
diff --git a/libplanner/mrp-project.c b/libplanner/mrp-project.c
index 775f2e0..354a704 100644
--- a/libplanner/mrp-project.c
+++ b/libplanner/mrp-project.c
@@ -56,6 +56,7 @@ struct _MrpProjectPriv {
  /*GList          *storage_modules;*/        /* <MrpStorageModule> */
  gboolean          needs_saving;
  gboolean          empty;
+  gint              maxUID;
 
  MrpGroup         *default_group;
 
@@ -425,6 +426,7 @@ project_init (MrpProject *project)
  priv->organization  = g_strdup ("");
  priv->manager       = g_strdup ("");
  priv->name          = g_strdup ("");
+  priv->maxUID        = 0;
 
  priv->property_pool = g_param_spec_pool_new (TRUE);
  priv->task_manager  = mrp_task_manager_new (project);
@@ -1486,6 +1488,37 @@ mrp_project_set_project_start (MrpProject *project,
  project->priv->project_start = start;
 }
 /**
+ * mrp_project_get_maxUID:
+ * @project: an #MrpProject
+ *
+ * Fetches the maximum UID from @project.
+ *
+ * Return value: the maximum UID
+ **/
+gint
+mrp_project_get_maxUID (MrpProject *project)
+{
+ g_return_val_if_fail (MRP_IS_PROJECT (project), MRP_TIME_INVALID);
+
+ return project->priv->maxUID;
+}
+
+/**
+ * mrp_project_set_maxUID:
+ * @project: an #MrpProject
+ * @maxUID: project maximum task unique identifier
+ *
+ * Set the maximum UID
+ **/
+void
+mrp_project_set_maxUID (MrpProject *project,
+       gint     *uid)
+{
+ g_return_if_fail (MRP_IS_PROJECT (project));
+
+ project->priv->maxUID = uid;
+}
+/**
  * imrp_project_add_calendar_day:
  * @project: an #MrpProject
  * @day: #MrpDay to add
diff --git a/libplanner/mrp-project.h b/libplanner/mrp-project.h
index f8162d2..6359065 100644
--- a/libplanner/mrp-project.h
+++ b/libplanner/mrp-project.h
@@ -61,6 +61,9 @@ gboolean         mrp_project_needs_saving             (MrpProject           *pro
 mrptime          mrp_project_get_project_start        (MrpProject           *project);
 void             mrp_project_set_project_start        (MrpProject           *project,
        mrptime               start);
+gint             mrp_project_get_maxUID               (MrpProject           *project);
+void             mrp_project_set_maxUID               (MrpProject           *project,
+       gint                 *uid);
 gboolean         mrp_project_load                     (MrpProject           *project,
        const gchar          *uri,
        GError              **error);
diff --git a/libplanner/mrp-task-manager.c b/libplanner/mrp-task-manager.c
index 2388959..755c373 100644
--- a/libplanner/mrp-task-manager.c
+++ b/libplanner/mrp-task-manager.c
@@ -1105,8 +1105,13 @@ task_manager_build_dependency_graph (MrpTaskManager *manager)
  MrpTask            *task;
  MrpTaskGraphNode   *node;
  GList              *queue;
+  gint                uid;
+  gint                maxUID;
+  gint                tmp_maxUID;
 
  priv = manager->priv;
+  maxUID = mrp_project_get_maxUID(priv->project);
+  tmp_maxUID = 0;
 
  /* Build a directed, acyclic graph, where relation links and children ->
  * parent are graph links (children must be calculated before
@@ -1125,8 +1130,20 @@ task_manager_build_dependency_graph (MrpTaskManager *manager)
  tasks = mrp_task_manager_get_all_tasks (manager);
  for (l = tasks; l; l = l->next) {
  add_task_to_dependency_graph (manager, l->data, mrp_task_get_parent (l->data));
+
+    if (maxUID == 0) {
+      task = l->data;
+      uid = mrp_task_get_uid (task);
+      if (uid > tmp_maxUID) {
+        tmp_maxUID = uid;
+      }
+    }
  }
 
+  if (maxUID == 0) {
+    mrp_project_set_maxUID(priv->project, tmp_maxUID);
+  }
+
  /* Do a topological sort. Get the tasks without dependencies to start
  * with.
  */
@@ -2074,14 +2091,26 @@ task_manager_do_forward_pass_helper (MrpTaskManager *manager,
  gint                work;
  mrptime             t1, t2;
  MrpTaskSched        sched;
+  MrpProject         *project;
+  gint                maxUID;
+  gint                uid;
 
  priv = manager->priv;
+ project = mrp_object_get_project (MRP_OBJECT (task));
+  maxUID = mrp_project_get_maxUID(project);
 
  old_start = mrp_task_get_start (task);
  old_finish = mrp_task_get_finish (task);
  old_duration = old_finish - old_start;
  duration = 0;
 
+  uid = mrp_task_get_uid(task);
+  if (uid == 0) {
+    uid = maxUID + 1;
+    mrp_project_set_maxUID(project, uid);
+    mrp_task_set_uid(task, uid);
+  }
+
  if (mrp_task_get_n_children (task) > 0) {
  MrpTask *child;
 
diff --git a/libplanner/mrp-task.c b/libplanner/mrp-task.c
index 92a95b8..e2a4de0 100644
--- a/libplanner/mrp-task.c
+++ b/libplanner/mrp-task.c
@@ -32,6 +32,7 @@
 /* Properties */
 enum {
  PROP_0,
+  PROP_UID,
  PROP_NAME,
  PROP_START,
  PROP_FINISH,
@@ -85,6 +86,9 @@ struct _MrpTaskPriv {
  /* Arbitary range of 0,1..9999. A hint for any (3rd party) resource leveller */
  gint              priority;
 
+  /* Unique ID (unique within the context of this project), & will not change between saves */
+ gint              uid;
+
  gchar            *name;
  gchar            *note;
 
@@ -189,6 +193,7 @@ task_init (MrpTask *task)
  priv = g_new0 (MrpTaskPriv, 1);
  task->priv = priv;
 
+  priv->uid = 0;
  priv->name = g_strdup ("");
  priv->node = g_node_new (task);
  priv->assignments = NULL;
@@ -282,6 +287,15 @@ task_class_init (MrpTaskClass *klass)
 
  g_object_class_install_property (
  object_class,
+ PROP_UID,
+ g_param_spec_int ("uid",
+     "UID",
+     "Task Unique ID",
+             -1, G_MAXINT, 0,
+     G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
  PROP_NAME,
  g_param_spec_string ("name",
      "Name",
@@ -451,6 +465,10 @@ task_set_property (GObject      *object,
  priv = task->priv;
 
  switch (prop_id) {
+ case PROP_UID:
+ priv->uid = g_value_get_int (value);
+ break;
+
  case PROP_NAME:
  str = g_value_get_string (value);
 
@@ -601,6 +619,9 @@ task_get_property (GObject    *object,
  priv = task->priv;
 
  switch (prop_id) {
+ case PROP_UID:
+ g_value_set_int (value, priv->uid);
+ break;
  case PROP_NAME:
  g_value_set_string (value, priv->name);
  break;
@@ -905,6 +926,38 @@ mrp_task_new (void)
 }
 
 /**
+ * mrp_task_get_uid:
+ * @task: an #MrpTask
+ *
+ * Retrives the uid of @task.
+ *
+ * Return value: the unique id
+ **/
+gint
+mrp_task_get_uid (MrpTask *task)
+{
+ g_return_val_if_fail (MRP_IS_TASK (task), 1);
+
+ return task->priv->uid;
+}
+
+/**
+ * mrp_task_set_uid:
+ * @task: an #MrpTask
+ * @name: new @uid
+ *
+ * Sets the unique id of the task
+ * The uid is unique within the context of the project,
+ * and remains constant between saves (as apposed to the id
+ * value which can change from one save to the next)
+ **/
+void mrp_task_set_uid (MrpTask *task, gint *uid)
+{
+ g_return_if_fail (MRP_IS_TASK (task));
+
+ mrp_object_set (MRP_OBJECT (task), "uid", uid, NULL);
+}
+/**
  * mrp_task_get_name:
  * @task: an #MrpTask
  *
@@ -1901,6 +1954,7 @@ imrp_task_set_finish (MrpTask *task, mrptime finish)
  task->priv->finish = finish;
 }
 
+
 void
 imrp_task_set_duration (MrpTask *task, gint duration)
 {
diff --git a/libplanner/mrp-task.h b/libplanner/mrp-task.h
index b9f6a83..eaa0d70 100644
--- a/libplanner/mrp-task.h
+++ b/libplanner/mrp-task.h
@@ -86,6 +86,8 @@ GType            mrp_task_get_type                  (void) G_GNUC_CONST;
 GType            mrp_constraint_get_type            (void) G_GNUC_CONST;
 GType            mrp_relation_get_type              (void) G_GNUC_CONST;
 MrpTask         *mrp_task_new                       (void);
+gint             mrp_task_get_uid                   (MrpTask *task);
+void             mrp_task_set_uid                   (MrpTask *task, gint *uid);
 const gchar     *mrp_task_get_name                  (MrpTask          *task);
 void             mrp_task_set_name                  (MrpTask          *task,
      const gchar      *name);
diff --git a/libplanner/mrp-xml.c b/libplanner/mrp-xml.c
index 5fc5b83..184e5c1 100644
--- a/libplanner/mrp-xml.c
+++ b/libplanner/mrp-xml.c
@@ -34,6 +34,7 @@
 typedef enum {
  XML_TYPE_UNKNOWN,
  XML_TYPE_MRP_1,
+ XML_TYPE_MRP_0_7,
  XML_TYPE_MRP_0_6,
  XML_TYPE_MRP_0_5_1
 } XmlType;
@@ -76,11 +77,15 @@ xml_read_context (xmlParserCtxt  *ctxt,
  return FALSE;
  }
 
+/** Note: all versions of the mrp xml format use mrp_old_xml_parse
+ *  don't be confused by the name
+ **/
  switch (xml_locate_type (doc)) {
  case XML_TYPE_MRP_1:
  g_print ("Isn't implemented yet\n");
  ret_val = FALSE;
  break;
+ case XML_TYPE_MRP_0_7:
  case XML_TYPE_MRP_0_6:
  case XML_TYPE_MRP_0_5_1:
  ret_val = mrp_old_xml_parse (project, doc, error);
@@ -124,16 +129,21 @@ xml_locate_type (xmlDoc *doc)
  XmlType  ret_val = XML_TYPE_UNKNOWN;
  gchar   *filename;
 
- filename = mrp_paths_get_dtd_dir ("mrproject-0.6.dtd");
- if (xml_validate (doc, filename)) {
- ret_val = XML_TYPE_MRP_0_6;
- } else {
- g_free (filename);
- filename = mrp_paths_get_dtd_dir ("mrproject-0.5.1.dtd");
- if (xml_validate (doc, filename)) {
- ret_val = XML_TYPE_MRP_0_5_1;
- }
- }
+  filename = mrp_paths_get_dtd_dir ("mrproject-0.7.dtd");
+  if (xml_validate (doc, filename)) {
+    ret_val = XML_TYPE_MRP_0_7;
+  } else {
+    filename = mrp_paths_get_dtd_dir ("mrproject-0.6.dtd");
+    if (xml_validate (doc, filename)) {
+      ret_val = XML_TYPE_MRP_0_6;
+    } else {
+      g_free (filename);
+      filename = mrp_paths_get_dtd_dir ("mrproject-0.5.1.dtd");
+      if (xml_validate (doc, filename)) {
+        ret_val = XML_TYPE_MRP_0_5_1;
+      }
+    }
+  }
 
  g_free (filename);
 
diff --git a/src/planner-msp-plugin.c b/src/planner-msp-plugin.c
index f6e8bd9..cb5ffe7 100644
--- a/src/planner-msp-plugin.c
+++ b/src/planner-msp-plugin.c
@@ -103,7 +103,7 @@ msp_plugin_transform (PlannerPlugin *plugin,
  return FALSE;
  }
 
- filename = mrp_paths_get_dtd_dir ("mrproject-0.6.dtd");
+ filename = mrp_paths_get_dtd_dir ("mrproject-0.7.dtd");
  if (!xml_validate (final_doc, filename)) {
  GtkWidget *dialog;
 


_______________________________________________
Planner-dev-list mailing list
Planner-dev-list@...
http://mail.gnome.org/mailman/listinfo/planner-dev-list

Re: Task UID

by Alexandre Franke :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Tue, Sep 15, 2009 at 7:05 PM, Kurt Maute <kurt@...> wrote:
> Hi all,

Hi Kurt,

> Also curious if you have an opinion as to how to handle patches gong
> forward.  I was thinking it might be a good idea to set up a personal
> repo on GitHub and host my work there... might be easier than creating
> and sending patches via the list, no?

Actually, GNOME Bugzilla now has an integrated patch review tool so
attaching them there might be a good idea.

--
Alexandre Franke
_______________________________________________
Planner-dev-list mailing list
Planner-dev-list@...
http://mail.gnome.org/mailman/listinfo/planner-dev-list

Re: Task UID

by Maurice van der Pot-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Tue, Sep 15, 2009 at 01:05:13PM -0400, Kurt Maute wrote:
> Maurice - In this patch, I started addressing some compile warnings as
> well, specifically for mrp-parser.  I think maybe I should break them
> out as a separate patch so as not to muddy the water on this one.

Agreed. One fix/change per commit/patch. Do check with the current git,
because I pushed a few compiler warning fixes as well today.

> Also curious if you have an opinion as to how to handle patches gong
> forward.  I was thinking it might be a good idea to set up a personal
> repo on GitHub and host my work there... might be easier than creating
> and sending patches via the list, no?

I would really like that, yes. And because it would be a staging area
for patches in development, you could just change history (amend
commits, interactive rebase) when you do your rework. Then when it's
done you could simply merge it to master and push it to gnome.

Maurice.

--
Maurice van der Pot

Gentoo Linux Developer   griffon26@...    http://www.gentoo.org
Gnome Planner Developer  griffon26@...  http://live.gnome.org/Planner



_______________________________________________
Planner-dev-list mailing list
Planner-dev-list@...
http://mail.gnome.org/mailman/listinfo/planner-dev-list

attachment0 (205 bytes) Download Attachment