From b91de5bad205c1b24af34605b83c586483c5cbec Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 16 Jun 2016 23:11:00 -0700 Subject: [PATCH] moving win10 app, bringing back uploader --- .gitignore | 8 +- {win10 => clients/win10}/app.sln | 0 .../AppPackages/latest/Add-AppDevPackage.ps1 | Bin .../Add-AppDevPackage.psd1 | Bin .../cs-CZ/Add-AppDevPackage.psd1 | Bin .../de-DE/Add-AppDevPackage.psd1 | Bin .../en-US/Add-AppDevPackage.psd1 | Bin .../es-ES/Add-AppDevPackage.psd1 | Bin .../fr-FR/Add-AppDevPackage.psd1 | Bin .../it-IT/Add-AppDevPackage.psd1 | Bin .../ja-JP/Add-AppDevPackage.psd1 | Bin .../ko-KR/Add-AppDevPackage.psd1 | Bin .../pl-PL/Add-AppDevPackage.psd1 | Bin .../pt-BR/Add-AppDevPackage.psd1 | Bin .../ru-RU/Add-AppDevPackage.psd1 | Bin .../tr-TR/Add-AppDevPackage.psd1 | Bin .../zh-CN/Add-AppDevPackage.psd1 | Bin .../zh-TW/Add-AppDevPackage.psd1 | Bin .../m.pxt.io_0.1.4.0_AnyCPU_Debug.appxbundle | Bin .../latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.cer | Bin .../win10}/app/BundleArtifacts/neutral.txt | 0 .../app/images/LockScreenLogo.scale-200.png | Bin .../app/images/SplashScreen.scale-200.png | Bin .../images/Square150x150Logo.scale-200.png | Bin .../app/images/Square44x44Logo.scale-200.png | Bin ...x44Logo.targetsize-24_altform-unplated.png | Bin .../win10}/app/images/StoreLogo.png | Bin .../app/images/Wide310x150Logo.scale-200.png | Bin {win10 => clients/win10}/app/m.pxt.io.jsproj | 0 {win10 => clients/win10}/app/msapp-error.css | 0 {win10 => clients/win10}/app/msapp-error.html | 0 {win10 => clients/win10}/app/msapp-error.js | 0 .../win10}/app/package.appxmanifest | 0 .../win10}/app/pxtwinapp_TemporaryKey.pfx | Bin .../winuploader/CodeTheMicroBit.Loader.sln | 22 ++ .../winuploader/Microbit.Uploader/App.config | 7 + .../CodeTheMicrobit.Uploader.csproj | 123 ++++++++ .../Microbit.Uploader/GlobalSuppressions.cs | Bin 0 -> 2144 bytes .../Microbit.Uploader/KnownFolders.cs | 33 +++ .../LicenseDialog.Designer.cs | 93 ++++++ .../Microbit.Uploader/LicenseDialog.cs | 32 +++ .../Microbit.Uploader/LicenseDialog.resx | 120 ++++++++ .../Microbit.Uploader/MSFT_logo_png.png | Bin 0 -> 6983 bytes .../Microbit.Uploader/MainForm.Designer.cs | 172 +++++++++++ .../winuploader/Microbit.Uploader/MainForm.cs | 266 ++++++++++++++++++ .../Microbit.Uploader/MainForm.resx | 172 +++++++++++ .../winuploader/Microbit.Uploader/Program.cs | 30 ++ .../Properties/AssemblyInfo.cs | 40 +++ .../Properties/Resources.Designer.cs | 93 ++++++ .../Properties/Resources.resx | 130 +++++++++ .../Resources/MSR-LA - 2576.rtf | 1 + .../Microbit.Uploader/Settings.Designer.cs | 76 +++++ .../winuploader/Microbit.Uploader/Settings.cs | 37 +++ .../Microbit.Uploader/Settings.resx | 120 ++++++++ .../SingleInstanceAppHelper.cs | 39 +++ .../SingleInstanceAppStarter.cs | 39 +++ .../winuploader/Microbit.Uploader/favicon.ico | Bin 0 -> 1150 bytes .../Microbit.Uploader/microbit.red.png | Bin 0 -> 21078 bytes 58 files changed, 1650 insertions(+), 3 deletions(-) rename {win10 => clients/win10}/app.sln (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.ps1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 (100%) rename {win10 => clients/win10}/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.appxbundle (100%) rename {win10 => clients/win10}/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.cer (100%) rename {win10 => clients/win10}/app/BundleArtifacts/neutral.txt (100%) rename {win10 => clients/win10}/app/images/LockScreenLogo.scale-200.png (100%) rename {win10 => clients/win10}/app/images/SplashScreen.scale-200.png (100%) rename {win10 => clients/win10}/app/images/Square150x150Logo.scale-200.png (100%) rename {win10 => clients/win10}/app/images/Square44x44Logo.scale-200.png (100%) rename {win10 => clients/win10}/app/images/Square44x44Logo.targetsize-24_altform-unplated.png (100%) rename {win10 => clients/win10}/app/images/StoreLogo.png (100%) rename {win10 => clients/win10}/app/images/Wide310x150Logo.scale-200.png (100%) rename {win10 => clients/win10}/app/m.pxt.io.jsproj (100%) rename {win10 => clients/win10}/app/msapp-error.css (100%) rename {win10 => clients/win10}/app/msapp-error.html (100%) rename {win10 => clients/win10}/app/msapp-error.js (100%) rename {win10 => clients/win10}/app/package.appxmanifest (100%) rename {win10 => clients/win10}/app/pxtwinapp_TemporaryKey.pfx (100%) create mode 100644 clients/winuploader/CodeTheMicroBit.Loader.sln create mode 100644 clients/winuploader/Microbit.Uploader/App.config create mode 100644 clients/winuploader/Microbit.Uploader/CodeTheMicrobit.Uploader.csproj create mode 100644 clients/winuploader/Microbit.Uploader/GlobalSuppressions.cs create mode 100644 clients/winuploader/Microbit.Uploader/KnownFolders.cs create mode 100644 clients/winuploader/Microbit.Uploader/LicenseDialog.Designer.cs create mode 100644 clients/winuploader/Microbit.Uploader/LicenseDialog.cs create mode 100644 clients/winuploader/Microbit.Uploader/LicenseDialog.resx create mode 100644 clients/winuploader/Microbit.Uploader/MSFT_logo_png.png create mode 100644 clients/winuploader/Microbit.Uploader/MainForm.Designer.cs create mode 100644 clients/winuploader/Microbit.Uploader/MainForm.cs create mode 100644 clients/winuploader/Microbit.Uploader/MainForm.resx create mode 100644 clients/winuploader/Microbit.Uploader/Program.cs create mode 100644 clients/winuploader/Microbit.Uploader/Properties/AssemblyInfo.cs create mode 100644 clients/winuploader/Microbit.Uploader/Properties/Resources.Designer.cs create mode 100644 clients/winuploader/Microbit.Uploader/Properties/Resources.resx create mode 100644 clients/winuploader/Microbit.Uploader/Resources/MSR-LA - 2576.rtf create mode 100644 clients/winuploader/Microbit.Uploader/Settings.Designer.cs create mode 100644 clients/winuploader/Microbit.Uploader/Settings.cs create mode 100644 clients/winuploader/Microbit.Uploader/Settings.resx create mode 100644 clients/winuploader/Microbit.Uploader/SingleInstanceAppHelper.cs create mode 100644 clients/winuploader/Microbit.Uploader/SingleInstanceAppStarter.cs create mode 100644 clients/winuploader/Microbit.Uploader/favicon.ico create mode 100644 clients/winuploader/Microbit.Uploader/microbit.red.png diff --git a/.gitignore b/.gitignore index 46028121..a380d480 100644 --- a/.gitignore +++ b/.gitignore @@ -6,9 +6,11 @@ typings tmp temp projects/** -win10/app/bin -win10/app/bld -win10/*.opendb +clients/win10/app/bin +clients/win10/app/bld +clients/win10/*.opendb +clients/**/bin/** +clients/**/obj/** *.user *.sw? diff --git a/win10/app.sln b/clients/win10/app.sln similarity index 100% rename from win10/app.sln rename to clients/win10/app.sln diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.ps1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.ps1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.ps1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.ps1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 b/clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 similarity index 100% rename from win10/app/AppPackages/latest/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 rename to clients/win10/app/AppPackages/latest/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 diff --git a/win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.appxbundle b/clients/win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.appxbundle similarity index 100% rename from win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.appxbundle rename to clients/win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.appxbundle diff --git a/win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.cer b/clients/win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.cer similarity index 100% rename from win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.cer rename to clients/win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.cer diff --git a/win10/app/BundleArtifacts/neutral.txt b/clients/win10/app/BundleArtifacts/neutral.txt similarity index 100% rename from win10/app/BundleArtifacts/neutral.txt rename to clients/win10/app/BundleArtifacts/neutral.txt diff --git a/win10/app/images/LockScreenLogo.scale-200.png b/clients/win10/app/images/LockScreenLogo.scale-200.png similarity index 100% rename from win10/app/images/LockScreenLogo.scale-200.png rename to clients/win10/app/images/LockScreenLogo.scale-200.png diff --git a/win10/app/images/SplashScreen.scale-200.png b/clients/win10/app/images/SplashScreen.scale-200.png similarity index 100% rename from win10/app/images/SplashScreen.scale-200.png rename to clients/win10/app/images/SplashScreen.scale-200.png diff --git a/win10/app/images/Square150x150Logo.scale-200.png b/clients/win10/app/images/Square150x150Logo.scale-200.png similarity index 100% rename from win10/app/images/Square150x150Logo.scale-200.png rename to clients/win10/app/images/Square150x150Logo.scale-200.png diff --git a/win10/app/images/Square44x44Logo.scale-200.png b/clients/win10/app/images/Square44x44Logo.scale-200.png similarity index 100% rename from win10/app/images/Square44x44Logo.scale-200.png rename to clients/win10/app/images/Square44x44Logo.scale-200.png diff --git a/win10/app/images/Square44x44Logo.targetsize-24_altform-unplated.png b/clients/win10/app/images/Square44x44Logo.targetsize-24_altform-unplated.png similarity index 100% rename from win10/app/images/Square44x44Logo.targetsize-24_altform-unplated.png rename to clients/win10/app/images/Square44x44Logo.targetsize-24_altform-unplated.png diff --git a/win10/app/images/StoreLogo.png b/clients/win10/app/images/StoreLogo.png similarity index 100% rename from win10/app/images/StoreLogo.png rename to clients/win10/app/images/StoreLogo.png diff --git a/win10/app/images/Wide310x150Logo.scale-200.png b/clients/win10/app/images/Wide310x150Logo.scale-200.png similarity index 100% rename from win10/app/images/Wide310x150Logo.scale-200.png rename to clients/win10/app/images/Wide310x150Logo.scale-200.png diff --git a/win10/app/m.pxt.io.jsproj b/clients/win10/app/m.pxt.io.jsproj similarity index 100% rename from win10/app/m.pxt.io.jsproj rename to clients/win10/app/m.pxt.io.jsproj diff --git a/win10/app/msapp-error.css b/clients/win10/app/msapp-error.css similarity index 100% rename from win10/app/msapp-error.css rename to clients/win10/app/msapp-error.css diff --git a/win10/app/msapp-error.html b/clients/win10/app/msapp-error.html similarity index 100% rename from win10/app/msapp-error.html rename to clients/win10/app/msapp-error.html diff --git a/win10/app/msapp-error.js b/clients/win10/app/msapp-error.js similarity index 100% rename from win10/app/msapp-error.js rename to clients/win10/app/msapp-error.js diff --git a/win10/app/package.appxmanifest b/clients/win10/app/package.appxmanifest similarity index 100% rename from win10/app/package.appxmanifest rename to clients/win10/app/package.appxmanifest diff --git a/win10/app/pxtwinapp_TemporaryKey.pfx b/clients/win10/app/pxtwinapp_TemporaryKey.pfx similarity index 100% rename from win10/app/pxtwinapp_TemporaryKey.pfx rename to clients/win10/app/pxtwinapp_TemporaryKey.pfx diff --git a/clients/winuploader/CodeTheMicroBit.Loader.sln b/clients/winuploader/CodeTheMicroBit.Loader.sln new file mode 100644 index 00000000..9c82e656 --- /dev/null +++ b/clients/winuploader/CodeTheMicroBit.Loader.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25123.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeTheMicrobit.Uploader", "Microbit.Uploader\CodeTheMicrobit.Uploader.csproj", "{7DC6CA45-FD75-44BC-805E-708C812CD4BF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7DC6CA45-FD75-44BC-805E-708C812CD4BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DC6CA45-FD75-44BC-805E-708C812CD4BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DC6CA45-FD75-44BC-805E-708C812CD4BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DC6CA45-FD75-44BC-805E-708C812CD4BF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/clients/winuploader/Microbit.Uploader/App.config b/clients/winuploader/Microbit.Uploader/App.config new file mode 100644 index 00000000..99844edd --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/App.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/clients/winuploader/Microbit.Uploader/CodeTheMicrobit.Uploader.csproj b/clients/winuploader/Microbit.Uploader/CodeTheMicrobit.Uploader.csproj new file mode 100644 index 00000000..077710b6 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/CodeTheMicrobit.Uploader.csproj @@ -0,0 +1,123 @@ + + + + + Debug + AnyCPU + {7DC6CA45-FD75-44BC-805E-708C812CD4BF} + WinExe + Properties + Microsoft.MicroBit + Microbit.Uploader + v2.0 + 512 + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + AllRules.ruleset + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + false + + + false + + + + + + + + + + + + + + + Form + + + Settings.cs + + + + + Form + + + LicenseDialog.cs + + + Form + + + MainForm.cs + + + + + + + LicenseDialog.cs + + + MainForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + Settings.cs + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/clients/winuploader/Microbit.Uploader/GlobalSuppressions.cs b/clients/winuploader/Microbit.Uploader/GlobalSuppressions.cs new file mode 100644 index 0000000000000000000000000000000000000000..8122d89bcdd68f5aef2c3dc8641a3a9fe0517eb6 GIT binary patch literal 2144 zcmdT`(TdYR6g|&^|1ji9!OglT2!ap0D}oP-n1YD-kfyOln`B8+VSipd=iZKqP3i7y zDKyQ@opaAUbLLL}{QiO*JwGLCEV02YULqjlv&UegDPE&u)EW(18?8|Anc|x7E5=-M zCbzXcBQ=v@iyMAA&I$fc*Cd!Psk%-j!RtN1)kzL znZ31q4Wlcrsfg7PJ;Qh6Y{_7SD~@H%T=H$h@0GFaj7hLTV(q*6yuCMm4rcTnWVeOyztK)O7=CwKGn35UMThlx$ z==&~g&+LjXh}4+_h67rQsrz8m|H|}F@qz0+LuY%hy3$#F8r#p@pXBa6yJPp}yL3O# zpUO_1~ar4ZI^D5L2Tm0axI#D{w;Qo#?XV$rX zF>XVYevfBGjK&z0#1*=_U@$gX6F94iRq1%zbh<~TYpzsm!!h->Sf{e7cNUyie=TM> zIoGJR{@6ka^_PGp&!;_ zuC%zzFTz*HTT`6@XUwDBDe#lyuAKAH9p!hE941xb?8xSr$Gq$41{#Q@tm>@px5zG; zIWFwoi{2%p!c(pzi-dQe`0cybT@mnxSyg#5Q8eH)*=)ILWs1rl@@>PosZ*oUhgEjZ VyR)LBqt1T58s^ad0Nt_f?!PHAdFcQE literal 0 HcmV?d00001 diff --git a/clients/winuploader/Microbit.Uploader/KnownFolders.cs b/clients/winuploader/Microbit.Uploader/KnownFolders.cs new file mode 100644 index 00000000..0c9f1584 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/KnownFolders.cs @@ -0,0 +1,33 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.Management; +using System.Runtime.InteropServices; +using System.Security; + +namespace Microsoft.MicroBit +{ + /// + /// Class containing methods to retrieve specific file system paths. + /// + internal static class KnownFoldersNativeMethods + { + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] + public static string GetDownloadPath() + { + IntPtr outPath; + int result = SHGetKnownFolderPath(new Guid("{374DE290-123F-4565-9164-39C4925E467B}"), 0x00004000, new IntPtr(0), out outPath); + if (result >= 0) + return Marshal.PtrToStringUni(outPath); + else return null; + } + + [SuppressMessage("Microsoft.Security", "CA5122:PInvokesShouldNotBeSafeCriticalFxCopRule")] + [DllImport("Shell32.dll")] + [SecurityCritical] + private static extern int SHGetKnownFolderPath( + [MarshalAs(UnmanagedType.LPStruct)]Guid rfid, uint dwFlags, IntPtr hToken, + out IntPtr ppszPath); + } + +} \ No newline at end of file diff --git a/clients/winuploader/Microbit.Uploader/LicenseDialog.Designer.cs b/clients/winuploader/Microbit.Uploader/LicenseDialog.Designer.cs new file mode 100644 index 00000000..bf8ed131 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/LicenseDialog.Designer.cs @@ -0,0 +1,93 @@ +namespace Microsoft.MicroBit +{ + partial class LicenseDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox = new System.Windows.Forms.RichTextBox(); + this.acceptButton = new System.Windows.Forms.Button(); + this.exitButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // textBox + // + this.textBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.textBox.Location = new System.Drawing.Point(13, 13); + this.textBox.Name = "textBox"; + this.textBox.ReadOnly = true; + this.textBox.Size = new System.Drawing.Size(465, 438); + this.textBox.TabIndex = 0; + this.textBox.Text = ""; + // + // acceptButton + // + this.acceptButton.Location = new System.Drawing.Point(322, 457); + this.acceptButton.Name = "acceptButton"; + this.acceptButton.Size = new System.Drawing.Size(75, 23); + this.acceptButton.TabIndex = 1; + this.acceptButton.Text = "Accept"; + this.acceptButton.UseVisualStyleBackColor = true; + this.acceptButton.Click += new System.EventHandler(this.acceptButton_Click); + // + // exitButton + // + this.exitButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.exitButton.Location = new System.Drawing.Point(403, 457); + this.exitButton.Name = "exitButton"; + this.exitButton.Size = new System.Drawing.Size(75, 23); + this.exitButton.TabIndex = 2; + this.exitButton.Text = "Exit"; + this.exitButton.UseVisualStyleBackColor = true; + this.exitButton.Click += new System.EventHandler(this.exitButton_Click); + // + // LicenseDialog + // + this.AcceptButton = this.acceptButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.exitButton; + this.ClientSize = new System.Drawing.Size(490, 492); + this.ControlBox = false; + this.Controls.Add(this.exitButton); + this.Controls.Add(this.acceptButton); + this.Controls.Add(this.textBox); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "LicenseDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "code the micro:bit uploader Terms Of Use"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.RichTextBox textBox; + private System.Windows.Forms.Button acceptButton; + private System.Windows.Forms.Button exitButton; + } +} \ No newline at end of file diff --git a/clients/winuploader/Microbit.Uploader/LicenseDialog.cs b/clients/winuploader/Microbit.Uploader/LicenseDialog.cs new file mode 100644 index 00000000..22c7a087 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/LicenseDialog.cs @@ -0,0 +1,32 @@ +using Microsoft.MicroBit.Properties; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Microsoft.MicroBit +{ + public partial class LicenseDialog : Form + { + public LicenseDialog() + { + InitializeComponent(); + this.textBox.Rtf = Resources.MSR_LA___2576; + } + + private void acceptButton_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Yes; + this.Close(); + } + + private void exitButton_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.No; + this.Close(); + } + } +} diff --git a/clients/winuploader/Microbit.Uploader/LicenseDialog.resx b/clients/winuploader/Microbit.Uploader/LicenseDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/LicenseDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/clients/winuploader/Microbit.Uploader/MSFT_logo_png.png b/clients/winuploader/Microbit.Uploader/MSFT_logo_png.png new file mode 100644 index 0000000000000000000000000000000000000000..60c210e129e60371e9331c75ada23d501615b630 GIT binary patch literal 6983 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 moKO5Od;apDa0LSN_5WOKk + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.statusLabel = new System.Windows.Forms.Label(); + this.backgroundPictureBox = new System.Windows.Forms.PictureBox(); + this.trayIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.versionLabel = new System.Windows.Forms.LinkLabel(); + this.label1 = new System.Windows.Forms.Label(); + this.SettingsLabel = new System.Windows.Forms.LinkLabel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.linkLabel1 = new System.Windows.Forms.LinkLabel(); + ((System.ComponentModel.ISupportInitialize)(this.backgroundPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // statusLabel + // + this.statusLabel.BackColor = System.Drawing.SystemColors.Window; + this.statusLabel.Font = new System.Drawing.Font("Consolas", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.statusLabel.Location = new System.Drawing.Point(11, 30); + this.statusLabel.Name = "statusLabel"; + this.statusLabel.Size = new System.Drawing.Size(364, 23); + this.statusLabel.TabIndex = 1; + this.statusLabel.Text = "loading..."; + // + // backgroundPictureBox + // + this.backgroundPictureBox.BackColor = System.Drawing.Color.White; + this.backgroundPictureBox.Cursor = System.Windows.Forms.Cursors.Hand; + this.backgroundPictureBox.Image = global::Microsoft.MicroBit.Properties.Resources.MSFT_logo_png; + this.backgroundPictureBox.InitialImage = null; + this.backgroundPictureBox.Location = new System.Drawing.Point(226, 91); + this.backgroundPictureBox.Name = "backgroundPictureBox"; + this.backgroundPictureBox.Size = new System.Drawing.Size(149, 52); + this.backgroundPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.backgroundPictureBox.TabIndex = 0; + this.backgroundPictureBox.TabStop = false; + this.backgroundPictureBox.Click += new System.EventHandler(this.backgroundPictureBox_Click); + // + // trayIcon + // + this.trayIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("trayIcon.Icon"))); + this.trayIcon.Visible = true; + this.trayIcon.Click += new System.EventHandler(this.trayIcon_Click); + // + // versionLabel + // + this.versionLabel.AutoSize = true; + this.versionLabel.Location = new System.Drawing.Point(12, 121); + this.versionLabel.Name = "versionLabel"; + this.versionLabel.Size = new System.Drawing.Size(28, 13); + this.versionLabel.TabIndex = 2; + this.versionLabel.TabStop = true; + this.versionLabel.Text = "v0.9"; + this.versionLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.versionLabel_LinkClicked); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(12, 103); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(169, 15); + this.label1.TabIndex = 3; + this.label1.Text = "Automatic upload of .hex files."; + // + // SettingsLabel + // + this.SettingsLabel.AutoSize = true; + this.SettingsLabel.Location = new System.Drawing.Point(151, 121); + this.SettingsLabel.Name = "SettingsLabel"; + this.SettingsLabel.Size = new System.Drawing.Size(43, 13); + this.SettingsLabel.TabIndex = 4; + this.SettingsLabel.TabStop = true; + this.SettingsLabel.Text = "settings"; + this.SettingsLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.SettingsLabel_LinkClicked); + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.Color.White; + this.pictureBox1.Cursor = System.Windows.Forms.Cursors.Hand; + this.pictureBox1.Image = global::Microsoft.MicroBit.Properties.Resources.microbit_red; + this.pictureBox1.InitialImage = null; + this.pictureBox1.Location = new System.Drawing.Point(226, 6); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(149, 79); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 5; + this.pictureBox1.TabStop = false; + // + // linkLabel1 + // + this.linkLabel1.AutoSize = true; + this.linkLabel1.Location = new System.Drawing.Point(62, 121); + this.linkLabel1.Name = "linkLabel1"; + this.linkLabel1.Size = new System.Drawing.Size(60, 13); + this.linkLabel1.TabIndex = 6; + this.linkLabel1.TabStop = true; + this.linkLabel1.Text = "open editor"; + this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.ClientSize = new System.Drawing.Size(388, 143); + this.Controls.Add(this.linkLabel1); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.SettingsLabel); + this.Controls.Add(this.label1); + this.Controls.Add(this.versionLabel); + this.Controls.Add(this.statusLabel); + this.Controls.Add(this.backgroundPictureBox); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "MainForm"; + this.ShowInTaskbar = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "code the micro:bit uploader"; + this.Load += new System.EventHandler(this.MainForm_Load); + ((System.ComponentModel.ISupportInitialize)(this.backgroundPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox backgroundPictureBox; + private System.Windows.Forms.Label statusLabel; + private System.Windows.Forms.NotifyIcon trayIcon; + private System.Windows.Forms.LinkLabel versionLabel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.LinkLabel SettingsLabel; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.LinkLabel linkLabel1; + } +} + diff --git a/clients/winuploader/Microbit.Uploader/MainForm.cs b/clients/winuploader/Microbit.Uploader/MainForm.cs new file mode 100644 index 00000000..2800bda3 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/MainForm.cs @@ -0,0 +1,266 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Security; +using System.Threading; +using System.Windows.Forms; + +namespace Microsoft.MicroBit +{ + internal partial class MainForm : Form + { + FileSystemWatcher watcher; + private string customcopypath = ""; + + public MainForm() + { + InitializeComponent(); + var v = typeof(MainForm).Assembly.GetName().Version; + this.versionLabel.Text = "v" + v.Major + "." + v.Minor; + } + + private void MainForm_Load(object sender, EventArgs e) + { + this.initializeFileWatch(); + customcopypath = (string)Application.UserAppDataRegistry.GetValue("CustomDirectory", ""); + this.openEditor(); + } + + private void openEditor() + { + // lanch editor + try { Process.Start("https://codethemicrobit.com"); } catch (Exception) { } + } + + private void initializeFileWatch() + { + if (!checkTOU()) return; + + var downloads = KnownFoldersNativeMethods.GetDownloadPath(); + if (downloads == null) + { + this.updateStatus("oops, can't find the `Downloads` folder"); + return; + } + + this.watcher = new FileSystemWatcher(downloads); + this.watcher.Renamed += (sender, e) => this.handleFileEvent(e); + this.watcher.Created += (sender, e) => this.handleFileEvent(e); + this.watcher.EnableRaisingEvents = true; + + this.waitingForHexFileStatus(); + } + + private void waitingForHexFileStatus() + { + this.updateStatus("waiting for .hex file..."); + this.trayIcon.ShowBalloonTip(3000, "ready...", "waiting for .hex file...", ToolTipIcon.None); + } + + static bool checkTOU() + { + var v = (int)Application.UserAppDataRegistry.GetValue("TermOfUse", 0); + if (v != 1) + { + using (var f = new LicenseDialog()) + { + var r = f.ShowDialog(); + if (r != DialogResult.Yes) + { + Application.Exit(); + return false; + } + } + Application.UserAppDataRegistry.SetValue("TermOfUse", 1, RegistryValueKind.DWord); + } + + return true; + } + + delegate void Callback(); + + private void updateStatus(string value) + { + Callback a = (Callback)(() => + { + this.statusLabel.Text = value; + this.trayIcon.Text = value; + }); + this.Invoke(a); + } + + void handleFileEvent(FileSystemEventArgs e) + { + this.handleFile(e.FullPath); + } + + volatile int copying; + void handleFile(string fullPath) + { + try + { + // In case this is data-url download, at least Chrome will not rename file, but instead write to it + // directly. This mean we may catch it in the act. Let's leave it some time to finish writing. + Thread.Sleep(500); + + var info = new System.IO.FileInfo(fullPath); + Trace.WriteLine("download: " + info.FullName); + + if (info.Extension != ".hex") return; + + var infoName = info.Name; + Trace.WriteLine("download name: " + info.Name); + if (!infoName.StartsWith("microbit-", StringComparison.OrdinalIgnoreCase)) return; + if (info.Name.EndsWith(".uploaded.hex", StringComparison.OrdinalIgnoreCase)) return; + if (info.Length > 1000000) return; // make sure we don't try to copy large files + + + // already copying? + if (Interlocked.Exchange(ref this.copying, 1) == 1) + return; + + try + { + + var driveletters = getMicrobitDrives(); + List drives = new List(); + foreach (var d in driveletters) + { + drives.Add(d.RootDirectory.FullName); + } + if (!String.IsNullOrEmpty(customcopypath) && Directory.Exists(customcopypath)) + { + drives.Add(customcopypath); + } + if (drives.Count == 0) + { + this.updateStatus("no board found"); + this.trayIcon.ShowBalloonTip(3000, "cancelled uploading...", "no board found", ToolTipIcon.None); + return; + } + + this.updateStatus("uploading .hex file"); + this.trayIcon.ShowBalloonTip(3000, "uploading...", "uploading .hex file", ToolTipIcon.None); + + // copy to all boards + copyFirmware(info.FullName, drives); + + // move away hex file + var temp = System.IO.Path.ChangeExtension(info.FullName, ".uploaded.hex"); + try + { + File.Copy(info.FullName, temp, true); + File.Delete(info.FullName); + } + catch (IOException) { } + catch (NotSupportedException) { } + catch (UnauthorizedAccessException) { } + catch (ArgumentException) { } + + // update ui + this.updateStatus("uploading done"); + this.waitingForHexFileStatus(); + } + finally + { + Interlocked.Exchange(ref this.copying, 0); + } + } + catch (IOException) { } + catch (NotSupportedException) { } + catch (UnauthorizedAccessException) { } + catch (ArgumentException) { } + } + + static void copyFirmware(string file, List drives) + { + var waitHandles = new List(); + foreach (var drive in drives) + { + var ev = new AutoResetEvent(false); + waitHandles.Add(ev); + ThreadPool.QueueUserWorkItem((state) => + { + try + { + var trg = System.IO.Path.Combine(drive, "firmware.hex"); + File.Copy(file, trg, true); + } + catch (IOException) { } + catch (NotSupportedException) { } + catch (UnauthorizedAccessException) { } + catch (ArgumentException) { } + ev.Set(); + }, ev); + } + + //waits for all the threads (waitHandles) to call the .Set() method + //and inform that the execution has finished. + WaitHandle.WaitAll(waitHandles.ToArray()); + } + + static DriveInfo[] getMicrobitDrives() + { + var drives = System.IO.DriveInfo.GetDrives(); + var r = new System.Collections.Generic.List(); + foreach (var di in drives) + { + var label = getVolumeLabel(di); + if (label.StartsWith("MICROBIT", StringComparison.Ordinal)) + r.Add(di); + } + return r.ToArray(); + } + + static string getVolumeLabel(DriveInfo di) + { + try { return di.VolumeLabel; } + catch (IOException) { } + catch (SecurityException) { } + catch (UnauthorizedAccessException) { } + return ""; + } + + private void trayIcon_Click(object sender, EventArgs e) + { + this.WindowState = FormWindowState.Minimized; + this.WindowState = FormWindowState.Normal; + this.Show(); + this.Activate(); + } + + private void versionLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + try + { + Process.Start("https://codethemicrobit.com/uploader"); + } + catch (IOException) { } + } + + private void backgroundPictureBox_Click(object sender, EventArgs e) + { + try + { + Process.Start("https://codethemicrobit.com"); + } + catch (IOException) { } + } + + private void SettingsLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + var settings = new Settings(customcopypath); + settings.ShowDialog(); + customcopypath = settings.CustomCopyPath; + Application.UserAppDataRegistry.SetValue("CustomDirectory", customcopypath, RegistryValueKind.String); + } + + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + this.openEditor(); + } + } +} diff --git a/clients/winuploader/Microbit.Uploader/MainForm.resx b/clients/winuploader/Microbit.Uploader/MainForm.resx new file mode 100644 index 00000000..6a64aeb4 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/MainForm.resx @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + + + AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMIOAADCDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAN6bIZTOkxoUtj62FL5W1hTWpzYUvlbWFLY+thTKgwoUxnb+FLY6shS6TsoUzpMaFL5a1hS2P + rYUxnb6FNZ2+ZTCTsvkriaf/KYKe/yuIpf8uk7L/K4il/ymBnP8tjqz/K4qn/yiBnP8qhaL/KoWh/yqG + o/8ogJv/JXeQ/yqDnvkRMjz/Di02/wofJv8MJS3/Di02/wskLP8HGB3/Di43/w0qM/8HFxz/CyMr/w4s + Nv8MJi7/CiAm/w4sNv8RMTv/BQsN/wUQE/8BAgL/AQQF/wYRFP8EBgf/AgIA/xAYJv8TGy3/AgIA/wMF + Bv8HEhX/AQUG/wECAv8FEBT/BQsN/wYFD/8LByT/AQAC/wAAAP8CAgL/AwMD/woKEv8LCxT/DAwY/woK + Ev8DAwT/AgIC/wAAAP8AAAD/AAAA/wICAv8JCA//IBs//wwMEP8AAAD/AgIC/wQEBv8bGzf/BgYK/wQE + Bf8bGzj/BgYJ/wMDA/8AAAD/CgoK/xEREf8HBwf/Li4u/1FRUf9ERET/AQEA/wwMGf8UFCj/BAQE/wMD + Av8DAwL/BAQE/xAQIP8RESL/AAAA/z8/P/9SUlH/NTU1/y4uLv9QUFD/QUFB/wEBAP8LCxf/EhIk/wIC + Af8JCRH/CwsV/wICAf8PDx3/Dw8f/wAAAP89PT3/UVFQ/zQ0M/8FBQX/DAwM/wgICP8AAAD/CwsW/xIS + JP8FBQb/Dg4b/xERIv8FBQb/Dw8d/w8PHv8AAAD/CAgK/xwXO/8KCRT/BAMI/wAAAP8AAAD/AAAA/wIC + Av8EBAX/HR06/wgIEP8GBgv/HR07/wYGCf8DAwL/AAAA/wAAAP8JBh3/BwUS/y0fhf8FBBD/AAAA/wAA + AP8AAAD/AAAA/xIOMv8fFVz/HhVa/xQPOP8AAQD/AAAA/wAAAP8AAAD/AAAA/wICAv9UO/v/MiKX/wUD + D/8FAw7/AwIK/wAAAP8RCzP/IBZi/yAWYP8TDTr/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/VTz/+FQ6 + /P8yI5j/IBZg/ywehf8MCCX/BAMN/wUEEP8GBBH/AQED/wAAAP8AAAD/AAAA/wAAAP8AAAD/AgIC9Vc+ + /2BVOv9+Ujj0fTwptH5ONul9OCapfRUOPn4AAAB+AAAAfQAAAH4AAAB+AAAAfQAAAH4AAAB+AAAAfgQE + BFkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//8AAA== + + + + + AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAMIOAADCDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAN6bIZTOkxoUtj62FL5W1hTWpzYUvlbWFLY+thTKgwoUxnb+FLY6shS6TsoUzpMaFL5a1hS2P + rYUxnb6FNZ2+ZTCTsvkriaf/KYKe/yuIpf8uk7L/K4il/ymBnP8tjqz/K4qn/yiBnP8qhaL/KoWh/yqG + o/8ogJv/JXeQ/yqDnvkRMjz/Di02/wofJv8MJS3/Di02/wskLP8HGB3/Di43/w0qM/8HFxz/CyMr/w4s + Nv8MJi7/CiAm/w4sNv8RMTv/BQsN/wUQE/8BAgL/AQQF/wYRFP8EBgf/AgIA/xAYJv8TGy3/AgIA/wMF + Bv8HEhX/AQUG/wECAv8FEBT/BQsN/wYFD/8LByT/AQAC/wAAAP8CAgL/AwMD/woKEv8LCxT/DAwY/woK + Ev8DAwT/AgIC/wAAAP8AAAD/AAAA/wICAv8JCA//IBs//wwMEP8AAAD/AgIC/wQEBv8bGzf/BgYK/wQE + Bf8bGzj/BgYJ/wMDA/8AAAD/CgoK/xEREf8HBwf/Li4u/1FRUf9ERET/AQEA/wwMGf8UFCj/BAQE/wMD + Av8DAwL/BAQE/xAQIP8RESL/AAAA/z8/P/9SUlH/NTU1/y4uLv9QUFD/QUFB/wEBAP8LCxf/EhIk/wIC + Af8JCRH/CwsV/wICAf8PDx3/Dw8f/wAAAP89PT3/UVFQ/zQ0M/8FBQX/DAwM/wgICP8AAAD/CwsW/xIS + JP8FBQb/Dg4b/xERIv8FBQb/Dw8d/w8PHv8AAAD/CAgK/xwXO/8KCRT/BAMI/wAAAP8AAAD/AAAA/wIC + Av8EBAX/HR06/wgIEP8GBgv/HR07/wYGCf8DAwL/AAAA/wAAAP8JBh3/BwUS/y0fhf8FBBD/AAAA/wAA + AP8AAAD/AAAA/xIOMv8fFVz/HhVa/xQPOP8AAQD/AAAA/wAAAP8AAAD/AAAA/wICAv9UO/v/MiKX/wUD + D/8FAw7/AwIK/wAAAP8RCzP/IBZi/yAWYP8TDTr/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/VTz/+FQ6 + /P8yI5j/IBZg/ywehf8MCCX/BAMN/wUEEP8GBBH/AQED/wAAAP8AAAD/AAAA/wAAAP8AAAD/AgIC9Vc+ + /2BVOv9+Ujj0fTwptH5ONul9OCapfRUOPn4AAAB+AAAAfQAAAH4AAAB+AAAAfQAAAH4AAAB+AAAAfgQE + BFkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//8AAA== + + + \ No newline at end of file diff --git a/clients/winuploader/Microbit.Uploader/Program.cs b/clients/winuploader/Microbit.Uploader/Program.cs new file mode 100644 index 00000000..8c8cc288 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/Program.cs @@ -0,0 +1,30 @@ +using Microsoft.VisualBasic.ApplicationServices; +using System; +using System.Windows.Forms; + +namespace Microsoft.MicroBit +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + SingleInstanceAppStarter.Start(new MainForm(), StartNewInstance); + } + + // The handler when attempting to start another instance of this application + // We can customize the logic here for which form to activate in different + // conditions. Like in this sample, we will be selectively activate the LoginForm + // or MainForm based on the login state of the user. + static void StartNewInstance(object sender, StartupNextInstanceEventArgs e) + { + e.BringToForeground = true; + } + } +} diff --git a/clients/winuploader/Microbit.Uploader/Properties/AssemblyInfo.cs b/clients/winuploader/Microbit.Uploader/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..ef356c48 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/Properties/AssemblyInfo.cs @@ -0,0 +1,40 @@ +using System; +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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("Code The micro:bit Uploader")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("MicrosoftMicrobitUploader")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2016")] +[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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7dc6ca45-fd75-44bc-805e-708c812cd4bf")] + +// 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("0.9.0.0")] +[assembly: AssemblyFileVersion("0.9.0.0")] +[assembly: CLSCompliant(true)] +[assembly: NeutralResourcesLanguage("en-US")] \ No newline at end of file diff --git a/clients/winuploader/Microbit.Uploader/Properties/Resources.Designer.cs b/clients/winuploader/Microbit.Uploader/Properties/Resources.Designer.cs new file mode 100644 index 00000000..356a30a3 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/Properties/Resources.Designer.cs @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.MicroBit.Properties { + using System; + + + /// + /// 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", "4.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 (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.MicroBit.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; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap microbit_red { + get { + object obj = ResourceManager.GetObject("microbit_red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap MSFT_logo_png { + get { + object obj = ResourceManager.GetObject("MSFT_logo_png", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to {\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} + ///{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fp [rest of string was truncated]";. + /// + internal static string MSR_LA___2576 { + get { + return ResourceManager.GetString("MSR_LA___2576", resourceCulture); + } + } + } +} diff --git a/clients/winuploader/Microbit.Uploader/Properties/Resources.resx b/clients/winuploader/Microbit.Uploader/Properties/Resources.resx new file mode 100644 index 00000000..b9194340 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/Properties/Resources.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Resources\MSR-LA - 2576.rtf;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\MSFT_logo_png.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\microbit.red.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/clients/winuploader/Microbit.Uploader/Resources/MSR-LA - 2576.rtf b/clients/winuploader/Microbit.Uploader/Resources/MSR-LA - 2576.rtf new file mode 100644 index 00000000..2fd9f957 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/Resources/MSR-LA - 2576.rtf @@ -0,0 +1 @@ +TBD \ No newline at end of file diff --git a/clients/winuploader/Microbit.Uploader/Settings.Designer.cs b/clients/winuploader/Microbit.Uploader/Settings.Designer.cs new file mode 100644 index 00000000..04615446 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/Settings.Designer.cs @@ -0,0 +1,76 @@ +namespace Microsoft.MicroBit +{ + partial class Settings + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(107, 12); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(100, 20); + this.textBox1.TabIndex = 0; + this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(34, 15); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(67, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Custom Path"; + // + // Settings + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(246, 48); + this.Controls.Add(this.label1); + this.Controls.Add(this.textBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Settings"; + this.ShowIcon = false; + this.Text = "Settings"; + this.Load += new System.EventHandler(this.Settings_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/clients/winuploader/Microbit.Uploader/Settings.cs b/clients/winuploader/Microbit.Uploader/Settings.cs new file mode 100644 index 00000000..e2a4f3a4 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/Settings.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Security.AccessControl; +using System.Text; +using System.Windows.Forms; + +namespace Microsoft.MicroBit +{ + public partial class Settings : Form + { + public string CustomCopyPath; + public Settings(string currentpath) + { + InitializeComponent(); + CustomCopyPath = currentpath; + + } + + private void Settings_Load(object sender, EventArgs e) + { + textBox1.Text = CustomCopyPath; + } + + private void label1_Click(object sender, EventArgs e) + { + + } + + private void textBox1_TextChanged(object sender, EventArgs e) + { + CustomCopyPath = textBox1.Text; + } + } +} diff --git a/clients/winuploader/Microbit.Uploader/Settings.resx b/clients/winuploader/Microbit.Uploader/Settings.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/Settings.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/clients/winuploader/Microbit.Uploader/SingleInstanceAppHelper.cs b/clients/winuploader/Microbit.Uploader/SingleInstanceAppHelper.cs new file mode 100644 index 00000000..e57d20d2 --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/SingleInstanceAppHelper.cs @@ -0,0 +1,39 @@ +/****************************** Module Header ******************************\ +* Module Name: SingleInstanceAppHelper.cs +* Project: CSWinFormSingleInstanceApp +* Copyright (c) Microsoft Corporation. +* +* The sample demonstrates how to achieve the goal that only +* one instance of the application is allowed in Windows Forms application.. +* +* This source is subject to the Microsoft Public License. +* See http://www.microsoft.com/en-us/openness/resources/licenses.aspx#MPL. +* All other rights reserved. +* +* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +* EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +\***************************************************************************/ + +using System; +using Microsoft.VisualBasic.ApplicationServices; +using System.Windows.Forms; + +namespace Microsoft.MicroBit +{ + // We need to add Microsoft.VisualBasic reference to use + // WindowsFormsApplicationBase type. + class SingleInstanceApp : WindowsFormsApplicationBase + { + public SingleInstanceApp() + { + } + public SingleInstanceApp(Form f) + { + // Set IsSingleInstance property to true to make the application + base.IsSingleInstance = true; + // Set MainForm of the application. + this.MainForm = f; + } + } +} diff --git a/clients/winuploader/Microbit.Uploader/SingleInstanceAppStarter.cs b/clients/winuploader/Microbit.Uploader/SingleInstanceAppStarter.cs new file mode 100644 index 00000000..f3b9b6bb --- /dev/null +++ b/clients/winuploader/Microbit.Uploader/SingleInstanceAppStarter.cs @@ -0,0 +1,39 @@ +/****************************** Module Header ******************************\ +* Module Name: SingleInstanceAppStarter.cs +* Project: CSWinFormSingleInstanceApp +* Copyright (c) Microsoft Corporation. +* +* The sample demonstrates how to achieve the goal that only +* one instance of the application is allowed in Windows Forms application.. +* +* This source is subject to the Microsoft Public License. +* See http://www.microsoft.com/en-us/openness/resources/licenses.aspx#MPL. +* All other rights reserved. +* +* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +* EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +\***************************************************************************/ + +using System; +using System.Windows.Forms; +using Microsoft.VisualBasic.ApplicationServices; + +namespace Microsoft.MicroBit +{ + internal static class SingleInstanceAppStarter + { + static SingleInstanceApp app = null; + + // Construct SingleInstanceApp object, and invoke its run method. + public static void Start(Form f, StartupNextInstanceEventHandler handler) + { + if (app == null && f != null) + app = new SingleInstanceApp(f); + + // Wire up StartupNextInstance event handler. + app.StartupNextInstance += handler; + app.Run(Environment.GetCommandLineArgs()); + } + } +} diff --git a/clients/winuploader/Microbit.Uploader/favicon.ico b/clients/winuploader/Microbit.Uploader/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f4f666c8367df326b8d24a1e5961bc5e8dc0aed7 GIT binary patch literal 1150 zcmb_bOKTHR7@gOhnarf~NRzfQO%wVEY0{)NY1)vq4TY{HDJ`P7C_=%1;3~lfBkDqh z;sdnBcPZ$m*lmR_#En11y@EyI_}!aUL~*0u;hXQ=x#xVZnUN%!F3*!_rKJm+B=r%> zlJQ4rGFjXS(Ak00HQN1`HT&}YdinXguyFfzIC*z3tn7Rcp6^SK55lR5#v}Aka@U?A zd+8y@F5W@z>eiuOnuAlAftAW2I#v+a9-V+Okc3m5MNh5_qkjCwv&>Iv4R+$bXmViv2bD0+xTAjJDjZw&w0vafB z6{xBT%ZkCa;vac;zPkq#Qf^M2?xO-B&SLf0*5R8tUC2}eX+uC*)+ zzVE{@3>1q+v|24JEiFNoC5m$b@pzVW8u588iol+iCe5(O(P%WVyxc;iQW5%Qvx&vU zMWMIte#By@=Dgr3oy948Pt zIqvF*1jjTj4EEPyMQGM)SNHQwc+bgXjbeJ#w@tWy)PHxzoEy=TFjx$QR0yVZXLlTf z` literal 0 HcmV?d00001 diff --git a/clients/winuploader/Microbit.Uploader/microbit.red.png b/clients/winuploader/Microbit.Uploader/microbit.red.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2a5efa6bfd6a0d1b5abe39a219472eabe0db88 GIT binary patch literal 21078 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 literal 0 HcmV?d00001