Example #1
0
 private void ImportFile(string path)
 {
     using (ZipFile file = new ZipFile(path))
     {
         string   targetFolderName;
         ZipEntry entry = file.get_Item("header.xml");
         if (entry == null)
         {
             MessageBox.Show("Driver is missing header.xml metadata file.", "LINQPad", MessageBoxButtons.OK, MessageBoxIcon.Hand);
         }
         else
         {
             MemoryStream stream = new MemoryStream();
             entry.Extract(stream);
             stream.Position = 0L;
             string str = (string)XElement.Load(new StreamReader(stream)).Element("MainAssembly");
             if (string.IsNullOrEmpty(str))
             {
                 MessageBox.Show("Driver metadata file header.xml is missing the MainAssembly element.", "LINQPad", MessageBoxButtons.OK, MessageBoxIcon.Hand);
             }
             else
             {
                 str = str.Trim();
                 if (Path.GetExtension(str) == "")
                 {
                     str = str + ".dll";
                 }
                 if (file.get_Item(str) == null)
                 {
                     MessageBox.Show("Invalid driver: file '" + str + "' does not exist.", "LINQPad", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                 }
                 else
                 {
                     AssemblyName assemblyName;
                     Exception    exception;
                     bool         flag;
                     file.get_Item(str).Extract(this._tempDir, true);
                     try
                     {
                         assemblyName = AssemblyName.GetAssemblyName(Path.Combine(this._tempDir, str));
                     }
                     catch (Exception exception1)
                     {
                         exception = exception1;
                         MessageBox.Show("Driver contains invalid assembly '" + str + "' - " + exception.Message, "LINQPad", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                         return;
                     }
                     targetFolderName = assemblyName.Name + " (" + DCDriverLoader.GetPublicKeyToken(assemblyName) + ")";
                     string str2 = Path.Combine(DCDriverLoader.ThirdPartyDriverFolder, targetFolderName);
                     DCDriverLoader.UnloadDomains(true);
                     Thread.Sleep(200);
                     if (!Directory.Exists(DCDriverLoader.ThirdPartyDriverFolder))
                     {
                         Directory.CreateDirectory(DCDriverLoader.ThirdPartyDriverFolder);
                     }
                     FileUtil.AssignUserPermissionsToFolder(DCDriverLoader.ThirdPartyDriverFolder);
                     if (!(flag = Directory.Exists(str2)))
                     {
                         try
                         {
                             Directory.CreateDirectory(str2);
                         }
                         catch (Exception exception3)
                         {
                             exception = exception3;
                             MessageBox.Show("Unable to create directory '" + str2 + "' - " + exception.Message, "LINQPad", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                             return;
                         }
                     }
                     FileUtil.AssignUserPermissionsToFolder(str2);
                     new Thread(delegate {
                         try
                         {
                             WebHelper.GetWebClient().DownloadString("http://www.linqpad.net/RichClient/GetDataContextDriver.aspx?lib=" + targetFolderName);
                         }
                         catch
                         {
                         }
                     }).Start();
                     Exception       exception2 = null;
                     ZipEntry        entry2     = null;
                     List <ZipEntry> list       = (from e in file.get_Entries()
                                                   where !e.get_IsDirectory()
                                                   select e).ToList <ZipEntry>();
                     ZipEntry[] entryArray = list.ToArray();
                     int        index      = 0;
                     while (true)
                     {
                         if (index >= entryArray.Length)
                         {
                             break;
                         }
                         ZipEntry item = entryArray[index];
                         try
                         {
                             string str3 = Path.Combine(str2, item.get_FileName());
                             if (File.Exists(str3))
                             {
                                 MemoryStream stream2 = new MemoryStream();
                                 item.Extract(stream2);
                                 if (File.ReadAllBytes(str3).SequenceEqual <byte>(stream2.ToArray()))
                                 {
                                     list.Remove(item);
                                 }
                             }
                         }
                         catch
                         {
                         }
                         index++;
                     }
                     foreach (ZipEntry entry3 in list)
                     {
                         if (!entry3.get_IsDirectory())
                         {
                             try
                             {
                                 entry3.Extract(str2, true);
                             }
                             catch (Exception exception4)
                             {
                                 exception = exception4;
                                 if (exception2 == null)
                                 {
                                     exception2 = exception;
                                     entry2     = entry3;
                                 }
                             }
                         }
                     }
                     if (exception2 != null)
                     {
                         MessageBox.Show("Unable to write file '" + entry2.get_FileName() + "' - " + exception2.Message, "LINQPad", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                     }
                     else
                     {
                         string text = "Driver successfully " + (flag ? "updated." : "loaded.");
                         MainForm.Instance.RepopulateSchemaTree();
                         if (this._suggestRestart)
                         {
                             text           = text + "\r\n\r\nRestart LINQPad?";
                             this.DoRestart = MessageBox.Show(text, "LINQPad", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes;
                         }
                         else
                         {
                             MessageBox.Show(text, "LINQPad", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                         }
                         base.Close();
                     }
                 }
             }
         }
     }
 }