using System; using System.Collections.Generic; using System.Text; using System.IO; using net.sf.mpxj.reader; using net.sf.mpxj; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace OpenSource { class Program { static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine(string.Format("Usage: {0} mppfilename tempfile", Path.GetFileName(Environment.GetCommandLineArgs()[0]))); Environment.Exit(1); } string mppfile = args[0].Trim(); string tempfile = args[1].Trim(); if (!File.Exists(mppfile)) { Console.WriteLine(string.Format("{0} is not a valid file or does not exist.", mppfile)); Environment.Exit(1); } if (!File.Exists(tempfile)) { Console.WriteLine(string.Format("{0} is not a valid file or does not exist.", tempfile)); Environment.Exit(2); } Console.WriteLine(string.Format("File to read from is: {0}", mppfile)); Console.WriteLine(string.Format("File to write to is: {0}", tempfile)); string error; OpenSource.Data[] data = ReadMPPFile(mppfile, out error); if (error != "") { Console.WriteLine(error); } if (data == null) { Console.WriteLine("***Nothing was read from Microsoft Project file"); Environment.Exit(100); //100 = look into tempfile for error message } try { IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream(tempfile, FileMode.Create, FileAccess.Write, FileShare.None); formatter.Serialize(stream, data); stream.Close(); } catch (Exception E) { //Could not write to output file //File.AppendAllText(tempfile, E.Message); Console.WriteLine("***Error: " + E.Message); Environment.Exit(101); //101 = look into tempfile for error message } } private static Data[] ReadMPPFile(string fileName, out string errorMsg) { errorMsg = ""; try { ProjectReader reader = ProjectReaderUtility.getProjectReader(fileName); ProjectFile projectFile = reader.read(fileName); net.sf.mpxj.ProjectCalendar cal = (net.sf.mpxj.ProjectCalendar)projectFile.getBaseCalendars().get(0); Data[] data = new Data[projectFile.getAllTasks().size()]; data[0] = new Data(); data[0].WorkingDays[0] = Convert.ToBoolean(cal.getWorkingDay(net.sf.mpxj.Day.SUNDAY)); data[0].WorkingDays[1] = Convert.ToBoolean(cal.getWorkingDay(net.sf.mpxj.Day.MONDAY)); data[0].WorkingDays[2] = Convert.ToBoolean(cal.getWorkingDay(net.sf.mpxj.Day.TUESDAY)); data[0].WorkingDays[3] = Convert.ToBoolean(cal.getWorkingDay(net.sf.mpxj.Day.WEDNESDAY)); data[0].WorkingDays[4] = Convert.ToBoolean(cal.getWorkingDay(net.sf.mpxj.Day.THURSDAY)); data[0].WorkingDays[5] = Convert.ToBoolean(cal.getWorkingDay(net.sf.mpxj.Day.FRIDAY)); data[0].WorkingDays[6] = Convert.ToBoolean(cal.getWorkingDay(net.sf.mpxj.Day.SATURDAY)); int iCount = 1; for (iCount = 1; iCount < projectFile.getAllTasks().size(); iCount++) { try { data[iCount] = new Data(); net.sf.mpxj.Task tSampleTsk = (net.sf.mpxj.Task)projectFile.getAllTasks().get(iCount); if (tSampleTsk != null) { data[iCount].row = iCount; data[iCount].taskName = tSampleTsk.getName(); data[iCount].startDate = Convert.ToDateTime(Convert.ToDateTime(tSampleTsk.getStart().toLocaleString()).ToShortDateString()); data[iCount].duration = Convert.ToDecimal(tSampleTsk.getDuration().getDuration().ToString()); data[iCount].id = tSampleTsk.getID().ToString(); data[iCount].indent = Convert.ToInt16(tSampleTsk.getOutlineLevel().ToString()) - 1; data[iCount].remarks = tSampleTsk.getText1(); data[iCount].remarks1 = tSampleTsk.getText2(); data[iCount].remarks2 = tSampleTsk.getText3(); data[iCount].remarks3 = tSampleTsk.getText4(); data[iCount].remarks4 = tSampleTsk.getText5(); if (tSampleTsk.getDeadline() != null) data[iCount].Deadline = Convert.ToDateTime(Convert.ToDateTime(tSampleTsk.getDeadline().toLocaleString()).ToShortDateString()); data[iCount].PercentCompleted = Convert.ToDecimal(tSampleTsk.getPercentageComplete().ToString()); data[iCount].Priority = tSampleTsk.getPriority().getValue(); data[iCount].Flag = (bool)tSampleTsk.getFlag1(); data[iCount].rolledUp = (bool)tSampleTsk.getRollup(); } } catch (System.Exception ex) { string msg = "Error reading tasks: "; Console.WriteLine(msg + ex.Message); errorMsg += Environment.NewLine + msg + ex.Message; } } for (iCount = 1; iCount <= projectFile.getAllTasks().size() - 1; iCount++) { try { net.sf.mpxj.Task tSampleTsk = (net.sf.mpxj.Task)projectFile.getAllTasks().get(iCount); if (Convert.ToDateTime(Convert.ToDateTime(tSampleTsk.getStart().toLocaleString()).ToShortDateString()).CompareTo(data[0].FirstDay) == -1) data[0].FirstDay = Convert.ToDateTime(Convert.ToDateTime(tSampleTsk.getStart().toLocaleString()).ToShortDateString()).Date; if (Convert.ToDateTime(Convert.ToDateTime(tSampleTsk.getStart().toLocaleString()).ToShortDateString()).CompareTo(data[0].LastDay) == 1) data[0].LastDay = Convert.ToDateTime(Convert.ToDateTime(tSampleTsk.getStart().toLocaleString()).ToShortDateString()).Date; if (tSampleTsk != null && tSampleTsk.getPredecessors() != null && tSampleTsk.getPredecessors().size() != 0) { for (int i = 0; i < tSampleTsk.getPredecessors().size(); i++) { net.sf.mpxj.Relation relation = (net.sf.mpxj.Relation)tSampleTsk.getPredecessors().get(i); string predeUniqueID = relation.getTaskUniqueID().toString(); for (int iCount2 = 1; iCount2 <= projectFile.getAllTasks().size(); iCount2++) { net.sf.mpxj.Task task = (net.sf.mpxj.Task)projectFile.getAllTasks().get(iCount2); if (task.getUniqueID().toString() == predeUniqueID) { if (data[iCount].predecessorsList != "") data[iCount].predecessorsList = data[iCount].predecessorsList + "," + iCount2; else data[iCount].predecessorsList = iCount2.ToString(); break; } } } } } catch (System.Exception ex) { string msg = "Error getting earliest/latest dates or reading predecessors: "; Console.WriteLine(msg + ex.Message); errorMsg += Environment.NewLine + msg + ex.Message; } } return data; } catch (System.Exception ex) { Console.WriteLine(ex.Message); errorMsg += Environment.NewLine + "Error: " + ex.Message; return null; } } } }