2010-11-10 18:13:10 +00:00

615 lines
23 KiB
C#

// ========================================================================
// Copyright 2006 - Volian Enterprises, Inc. All rights reserved.
// Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
// ------------------------------------------------------------------------
// $Workfile: $ $Revision: $
// $Author: $ $Date: $
//
// $History: $
// ========================================================================
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.OleDb;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Xml;
using System.Xml.XPath;
using System.IO;
using System.Text;
using VEPROMS.CSLA.Library;
namespace DataLoader
{
public partial class Loader
{
private Dictionary<string, int> dicOldToNew;
private Item AddSection(Item procitem, string Number, string Title, string SecType, DateTime Dts, string Userid, ConfigInfo ci, string stpseq, string fmt, int libdocid, string pth, Item FromItem, FormatInfo activeFormat)
{
bool missingDocFile = false;
//Console.WriteLine("before UpdateLabels");
frmMain.UpdateLabels(0, 1, 0);
//Console.WriteLine("after UpdateLabels");
try
{
//Console.WriteLine("before activeFormat");
FormatInfo format = activeFormat;
//Console.WriteLine("after activeFormat");
// Tie the section to format used, this will add the format xml if it doesn't exist in
// the database yet. Note that if there is no format at this level then none should
// be set so that the inheritance works correctly.
if (fmt != null && fmt != "") format = GetFormat(fmt);
// Find the docstyle based on the section type (step[1]) & the 'type' from the dbf
// record sectype[0])
string dstyleindx = ((stpseq == null || stpseq == "") ? " " : stpseq.Substring(1, 1)) + ((SecType==null||SecType == "") ? " " : SecType.Substring(0, 1));
//int docstyleindx = GetDocStyleIndx(dstyleindx, format, procitem, docver,Number,Title);
int docstyleindx = GetDocStyleIndx(dstyleindx, format, procitem, Number, Title);
// tack on the column mode - add to config xml for node.
if (stpseq != null && stpseq.Substring(1, 1) == "0" && stpseq.Substring(5, 1) != " ")
{
if (ci == null) ci = new ConfigInfo(null);
ci.AddItem("Section", "ColumnMode", stpseq.Substring(5, 1));
}
// find rtf file (or use the library document temp file) & read it into the field
// acccontent
int Documentid=0;
bool needEntry = false;
if (libdocid != 0 || stpseq.Substring(1, 1) != "0")
{
needEntry = true;
string fname = null;
if (libdocid != 0)
{
Documentid = libdocid;
}
else
{
int num = Convert.ToInt32(stpseq[0]) - 64;
string thenum = num.ToString("d2");
fname = string.Format("{0}\\rtffiles\\{1}.A{2}", pth, ProcFileName, thenum);
Application.DoEvents();
SaveSectionDocument(fname, stpseq, SecType, ref Documentid, procitem.DisplayNumber + ":" + (Number == string.Empty ? Title : Number));
if (Documentid == 0)
{
if (MissingDocument == null)
{
if (ci == null) ci = new ConfigInfo(null);
ci.AddItem("Printing", "Length", string.Format("{0:0.0000}", 0.001));
Byte[] tstbyte = System.Text.Encoding.Default.GetBytes("");
MissingDocument = Document.MakeDocument("MISSING FILE IN CONVERSION", tstbyte, null, ci.ToString(), null);
}
Documentid = MissingDocument.DocID;
missingDocFile = true;
}
}
}
if (Userid == null || Userid == "") Userid = "Migration";
// test for performance
Content cont;
using(Format fmt2 = format == null ? null : format.Get())
cont = Content.New(Number, Title, 10000+docstyleindx, fmt2, ci==null?null:ci.ToString(), Dts, Userid);
Entry entry = cont.MyEntry;
if (needEntry)
{
entry.MyDocument = Document.Get(Documentid);
entry.DTS = Dts;
entry.UserID = Userid;
}
cont.MyZContent.OldStepSequence = ProcNumber + "|" + stpseq;
Item itm = null;
// the stpseq for section records may include a space & some other data. This
// was not part of what is stored in the transition records, so just look at
// the sequence before the space for section records. Then use the first character
// with a '0'. This is what's stored in the transition record, for example, if the
// section was BI, the transition record would have B0 (the reasoning is that
// for steps, this is what could be stored if there were enough steps.
int trindxsp = stpseq.IndexOf(' ');
string trstpseq = trindxsp < 0 ? stpseq : stpseq.Substring(0, 1)+ "0";
if (dicTrans_ItemIds.ContainsKey(ProcNumber + "|" + trstpseq))
{
itm = dicTrans_ItemIds[ProcNumber + "|" + trstpseq];
itm.MyContent = cont;
itm.MyPrevious = FromItem;
itm.DTS = Dts;
itm.UserID = Userid;
if (!itm.IsSavable) ErrorRpt.ErrorReport(itm);
itm.Save();
dicTrans_ItemIds.Remove(ProcNumber + "|" + trstpseq);
dicTrans_MigrationErrors.Remove(ProcNumber + "|" + trstpseq);
}
else
itm = Item.MakeItem(FromItem, cont, Dts, Userid);
if (missingDocFile)
{
ItemAnnotation ia = itm.ItemAnnotations.Add(MigrationErrorType);
ia.SearchText = "Missing File In Conversion";
ia.UserID = "Migration";
itm.Save();
}
dicTrans_ItemDone[ProcNumber+"|"+trstpseq] = itm;
dicOldStepSequence[itm] = stpseq;
return itm;
}
catch (Exception ex)
{
frmMain.AddError(ex, "Save Section");
log.Error("Save Section");
log.ErrorFormat("oldstepsequence = {0}", stpseq);
log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException);
log.ErrorFormat(ex.StackTrace);
}
return null;
}
private int LookupOldToNew(string lkup)
{
if (dicOldToNew == null)
{
dicOldToNew = new Dictionary<string, int>();
//dicOldToNew.Add("", 1);
dicOldToNew.Add("0", 1);
dicOldToNew.Add("0 ", 1);
dicOldToNew.Add("00", 1);
dicOldToNew.Add("01", 2);
dicOldToNew.Add("02", 4);
dicOldToNew.Add("03", 8);
dicOldToNew.Add("04", 16);
dicOldToNew.Add("I", 32);
dicOldToNew.Add("I ", 32);
dicOldToNew.Add("I0", 32);
dicOldToNew.Add("I1", 64);
dicOldToNew.Add("I2", 128);
dicOldToNew.Add("I3", 256);
dicOldToNew.Add("I4", 512);
dicOldToNew.Add("A", 1024);
dicOldToNew.Add("A ", 1024);
dicOldToNew.Add("A0", 1024);
dicOldToNew.Add("A1", 2048);
dicOldToNew.Add("A2", 4096);
dicOldToNew.Add("A3", 8192);
dicOldToNew.Add("A4", 16384);
dicOldToNew.Add("F", 32768);
dicOldToNew.Add("F ", 32768);
dicOldToNew.Add("F0", 32768);
dicOldToNew.Add("F1", 65536);
dicOldToNew.Add("F2", 131072);
dicOldToNew.Add("F3", 262144);
dicOldToNew.Add("F4", 524288);
dicOldToNew.Add("05", 1048576);
dicOldToNew.Add("06", 2097152);
dicOldToNew.Add("07", 4194304);
dicOldToNew.Add("08", 8388608);
dicOldToNew.Add("09", 16777216);
dicOldToNew.Add("0:", 33554432);
dicOldToNew.Add("0;", 67108864);
dicOldToNew.Add("0<", 134217728);
dicOldToNew.Add("0=", 268435456);
dicOldToNew.Add("0>", 536870912);
}
int retval = -1;
try
{
retval = dicOldToNew[lkup];
}
catch (Exception ex)
{
frmMain.AddError(ex, "OldToNew {0}", lkup);
Console.WriteLine(string.Format("Error in oldtonew {0}", lkup));
Console.WriteLine(string.Format("Error = {0}", ex.Message));
}
return retval;
}
private int GetDocStyleIndx(string dstyleindx, FormatInfo format, Item procitem, /* DocVersion docver,*/ string Number, string Title)
{
// get the format, if format is set, use it, otherwise walk
//if (format == null)
//{
//format = GetFormat(procitem, docver);
//}
int docstyle = LookupOldToNew(dstyleindx);
foreach (DocStyle ds in format.PlantFormat.DocStyles.DocStyleList)
{
if ((ds.OldToNew & docstyle)>0) return (int)ds.Index;
}
frmMain.AddError("Bad OldToNew Document Style {0}:{1} dStyleIndex = '{2}'\r\n{3} - Missing OldToNew {4}",
procitem.DisplayNumber, (Number ?? "") == "" ? Title : Number, dstyleindx, format, docstyle);
return 0; // Default is Zero
}
//private FormatInfo GetFormat(Item procitem, DocVersion docver)
//{
// return procitem.MyItemInfo.ActiveFormat;
// //while (procitem.MyItemInfo.a .MyContent.MyFormat == null)
// //{
// // // find the first sibling
// // while (procitem.PreviousID != null)
// // procitem = procitem.MyPrevious;
// // if (procitem.ItemPartCount == 0) return docver.MyDocVersionInfo.ActiveFormat;
// // // find the parent node
// // procitem = procitem.ItemParts[0].MyContent.ContentItems[0].MyItem;
// //}
// //return procitem.MyContent.MyFormat;
//}
//private FormatInfo GetFormat(DocVersion docver)
//{
// if (docver.MyDocVersionInfo.MyFormat != null) return docver.MyDocVersionInfo.MyFormat;
// return GetFormat(docver.MyDocVersionInfo.MyFolder);
//}
//private FormatInfo GetFormat(FolderInfo folder)
//{
// if (folder.MyFormat != null) return folder.MyFolderInfo.MyFormat;
// return GetFormat(folder.MyParent);
//}
private string SectTitle(OleDbConnection cn, DataRowView dr, bool UseMultiLineSectionTitle, bool ConvertCaret)
{
string tbuff = null;
string menustr = null;
if (UseMultiLineSectionTitle)
{
bool titleInMemo = false;
// for accessory pages...
if (dr["Step"].ToString().Substring(1, 1) != "0")
{
// The long section title is stored on a record with the "~" character.
// This was done since originally the actual accessory page data was stored in the memo
// field, so the long title could not be stored there, another record had to be used.
OleDbDataAdapter da = new OleDbDataAdapter("select * from " + ProcFileName + " where [Step] like '" + dr["Step"].ToString().Substring(0, 1) + "~';", cn);
DataSet ds = new DataSet();
try
{
da.Fill(ds);
if (ds.Tables[0].Rows.Count == 1)
{
DataRow row = ds.Tables[0].Rows[0];
tbuff = TextConvert.ConvertText(row["Textm"].ToString(),ConvertCaret);
if (tbuff != null && tbuff != "") titleInMemo = true;
}
else // no long section title existed for this accessory page
tbuff = TextConvert.ConvertText(dr["Text"].ToString().PadRight(130, ' ').Substring(0, 75).TrimEnd(), ConvertCaret);
}
catch (Exception ex)
{
frmMain.AddError(ex, "Error getting long section title");
log.ErrorFormat("Error getting long section title {0}", ex.Message);
}
da.Dispose();
}
// For step sections, the long section title is stored on the section record
// (see above comment for accessory pages to see the difference)
else
{
tbuff = TextConvert.ConvertText(dr["TextM"].ToString().Trim(), ConvertCaret);
}
//// TESTS were run & it looked like that whitespace was removed before saving,
//// so, put up a message box if find out otherwise....
//int nl = tbuff.IndexOf("\n");
//if (nl > -1)
// MessageBox.Show("multiline text for section title, fix this!!");
//// remove newlines & any other escape/whitespace chars.
int nl = tbuff.IndexOf("\n");
if (nl > -1 || titleInMemo)
{
string tmpstr = tbuff.Replace("\r", "");
tmpstr = tmpstr.Replace("\t", "");
tmpstr = tmpstr.Replace("\n", " ");
// get rid of multiple spaces
while (tmpstr.IndexOf(" ") > -1) tmpstr = tmpstr.Replace(" ", " ");
tbuff = tmpstr;
if (tbuff.Substring(tbuff.Length - 1, 1) == " ") tbuff = tbuff.Substring(0, tbuff.Length - 1);
menustr = tbuff;
}
else
{
menustr = TextConvert.ConvertText(dr["Text"].ToString().PadRight(80, ' ').Substring(0, 75).TrimEnd(), ConvertCaret);
}
}
else
{ // format does not include long section title
menustr = TextConvert.ConvertText(dr["Text"].ToString().PadRight(80, ' ').Substring(0, 75).TrimEnd(), ConvertCaret);
}
return menustr;
}
private static Color _OverrideColor = Color.Red;
public static Color OverrideColor
{
get { return Loader._OverrideColor; }
set { Loader._OverrideColor = value; }
}
private Item MigrateSection(Item procitem, string procnum, OleDbConnection cn, DataRowView dr, DataTable dt, Item FromItem, bool isSubSection, string pth, DocVersion docver, FormatInfo activeFormat,Content cont)
{
Int32 thesectid = 0;
bool isautogen = false;
string stype = dr["type"].ToString();
string s = dr["text"].ToString().PadRight(130, ' ');
string rid = dr["recid"].ToString(); // RECID
string num = s.Substring(85, 20).TrimEnd();
string fmt = s.Substring(75, 10).TrimEnd();
if (fmt == "") fmt = null;
bool ismulti = false;
bool conv_caret = true;
// sectFormat is a local that represents the format to be used by this section.
// Note that if the format is set for this section, check it against what the inherited
// value would be (for example, what the format is for the set), if they are the same
// clear the format at the section level.
FormatInfo sectFormat = null;
FormatInfo docverFormat = activeFormat;//docver.MyDocVersionInfo.ActiveFormat;
if (fmt != null&& fmt !="") // Is there a long section title (from format flag)
sectFormat = GetFormat(fmt);
else // either from this format, or the plant.
sectFormat = docverFormat;
if (sectFormat != null)
{
ismulti = sectFormat.PlantFormat.FormatData.SectData.StepSectionData.UseMultiLineSectionTitle;
conv_caret = sectFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta;
}
if (fmt != null && fmt != "") if (fmt == docverFormat.Name) fmt = null;
string title = SectTitle(cn, dr, ismulti, conv_caret);
string init = dr["initials"].ToString().Trim();
string sequence = dr["CSequence"].ToString().PadRight(10);
string step = dr["CStep"].ToString();
int libDocid = 0;
DateTime dts = GetDTS(dr["Date"].ToString(), dr["Time"].ToString());
ConfigInfo ci = new ConfigInfo(null);
ci.AddItem("Section", "OldType", stype);
// for steps sections...
// Step Section Header Format:
// A0 1X2S51 &Y
// ^^^^^^^^^^^^
// |||||||||||||
// ||||||||||||`- 'Y','N', or blank signals to print section header - lib/section/addsec.c
// |||||||||||`-- (bits) Auto Indent, Editable Data, Checkoff Header Type - lib/section/addsec.c
// ||||||||||`--- blank
// ||||||||`----- Link With Enhanced Document ' '-Default(not determined) 0-NO 1-YES
// |||||||`------ MetaSection - number of subsections is given
// ||||||`------- S-Separate(PageBreak); T-Continuous; ' '-Default
// |||||`-------- Column mode (1,2,3,' '-default)
// ||||`--------- X -only proc section; x -orig. proc; ' ' -other
// |||`---------- Position within the procedure
// ||`----------- ALWAYS leave blank
// |`------------ Step Section Header marker
// `------------- Internal section number (starts at A)
if (step.Substring(1, 1) == "0")
{
// if this section has the original edit section flag (sequence[2]) save the id.
// set pagination, continuous, separate. If blank, don't create attribute - uses format default.
if (sequence.Substring(2, 1) != " ")
{
ci.AddItem("Section", "OriginalSteps", "Y");
}
if (sequence.Substring(4, 1) == "T")
{
ci.AddItem("Section", "Pagination", "C");
}
else if (sequence.Substring(4, 1) == "S")
{
ci.AddItem("Section", "Pagination", "S");
}
// Step: linked to enhanced (!exist = N)
if (sequence.Substring(7, 1) == "1")
{
ci.AddItem("Step", "LnkEnh", "Y");
}
char cbittst = sequence.PadRight(10)[8];
if (cbittst == ' ')
cbittst = '\0';
else
{
// determine if TOC element (!exist = N)
if ((cbittst & TOC) > 1)
{
ci.AddItem("Section", "TOC", "Y");
}
// determine if autogenerated section (!exist = N)
if ((cbittst & AUTOGEN) > 1)
{
isautogen = true;
ci.AddItem("Section", "AutoGen", "Y");
}
}
// Here are subsection flags, i.e. the following are only set if this
// is a subsection.
bool didsub = false;
if (isSubSection)
{
// Subsection: editable (!exist = Y)
if ((cbittst & EDDATA) > 0)
{
ci.AddItem("SubSection", "Edit", "N");
}
// Subsection: print section headers (!exist = Y)
if ((cbittst & PH) > 0)
{
didsub = true;
ci.AddItem("SubSection", "PH", "N");
}
// Subsection: autoindent (!exist = Y)
if ((cbittst & AUTOIND) > 0)
{
ci.AddItem("SubSection", "AutoIndent", "N");
}
}
if (!didsub && sequence.Substring(4, 1) == "N")
{
ci.AddItem("SubSection", "PH", "N");
}
// Save section level Checkoff information
int chkOffType = (rid[0] & 0x007F) - '0';
if (chkOffType > 0)
ci.AddItem("Section", "CheckoffSelection", chkOffType.ToString());
if (stype.Length > 1)
{
int chkOffHeading = (stype[1] & 0x007F) - '0';
if (chkOffHeading > 0)
ci.AddItem("Section", "CheckoffHeading", chkOffHeading.ToString());
}
}
else
{
// Accessory Section Format:
// AI 1 2
// ^^ ^ ^
// || | |
// || | `- # of pages (ASCII value minus 48)
// || `--- Position within the procedure
// |`----- Acc. page type (A,I, or F)
// `------ Internal section number (starts at A)
ci.AddItem("Section", "NumPages", sequence.Substring(3, 1));
// see if it's a libdoc too
string thekey = procnum.PadRight(20) + step.Substring(0, 1).PadRight(10);
if (dicLibDocRef.ContainsKey(thekey))
{
// if it is a library document, see if the section record has already been
// saved. If it has, just use this section id, otherwise, create the
// section record with info from the library document file.
libDocid = dicLibDocRef[thekey];
}
}
//Console.WriteLine("Before AddSection");
Item secitem = AddSection(procitem, num, title, stype, dts, init, ci, step + sequence, fmt, libDocid, pth, FromItem, sectFormat);
//Console.WriteLine("After AddSection");
if (secitem == null)
throw (new Exception("Null parameter in AddSection"));
if (cont != null)
{
// ContentsParts.Add can use 'fromtype', item - fromtype here = 2, section
cont.ContentParts.Add(2, secitem);
if (cont.MyZContent.OldStepSequence == null || cont.MyZContent.OldStepSequence == "") cont.MyZContent.OldStepSequence = ProcNumber;
if (!cont.IsSavable) ErrorRpt.ErrorReport(cont);
cont.Save();
}
thesectid = secitem.ItemID;
using (ItemInfo seciteminfo = ItemInfo.Get(thesectid))
{
if (seciteminfo.MyContent.ContentEntryCount != 0)
{
using (DocumentInfo di = DocumentInfo.Get(secitem.MyContent.MyEntry.DocID))
{
MSWordToPDF.UpdateDocPdf(di, OverrideColor);
}
}
}
// if the editsectid hasn't been set yet, set it to this section id, i.e. the first
// one processed. Then if this section has the original edit section flag (sequence[2])
// save the id. The first step is necessary in case there is no original edit section
// flag set, so that the first section is the default one to get opened in edit.
if (EditSectId==0)EditSectId = thesectid;
if (libDocid<1 && step[1] == '0' && (sequence[2] == 'x' || sequence[2] == 'X'))
EditSectId = thesectid;
// ContentType (2 in the following call) are:
// 0 = structure,
// 1 = procedure,
// 2 = section,
// 3 = step
// 4 = branch
// fromtype values are (see steps.cs too)
// 1 = procedure,
// 2 = section,
// 3 = caution
// 4 = note
// 5 = RNO
// 6 = step
// 7 = table
if (!isautogen)
{
// Process the Data Table - First look for High Level Steps
string sQry = string.Format("Step like '[{0}]%' and Sequence='S'", dr["Step"].ToString().Substring(0, 1));
DataView dv = new DataView(dt, sQry, "StepNo", DataViewRowState.CurrentRows);
Item FrItem = null;
frmMain.pbStepMaximum = dt.Rows.Count;
frmMain.pbStepValue = 0;
int type = 6;
foreach (DataRowView drv in dv)
{
FrItem = MigrateStep(cn, dt, drv, FrItem, conv_caret, pth, docver, sectFormat, secitem, type);
type = 0; // Only add ContentPart for first child
//if (secitem.MyContent.ContentParts.Count == 0)
//{
// // type 6 is step
// secitem.MyContent.ContentParts.Add(6, FrItem);
// if (!secitem.MyContent.IsSavable) ErrorRpt.ErrorReport(secitem.MyContent);
// secitem.MyContent.Save();
//}
}
}
return secitem;
}
private void LoadSection(DataSet ds, OleDbDataAdapter da, string FileName)
{
try
{
da.Fill(ds, "Sections");
DataTable dt = ds.Tables["Sections"];
dt.CaseSensitive = true;
dt.Columns.Add("CStep", System.Type.GetType("System.String"));
dt.Columns.Add("CSequence", System.Type.GetType("System.String"));
// set the cstep & csequence - couldn't do it in the add because it needed a sql function
foreach (DataRow drw in ds.Tables["Sections"].Rows)
{
drw["CStep"] = TextConvert.ConvertSeq(drw["Step"].ToString());
drw["CSequence"] = TextConvert.ConvertSeq(drw["Sequence"].ToString());
}
dt.Columns.Add("StepNo", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CStep,2,1),'System.Char'),'System.Int32')-48");
dt.Columns.Add("Level", System.Type.GetType("System.Int32"), "Len(CSequence)");
dt.Columns.Add("SubStepNo", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CSequence,Len(CSequence),1),'System.Char'),'System.Int32')-48");
dt.Columns.Add("locb", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CSequence,2,1),'System.Char'),'System.Int32')-48");
}
catch (Exception ex)
{
FileInfo fi;
switch (ex.Message)
{
case "Index file not found.":// then delete inf file
fi = new FileInfo(frmMain.tbSourceText + "\\" + FileName + ".inf");
fi.Delete();
LoadSection(ds, da, FileName);// Try Again
break;
case "External table is not in the expected format.": // then pad dbt file with 128 zeros.
fi = new FileInfo(frmMain.tbSourceText + "\\" + FileName + ".dbt");
FileStream fs = fi.OpenWrite();
fs.Position = fs.Length;
byte[] buf = new byte[128];
for (int i = 0; i < 128; i++) buf[i] = 0;
fs.Write(buf, 0, 128);
fs.Close();
LoadSection(ds, da, FileName);// Try Again
break;
default: // Unrecognized error
frmMain.AddError(ex, "Unrecognized error in LoadSection {0}", FileName);
Console.WriteLine("Unrecognized error: error = {0}", ex.Message);
log.ErrorFormat("File - {0}.DBF\r\n\r\n{1}\r\n\r\n{2}", FileName, ex.Message, ex.InnerException);
break;
}
}
}
}
}