/// <summary> /// This extracts a SolutionId from a .wsp solution package. /// It opens the CAB extracts the manifest.xml, and then reads the SolutionId /// </summary> /// <param name="packageName">the full path to the solution package</param> /// <returns>SolutionId (GUID) contained in solution</returns> public static Guid GetSolutionIdFromPackage(string packageName) { if (SolutionIdCache.ContainsKey(packageName)) { return(SolutionIdCache[packageName]); } Guid solutionID; try { System.IO.FileInfo fi = new System.IO.FileInfo(packageName); packageName = fi.FullName; string temppath = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString().Replace("-", ""); XmlDocument xdoc = new XmlDocument(); try { // make sure temp path is there System.IO.Directory.CreateDirectory(temppath); // extract the manifest.xml CabLib.Extract cab = new CabLib.Extract(); cab.SetSingleFile("manifest.xml"); cab.ExtractFile(packageName, temppath); // load it into the main xml doc xdoc.Load(temppath + "\\" + "manifest.xml"); } catch (Exception ee) { throw new Exception("Unable to extract manifest.xml from: " + packageName, ee); } try { solutionID = new Guid(xdoc.DocumentElement.Attributes["SolutionId"].Value); } catch { throw new Exception("Unable to parse SolutionId from manifest.xml"); } try { // don't care if this fails, but we should try to cleanup anyways System.IO.Directory.Delete(temppath, true); } catch { } } catch (Exception ex) { Log.Warning("Unable to get solution id from manifest: " + ex.Message); solutionID = Config.Current.SolutionId; } SolutionIdCache[packageName] = solutionID; return(solutionID); }
public void Extract(string tmpDir, string language, string xsnPath) { var e = new CabLib.Extract(); var extractedXsnPath = Path.Join(tmpDir, "form", language); e.ExtractFile(xsnPath, extractedXsnPath); e.CleanUp(); _rootPath = extractedXsnPath; }
private void btnGo_Click(object sender, RoutedEventArgs e) { try { txtProgressLog.Text = "starting...\n"; CabLib.Extract extractor = new CabLib.Extract(); CabLib.Compress compressor = new CabLib.Compress(); CabLib.Extract.kHeaderInfo cInfo = null; if (extractor.IsFileCabinet(txtFilePath.Text, out cInfo)) { Log("file is a valid cabinet"); //extract WSP to temp folder Guid jobGuid = Guid.NewGuid(); string jobid = jobGuid.ToString("N"); Log("current job id is " + jobid); var fi = new FileInfo(txtFilePath.Text); var jobFolder = Directory.CreateDirectory(Directory.GetCurrentDirectory() + "\\" + jobid); Log("job temp directory created"); extractor.ExtractFile(txtFilePath.Text, jobFolder.FullName); Log("cabinet exatracted to job temp directory"); //Load manifest, change solution ID, remove assemblies, etc XDocument xDoc = XDocument.Load(jobFolder.FullName + "\\manifest.xml"); Log("manifest loaded"); if (chkSetNewSolutionId.IsChecked.Value) { xDoc.Root.Attribute("SolutionId").Value = jobGuid.ToString("D"); Log("solution id set to " + jobGuid.ToString("D")); } if (chkRemoveAllDlls.IsChecked.Value) { var xAssemblies = xDoc.Root.Descendants(xDoc.Root.GetDefaultNamespace() + "Assemblies"); xAssemblies.Remove(); Log("assemblies element removed from manifest"); jobFolder.EnumerateFiles("*.dll").ToList().ForEach(dll => { File.SetAttributes(dll.FullName, FileAttributes.Normal); File.Delete(dll.FullName); }); Log("all dll files deleted"); } xDoc.Save(jobFolder.FullName + "\\manifest.xml"); Log("updated manifest file saved"); //repackage as a new WSP or overwrite source file string wspFileName = txtNewFileName.Text.Replace("{filename}", fi.Name.Remove(fi.Name.Length - 4)) + ".wsp"; Log("new wsp file name is " + wspFileName); //Build Dictionary<string,string> for all cab files DDFBuilder.Build(jobFolder.FullName, wspFileName); Log("ddf file built"); compressor.SwitchCompression(CabLib.Compress.eCompress.MSZIP); compressor.CompressFolder(jobFolder.FullName, fi.Directory.FullName + "\\" + wspFileName, null, true, true, int.MaxValue); Log("cabinet file craeted"); jobFolder.EnumerateFiles("*.*", SearchOption.AllDirectories).ToList().ForEach(dll => { File.SetAttributes(dll.FullName, FileAttributes.Normal); }); System.IO.Directory.Delete(jobFolder.FullName, true); Log("temp job folder deleted"); Log("i'm done. what's next?"); } } catch (Exception ex) { Log("oops! something went wrong, " + ex.ToString()); } }