From: Owen Leonard Date: Mon, 6 Sep 2010 23:34:35 +0000 (-0600) Subject: Updated "Phone 1" field to be "Household Phone" to match MLS X-Git-Tag: release_0_4_0~3 X-Git-Url: http://git.pippins.net/embedvideo/.git/%7Bnolink%7D?a=commitdiff_plain;h=fd3afb11f083a1d2610997ee85c550ff67586314;p=eq%2F.git Updated "Phone 1" field to be "Household Phone" to match MLS updated install instructions added mls report file to create the home teaching stats csv file adding C# windows program and python script for parsing mls data (c#-.net 3.5, python-2.6) --- diff --git a/bin/import_ward_data b/bin/import_ward_data index ef7eac4..b369661 100755 --- a/bin/import_ward_data +++ b/bin/import_ward_data @@ -54,6 +54,38 @@ sub csv_to_hash close(FILE); } +sub optional_csv_to_hash +{ + my ($filename, $hashref) = @_; + + my $opened = open(FILE,$filename); + + if ($opened) { + my $found_header = 0; my $index = 0; + while() + { + $line = $_; + @data = split /\",/, $line; + if(!$found_header) { @header = @data; $found_header = 1; } + else { + foreach $i (0..$#data-1) { + $data[$i] =~ s/\"//g; + $header[$i] =~ s/\"//g; + $hashref->{$index}{$header[$i]} = $data[$i]; + #print "$index: $i: $header[$i]: $data[$i]\n"; + } + $index++; + } + } + + close(FILE); + } + else + { + print "-W- could not open optional csv file $filename\n"; + } +} + ###################################################################### sub print_hash { @@ -96,7 +128,7 @@ sub update_eq_aaronic_table $membership_data{$index}{$key} =~ /^Teacher\s*$/i || $membership_data{$index}{$key} =~ /^Priest\s*$/i)) { $aaronic_name = $membership_data{$index}{'Preferred Name'}; - $phone = $membership_data{$index}{'Phone 1'}; + $phone = $membership_data{$index}{'Household Phone'}; if($phone =~ /(\d\d\d-\d\d\d\d)/) { $phone = "$areacode-$1"; } if($phone =~ /^\(\d\d\d\) (\d\d\d-\d\d\d\d)/) { $phone = "$1-$2"; } $sth = $dbh->prepare("select * from eq_aaronic where name='$aaronic_name'"); @@ -157,7 +189,7 @@ sub update_eq_elder_table if($key =~ /Priesthood/i && $membership_data{$index}{$key} =~ /Elder/i) { $id = $membership_data{$index}{'Indiv ID'}; $elder_name = $membership_data{$index}{'Preferred Name'}; - $phone = $membership_data{$index}{'Phone 1'}; + $phone = $membership_data{$index}{'Household Phone'}; $organization = $organization_by_id{$id}; $attending = 0; if(($organization =~ /Elders/) || @@ -496,7 +528,7 @@ sub update_eq_parent_table $birthday =~ /(\d+) (\S+) (\d+)/; $day=$1; $month=$monthname2num{$2}; $year=$3; $hofh_id = $membership_data{$index}{'HofH ID'}; $id = $membership_data{$index}{'Indiv ID'}; - $phone = $membership_data{$index}{'Phone 1'}; + $phone = $membership_data{$index}{'Household Phone'}; if($phone =~ /(\d\d\d-\d\d\d\d)/) { $phone = "$areacode-$1"; } if($phone =~ /^\(\d\d\d\) (\d\d\d-\d\d\d\d)/) { $phone = "$1-$2"; } $address = $membership_data{$index}{'Street 1'}; @@ -625,6 +657,113 @@ sub update_eq_child_table } } +# EQ_VISIT +#+----------------+------------------+------+-----+---------+-------+ +#| Field | Type | Null | Key | Default | Extra | +#+----------------+------------------+------+-----+---------+-------+ +#| visit | int(16) unsigned | | PRI | 0 | A | +#| family | int(16) unsigned | YES | UNI | NULL | | +#| companionship | int(16) unsigned | YES | | NULL | | +#| date | date | YES | | NULL | | +#| notes | varchar(128) | YES | | NULL | | +#| visited | varchar(1) | YES | | NULL | | +#+----------------+------------------+------+-----+---------+-------+ +sub update_eq_visit_table +{ + print "\n-> updating eq_visit table\n"; + + my $month_header_retrieved = 0; + my $month_header; + my @data_months; + my %months = ('Jan', 1, 'Feb', 2, 'Mar', 3, 'Apr', 4, 'May', 5, 'Jun', 6, 'Jul', 7, 'Aug', 8, 'Sep', 9, 'Oct', 10, 'Nov', 11, 'Dec', 12); + ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(); + my %visit_status = ('X', 'y', '-', 'n', '', ''); + + foreach $index (keys %hometeaching_stats_data) + { + $hashref = $hometeaching_stats_data{$index}; + #foreach $key (keys %$hashref) {print "$key\n";} + + $family_name = $hometeaching_stats_data{$index}{"Preferred Name"}; + print " Updating visit data: $family_name\n"; + + # get family id from eq_family + $sth = $dbh->prepare("select * from eq_family where name=\"$family_name\" and valid=1"); + $sth->execute or die "-E- DB error: $DBI::errstr\n"; + my @family_data = (); + while($sqlhashref = $sth->fetchrow_hashref) { push(@family_data, $sqlhashref); } + my $family_rows = scalar @family_data; + if($family_rows > 0) { + $family_id = $family_data[0]->{'family'}; + $comp_id = $family_data[0]->{'companionship'}; + } + else { next; } + #print "family_id = $family_id\n"; + #print "comp_id = $comp_id\n"; + + # ignore visits that weren't done by the EQ + if ($comp_id == 0) { next; } + + # retrieve the month header if not already done + if ($month_header_retrieved == 0) + { + foreach $key (keys %$hashref) + { + if (($key ne "Preferred Name") && ($key ne "Home Teachers")) + { + $month_header = $key; + @data_months = split /\t/, $key; + } + } + $month_header_retrieved = 1; + } + + # loop through history data + @history = split /\t/, $hometeaching_stats_data{$index}{$month_header}; + my $data_year = 1900 + $yearOffset; + my $data_month = $months{$data_months[-1]}; + #print "$month_header\n"; + #print $hometeaching_stats_data{$index}{$month_header}; + #print "\n"; + foreach $i (reverse(0..$#history)) { + # went back a calendar year, decrement $data_year + if ($months{$data_months[$i]} > $data_month) + { + $data_year -= 1; + } + $data_month = $months{$data_months[$i]}; + my $visit_date = sprintf("%4d-%02d-01\n", $data_year, $data_month); + #print "$visit_date\n"; + my $importing_status = $visit_status{$history[$i]}; + #print "importing_status = $importing_status\n"; + #print "select * from eq_visit where family=$family_id and companionship=$comp_id and date='$visit_date'\n"; + $sth = $dbh->prepare("select * from eq_visit where family=$family_id and companionship=$comp_id and date='$visit_date'"); + $sth->execute or die "-E- DB error: $DBI::errstr\n"; + my @visit_data = (); + while($sqlhashref = $sth->fetchrow_hashref) { push(@visit_data, $sqlhashref); } + my $visit_rows = scalar @visit_data; + if($visit_rows > 0) { + my $visited = $visit_data[0]->{'visited'}; + #print "visited = $visited\n"; + # update visit if data is different in eq_visit + if ($visited ne $importing_status) + { + #print "importing_status = $importing_status\n"; + $sth = $dbh->prepare("update eq_visit set visited='$importing_status' where family='$family_id' and date='$visit_date' and companionship='$comp_id'"); + $sth->execute or die "-E- DB error: $DBI::errstr\n"; + } + } else { + if ($importing_status ne '') + { + # add visit if it doesn't exist in eq_visit + $sth = $dbh->prepare("insert into eq_visit values (NULL, '$family_id', '$comp_id', '$visit_date', '', '$importing_status')"); + $sth->execute or die "-E- DB error: $DBI::errstr\n"; + } + } + } + } +} + ###################################################################### sub check_for_changed_ids { @@ -705,6 +844,7 @@ print "\n-> Processing all ward data files in $datadir\n"; &csv_to_hash("$datadir/Membership.csv",\%membership_data); &csv_to_hash("$datadir/HomeTeaching.csv",\%hometeaching_data); &csv_to_hash("$datadir/Organization.csv",\%organization_data); +&optional_csv_to_hash("$datadir/Home\ Teacher\ per\ Companionship.csv", \%hometeaching_stats_data); %organization_by_name = (); %organization_by_id = (); @@ -715,6 +855,8 @@ if($opt_v) { &print_hash(\%hometeaching_data); print "-> Organization Data Dump\n\n"; &print_hash(\%organization_data); + print "-> HomeTeaching Stats Data Dump\n\n"; + &print_hash(\%hometeaching_stats_data); } if($opt_s) { $dbh->disconnect(); exit; } @@ -728,6 +870,7 @@ if($opt_s) { $dbh->disconnect(); exit; } &update_eq_family_table(); &update_eq_parent_table(); &update_eq_child_table(); +&update_eq_visit_table(); print "\n-> Import Successful! DONE...\n"; diff --git a/doc/install.txt b/doc/install.txt index 4ae8d9c..114ebaa 100644 --- a/doc/install.txt +++ b/doc/install.txt @@ -64,13 +64,15 @@ Requirements Membership.csv: Preferred Name - Phone 1 + Household Phone Indiv ID HofH ID Street 1 Street 2 Birth Full Name + Priesthood + HH Position Hometeaching.csv: Home Teacher 1 @@ -78,6 +80,8 @@ Requirements Comp ID HT District Household + Quorum + Supervisor Organization.csv: Indiv ID @@ -87,3 +91,5 @@ Requirements Org Seq Sustained + Home Teacher per Companionship.csv (optional file that lists home teaching stats - use all fields) + import mls/Home\ Teacher\ per\ Companionship.mls as a new report into MLS to create the csv file. diff --git a/mls/Home Teacher per Companionship.mls b/mls/Home Teacher per Companionship.mls new file mode 100644 index 0000000..007037c --- /dev/null +++ b/mls/Home Teacher per Companionship.mls @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/mls/mlstrimmer.py b/mls/mlstrimmer.py new file mode 100755 index 0000000..ccd55e3 --- /dev/null +++ b/mls/mlstrimmer.py @@ -0,0 +1,116 @@ +#! /usr/bin/env python + +import os +import sys +import csv +import zipfile +import tempfile +from optparse import OptionParser +from xml.dom.minidom import parse, parseString + +def ParseFile(xmlNode, zipfile): + + filename = os.path.join(options.directory, xmlNode.getAttribute("Name")) + if options.verbose: print "Trimming %s" % (filename) + + #create dictionary of header locations + headers = xmlNode.getElementsByTagName("MLSField") + allColumns = False + headerMap = {} + for header in headers: + if header.firstChild.data == "*": + allColumns = True + else: + headerMap[header.firstChild.data] = -1 + if options.verbose: print "xml file says to save: %s" % (headerMap) + + try: + f = csv.reader(open(filename)) + firstLineRead = False + + tf = tempfile.NamedTemporaryFile() + + headersToSave = [] + for line in f: + if not firstLineRead: + s1 = set(item for item in line if item != '') + s2 = set(headerMap.keys()) + if allColumns: + s2 = s1 + + s3 = s1.intersection(s2) + + headerMap.clear() + for i in s3: + headerMap[i] = line.index(i) + headersToSave = headerMap.keys() + if options.verbose: print "The columns that exist in both the xml and csv files are:" % (headersToSave) + firstLineRead = True + + lineToWrite = "" + for h in headersToSave: + lineToWrite = "%s\"%s\"," % (lineToWrite, line[headerMap[h]]) + if options.verbose: print lineToWrite + tf.write(lineToWrite + "\n") + #if options.verbose: print line + zipfile.write(tf.name, xmlNode.getAttribute("Name")) + tf.close() + + except IOError, e: + print e + sys.exit() + + + +if __name__ == '__main__': + # read in command line arguments and parse them + parser = OptionParser() + parser.add_option("-c", dest="configFile", default="MLSRequiredFields.xml", + help="xml config file name") + parser.add_option("-d", "--directory", dest="directory", default=os.environ["PWD"], + help="directory where csv files are located") + parser.add_option("-v", "--verbose", dest="verbose", action="store_true", + help="show verbose messaging") + (options, args) = parser.parse_args() + + # make sure xml file exists and we can read it + if not os.access(options.configFile, os.R_OK): + print "%s is not accessible" % (options.configFile) + sys.exit() + # make sure we have write perms on the directory + if not os.access(options.directory, os.W_OK): + print "%s is not accessible" % (options.directory) + sys.exit() + + # read in the xml + dom1 = parse(options.configFile) + mlsFiles = dom1.firstChild.childNodes[1].getElementsByTagName("MLSFile") + + # make sure all files are accessible (if they are not optional) + for csvFile in mlsFiles: + fullname = os.path.join(options.directory, csvFile.getAttribute("Name")) + if not os.access(fullname, os.W_OK): + print "%s does not exist, or has the wrong permissions" % (fullname) + sys.exit() + + + # create zip file + try: + zfile = zipfile.ZipFile(os.path.join(options.directory, "EQZipFile.zip"), "w") + for csvFile in mlsFiles: + ParseFile(csvFile, zfile) + zfile.close() + except IOError, e: + print e + sys.exit() + + # delete original files + for csvFile in mlsFiles: + fullname = os.path.join(options.directory, csvFile.getAttribute("Name")) + try: + os.remove(fullname) + except OSError, e: + print "could not delete %s, please delete it manually" % (fullname) + + + if options.verbose: print "Finished!" diff --git a/mls/windowsGUI/MLSFileTrimmer.sln b/mls/windowsGUI/MLSFileTrimmer.sln new file mode 100644 index 0000000..6c54695 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer.sln @@ -0,0 +1,24 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MLSFileTrimmer", "MLSFileTrimmer\MLSFileTrimmer.csproj", "{FB8A0153-84AA-402E-A5F4-E790AFF2B261}" +EndProject +Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "MLSFileTrimmerInstaller", "MLSFileTrimmerInstaller\MLSFileTrimmerInstaller.vdproj", "{BB14AFD8-EE0B-4094-B69A-DBC2AA4F6554}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FB8A0153-84AA-402E-A5F4-E790AFF2B261}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB8A0153-84AA-402E-A5F4-E790AFF2B261}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB8A0153-84AA-402E-A5F4-E790AFF2B261}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB8A0153-84AA-402E-A5F4-E790AFF2B261}.Release|Any CPU.Build.0 = Release|Any CPU + {BB14AFD8-EE0B-4094-B69A-DBC2AA4F6554}.Debug|Any CPU.ActiveCfg = Debug + {BB14AFD8-EE0B-4094-B69A-DBC2AA4F6554}.Release|Any CPU.ActiveCfg = Release + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/mls/windowsGUI/MLSFileTrimmer/App.xaml b/mls/windowsGUI/MLSFileTrimmer/App.xaml new file mode 100644 index 0000000..9220222 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/App.xaml @@ -0,0 +1,8 @@ + + + + + diff --git a/mls/windowsGUI/MLSFileTrimmer/App.xaml.cs b/mls/windowsGUI/MLSFileTrimmer/App.xaml.cs new file mode 100644 index 0000000..62de0bb --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/App.xaml.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Windows; + +namespace MLSFileTrimmer +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } +} diff --git a/mls/windowsGUI/MLSFileTrimmer/CSVTrimmer.cs b/mls/windowsGUI/MLSFileTrimmer/CSVTrimmer.cs new file mode 100644 index 0000000..9b39874 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/CSVTrimmer.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +namespace MLSFileTrimmer +{ + public class CSVTrimmer + { + private String filename = String.Empty; + private Hashtable mlsFields = new Hashtable(); + + public CSVTrimmer(ThirdCouncelorMLSFilesMLSFile xmlData) + { + this.filename = xmlData.Name; + + foreach (String s in xmlData.MLSField) + { + this.mlsFields.Add(s, -1); + } + } + + public void ExtractData(StreamReader readFile, StreamWriter outFile) + { + string line; + string[] row; + + // get headers and create mapping + if ((line = readFile.ReadLine()) != null) + { + row = line.Split('"'); + for (int x = 0; x < row.Length; x++) + { + if (!(row[x].Equals(",")) && !(row[x].Equals(""))) + { + if (this.mlsFields.ContainsKey(row[x]) || this.mlsFields.ContainsKey("*")) + { + this.mlsFields[row[x]] = x; + } + } + } + } + + // write headers in new file + ICollection headers = this.mlsFields.Keys; + StringBuilder sb = new StringBuilder(); + foreach (string s in headers) + { + int index = Convert.ToInt32(this.mlsFields[s]); + if (index >= 0) + { + sb.Append("\""); + sb.Append(s); + sb.Append("\","); + } + } + //sb.Remove(sb.Length - 1, 1); // remove trailing comma + outFile.WriteLine(sb.ToString()); + + // only write specified fields in new file + while ((line = readFile.ReadLine()) != null) + { + sb.Remove(0, sb.Length); + row = line.Split('"'); + foreach (string s in headers) + { + int index = Convert.ToInt32(this.mlsFields[s]); + if (index >= 0) + { + sb.Append("\""); + sb.Append(row[index]); + sb.Append("\","); + } + } + //sb.Remove(sb.Length - 1, 1); // remove trailing comma + outFile.WriteLine(sb.ToString()); + } + } + } +} diff --git a/mls/windowsGUI/MLSFileTrimmer/Ionic.Zip.dll b/mls/windowsGUI/MLSFileTrimmer/Ionic.Zip.dll new file mode 100644 index 0000000..7b11577 Binary files /dev/null and b/mls/windowsGUI/MLSFileTrimmer/Ionic.Zip.dll differ diff --git a/mls/windowsGUI/MLSFileTrimmer/MLSFileTrimmer.csproj b/mls/windowsGUI/MLSFileTrimmer/MLSFileTrimmer.csproj new file mode 100644 index 0000000..24b3d04 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/MLSFileTrimmer.csproj @@ -0,0 +1,114 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {FB8A0153-84AA-402E-A5F4-E790AFF2B261} + WinExe + Properties + MLSFileTrimmer + MLSFileTrimmer + v3.5 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + .\Ionic.Zip.dll + + + + 3.5 + + + + 3.5 + + + 3.5 + + + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + App.xaml + Code + + + Window1.xaml + Code + + + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + PreserveNewest + + + + + \ No newline at end of file diff --git a/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.cs b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.cs new file mode 100644 index 0000000..0f00757 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.cs @@ -0,0 +1,118 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4005 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System.Xml.Serialization; + +// +// This source code was auto-generated by xsd, Version=2.0.50727.3038. +// + +namespace MLSFileTrimmer +{ + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] + [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] + public partial class ThirdCouncelorMLSFiles + { + + private ThirdCouncelorMLSFilesMLSFile[] cSVFilesField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("MLSFile", IsNullable = false)] + public ThirdCouncelorMLSFilesMLSFile[] CSVFiles + { + get + { + return this.cSVFilesField; + } + set + { + this.cSVFilesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] + public partial class ThirdCouncelorMLSFilesMLSFile + { + + private string descriptionField; + + private string extensionField; + + private string[] mLSFieldField; + + private string nameField; + + /// + public string Description + { + get + { + return this.descriptionField; + } + set + { + this.descriptionField = value; + } + } + + /// + public string Extension + { + get + { + return this.extensionField; + } + set + { + this.extensionField = value; + } + } + + /// + [System.Xml.Serialization.XmlElementAttribute("MLSField")] + public string[] MLSField + { + get + { + return this.mLSFieldField; + } + set + { + this.mLSFieldField = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Name + { + get + { + return this.nameField; + } + set + { + this.nameField = value; + } + } + } +} \ No newline at end of file diff --git a/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xml b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xml new file mode 100644 index 0000000..1c2ea73 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xml @@ -0,0 +1,48 @@ + + + + + Membership file + csv + Preferred Name + Household Phone + Indiv ID + HofH ID + Street 1 + Street 2 + Birth + Full Name + Priesthood + HH Position + + + + Home Teaching file + csv + Home Teacher 1 + Home Teacher 2 + Comp ID + HT District + Household + Quorum + Supervisor + + + + Organization file + csv + Indiv ID + Indiv Name + Organization + Position + Org Seq + Sustained + + + + Home Teaching Statistics file + csv + * + + + diff --git a/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xsd b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xsd new file mode 100644 index 0000000..3e3a2f1 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/MLSRequiredFields.xsd @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mls/windowsGUI/MLSFileTrimmer/Properties/AssemblyInfo.cs b/mls/windowsGUI/MLSFileTrimmer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..bcedbd1 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MLSFileTrimmer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("HP")] +[assembly: AssemblyProduct("MLSFileTrimmer")] +[assembly: AssemblyCopyright("Copyright © HP 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.Designer.cs b/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.Designer.cs new file mode 100644 index 0000000..00d8a15 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4005 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MLSFileTrimmer.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MLSFileTrimmer.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.resx b/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.Designer.cs b/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.Designer.cs new file mode 100644 index 0000000..2b4bf23 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4005 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MLSFileTrimmer.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.settings b/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.settings new file mode 100644 index 0000000..8f2fd95 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/mls/windowsGUI/MLSFileTrimmer/Window1.xaml b/mls/windowsGUI/MLSFileTrimmer/Window1.xaml new file mode 100644 index 0000000..074a27e --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/Window1.xaml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/mls/windowsGUI/MLSFileTrimmer/Window1.xaml.cs b/mls/windowsGUI/MLSFileTrimmer/Window1.xaml.cs new file mode 100644 index 0000000..098aa47 --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmer/Window1.xaml.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using Microsoft.Win32; +using System.IO; +using FolderBrowserDialog = System.Windows.Forms.FolderBrowserDialog; +using System.Xml.Serialization; +using System.Xml; +using Ionic.Zip; +using System.ComponentModel; +using System.Threading; + +namespace MLSFileTrimmer +{ + /// + /// Interaction logic for Window1.xaml + /// + public partial class Window1 : Window + { + // default to My Documents + private String currentDirectory = String.Empty; + private ThirdCouncelorMLSFiles thirdCouncelorXml; + private BackgroundWorker worker; + + public Window1() + { + InitializeComponent(); + + // read in xml file + try + { + TextReader reader = new StreamReader("MLSRequiredFields.xml"); + XmlSerializer serializer = new XmlSerializer(typeof(ThirdCouncelorMLSFiles)); + this.thirdCouncelorXml = (ThirdCouncelorMLSFiles)serializer.Deserialize(reader); + reader.Close(); + } + catch (XmlException ex) + { + MessageBox.Show(ex.Message, "XML Parse Error", MessageBoxButton.OK, MessageBoxImage.Error); + } + catch (InvalidOperationException ioe) + { + MessageBox.Show(ioe.InnerException.Message, "XML Serialization Error", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + + + private void outDirButton_Click(object sender, RoutedEventArgs e) + { + FolderBrowserDialog openFolderDialog = new FolderBrowserDialog(); + + openFolderDialog.RootFolder = Environment.SpecialFolder.MyDocuments; + if (openFolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + outputDirtextBox.Text = openFolderDialog.SelectedPath; + currentDirectory = openFolderDialog.SelectedPath; + } + } + + private void parseButton_Click(object sender, RoutedEventArgs e) + { + // make sure the directory exists + if (outputDirtextBox.Text.Equals(String.Empty)) + { + MessageBox.Show("Please select the correct output directory."); + return; + } + else if (!Directory.Exists(outputDirtextBox.Text)) + { + MessageBox.Show(outputDirtextBox.Text + " does not exist. Please select the correct output directory."); + } + + // make sure the original files exist + foreach (ThirdCouncelorMLSFilesMLSFile csvFile in this.thirdCouncelorXml.CSVFiles) + { + if (!File.Exists(this.currentDirectory + "\\" + csvFile.Name)) + { + MessageBox.Show(csvFile.Name + " does not exist. Are you sure you have the right directory?"); + return; + } + } + + // TODO: move to new background thread, post progress dialog + this.worker = new BackgroundWorker(); + this.worker.DoWork +=new DoWorkEventHandler(worker_DoWork); + this.worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); + this.worker.RunWorkerAsync(); + + this.trimmingLabel.Visibility = Visibility.Visible; + } + + private void worker_DoWork(object sender, DoWorkEventArgs e) + { + // create new zip file + using (ZipFile zip = new ZipFile()) + { + + // trim each csv file + foreach (ThirdCouncelorMLSFilesMLSFile csvFile in this.thirdCouncelorXml.CSVFiles) + { + string newFilename = this.currentDirectory + "\\" + csvFile.Name; + string origFilename = newFilename + ".orig"; + File.Move(newFilename, origFilename); + + using (StreamReader origFile = new StreamReader(origFilename)) + { + using (StreamWriter newFile = new StreamWriter(newFilename)) + { + CSVTrimmer csvTrimmer = new CSVTrimmer(csvFile); + csvTrimmer.ExtractData(origFile, newFile); + } + } + // add new to zip file + zip.AddItem(newFilename, ""); + } + zip.Save(this.currentDirectory + "\\" + "EQZipFile.zip"); + } + + Thread.Sleep(1000); + + // delete csv files + StringBuilder sb = new StringBuilder(); + foreach (ThirdCouncelorMLSFilesMLSFile csvFile in this.thirdCouncelorXml.CSVFiles) + { + sb.Remove(0, sb.Length); + sb.Append(this.currentDirectory); + sb.Append("\\"); + sb.Append(csvFile.Name); + File.Delete(sb.ToString()); + sb.Append(".orig"); + File.Delete(sb.ToString()); + } + } + + private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + this.trimmingLabel.Visibility = Visibility.Hidden; + this.finishedLabel.Visibility = Visibility.Visible; + } + } +} diff --git a/mls/windowsGUI/MLSFileTrimmerInstaller/MLSFileTrimmerInstaller.vdproj b/mls/windowsGUI/MLSFileTrimmerInstaller/MLSFileTrimmerInstaller.vdproj new file mode 100644 index 0000000..e45f9bb --- /dev/null +++ b/mls/windowsGUI/MLSFileTrimmerInstaller/MLSFileTrimmerInstaller.vdproj @@ -0,0 +1,811 @@ +"DeployProject" +{ +"VSVersion" = "3:800" +"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:MLSFileTrimmerInstaller" +"LanguageId" = "3:1033" +"CodePage" = "3:1252" +"UILanguageId" = "3:1033" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_23F1FB896E824A679B37949346C05547" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_5642279778584C4AB08E32A595FB6C82" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AC035A5C33626ACA61BCD2318245A97A" + "OwnerKey" = "8:_5642279778584C4AB08E32A595FB6C82" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_5642279778584C4AB08E32A595FB6C82" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_AC035A5C33626ACA61BCD2318245A97A" + "MsmSig" = "8:_UNDEFINED" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:Debug\\MLSFileTrimmerInstaller.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + } + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:Release\\MLSFileTrimmerInstaller.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1" + { + "Name" = "8:.NET Framework 3.5 SP1" + "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1" + } + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" + { + "Name" = "8:Windows Installer 3.1" + "ProductCode" = "8:Microsoft.Windows.Installer.3.1" + } + } + } + } + } + "Deployable" + { + "CustomAction" + { + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_393CAD7244BD468193F0F118269A7C27" + { + "Name" = "8:.NET Framework" + "Message" = "8:[VSDNETMSG]" + "Version" = "8:3.5.30729" + "AllowLaterVersions" = "11:FALSE" + "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=76617" + } + } + } + "File" + { + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_23F1FB896E824A679B37949346C05547" + { + "SourcePath" = "8:..\\MLSFileTrimmer\\bin\\Release\\MLSRequiredFields.xml" + "TargetName" = "8:MLSRequiredFields.xml" + "Tag" = "8:" + "Folder" = "8:_2B5E9E5E32C84619823E502184B2A72C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5642279778584C4AB08E32A595FB6C82" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:MLSFileTrimmer, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_5642279778584C4AB08E32A595FB6C82" + { + "Name" = "8:MLSFileTrimmer.exe" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:..\\MLSFileTrimmer\\bin\\Release\\MLSFileTrimmer.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_2B5E9E5E32C84619823E502184B2A72C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AC035A5C33626ACA61BCD2318245A97A" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Ionic.Zip, Version=1.9.1.5, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_AC035A5C33626ACA61BCD2318245A97A" + { + "Name" = "8:Ionic.Zip.DLL" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Ionic.Zip.DLL" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_2B5E9E5E32C84619823E502184B2A72C" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + } + "FileType" + { + } + "Folder" + { + "{1525181F-901A-416C-8A58-119130FE478E}:_1277279AD8B443BCB64D19D1729C9E9D" + { + "Name" = "8:#1916" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:DesktopFolder" + "Folders" + { + } + } + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_2B5E9E5E32C84619823E502184B2A72C" + { + "DefaultLocation" = "8:[ProgramFilesFolder]\\[ProductName]" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_A73814472A784ED28E52A258A1870893" + { + "Name" = "8:#1919" + "AlwaysCreate" = "11:TRUE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:ProgramMenuFolder" + "Folders" + { + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "MsiBootstrapper" + { + "LangId" = "3:1033" + "RequiresElevation" = "11:FALSE" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:MLSFileTrimmer" + "ProductCode" = "8:{0207BA73-A23A-44DE-BFA8-E26EAD156468}" + "PackageCode" = "8:{7C3340C5-60EE-44E5-B6C0-E7D5B03C1F3C}" + "UpgradeCode" = "8:{493247E6-F4BC-4B0F-B241-951C27338FCF}" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:TRUE" + "DetectNewerInstalledVersion" = "11:TRUE" + "InstallAllUsers" = "11:FALSE" + "ProductVersion" = "8:1.0.0" + "Manufacturer" = "8:Owen Leonard" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:" + "Title" = "8:MLSFileTrimmer" + "Subject" = "8:" + "ARPCONTACT" = "8:Owen Leonard" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:" + "ARPURLINFOABOUT" = "8:" + "ARPPRODUCTICON" = "8:" + "ARPIconIndex" = "3:0" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + "TargetPlatform" = "3:0" + "PreBuildEvent" = "8:" + "PostBuildEvent" = "8:" + "RunPostBuildEvent" = "3:0" + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_ACD8007A816B4D4C91918EE14CA9B8F7" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_45E06D48AA0A44D293EFBDF770570DEF" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_007AC28067D54F69809DFCBC8131B338" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CCA6900298CC4784ABCD44D1F2277D83" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_A775FA7558924A68983D469E818904C5" + { + "Name" = "8:MLSFileTrimmer" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_5642279778584C4AB08E32A595FB6C82" + "Folder" = "8:_A73814472A784ED28E52A258A1870893" + "WorkingFolder" = "8:_2B5E9E5E32C84619823E502184B2A72C" + "Icon" = "8:" + "Feature" = "8:" + } + } + "UserInterface" + { + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_7275E1CC95234C428154441D4D82CE6B" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C21B4F018FA548C681ABFDDAD0047CE5" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_DF8FBE40590F403CAB07FBAA539E298C" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E54F333D647C4D0F96FB6D9AAB074BE7" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8B27D79640844A679A724DB98E5536F6" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_653754B9A9C94196B3F025527677F7FA" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8B4BB69D9D7944EB966ED65EDA4E2238" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F35596B57DAD42AE9C4E862A0BEB6DE8" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_9F7B1005A1B84C43816B9A27A9752AA7" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_142F34D5A2D848EAB951813A2A3209AB" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_83DE0F88871F454DB09CE854148D44CD" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "InstallAllUsersVisible" + { + "Name" = "8:InstallAllUsersVisible" + "DisplayName" = "8:#1059" + "Description" = "8:#1159" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_EFE7D61C687B461F83931BD482452DFE" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_A0398A9F28B045A5BD77D8E47C92155A" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_B1884FE6070E459F9DAD5D8C512B2EA2" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_5E2A8698AC7D4706B2213230F6BE7E75" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_D1F6D2A3B6BE4420B82B9E029943450A" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E58BCA2EAA1240B9B7E88354732AFBA4" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_6D6BC735065C4888BFAECC0D007494D7" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + } + "ProjectOutput" + { + } + } +}