├── .gitignore ├── .gitmodules ├── Assets ├── installer.bmp └── speckle.ico ├── InnoSetup ├── Default.isl ├── ISCC.exe ├── ISCmplr.dll ├── ISPP.dll ├── ISPPBuiltins.iss ├── Setup.e32 ├── SetupLdr.e32 ├── WizModernImage-IS.bmp ├── WizModernImage.bmp ├── WizModernSmallImage-IS.bmp ├── WizModernSmallImage.bmp ├── islzma.dll ├── islzma32.exe └── islzma64.exe ├── LICENSE ├── README.md ├── SpeckleInstaller.iss ├── SpeckleUpdater.sln ├── SpeckleUpdater ├── Api.cs ├── App.config ├── App.xaml ├── App.xaml.cs ├── GitHub.cs ├── Globals.cs ├── MainWindow.xaml ├── MainWindow.xaml.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── Release.cs ├── SpeckleUpdater.csproj ├── logo.png ├── packages.config └── speckle.ico └── appveyor.yml /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | bld/ 23 | [Bb]in/ 24 | [Oo]bj/ 25 | [Ll]og/ 26 | 27 | # Visual Studio 2015/2017 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # Visual Studio 2017 auto generated files 33 | Generated\ Files/ 34 | 35 | # MSTest test Results 36 | [Tt]est[Rr]esult*/ 37 | [Bb]uild[Ll]og.* 38 | 39 | # NUNIT 40 | *.VisualState.xml 41 | TestResult.xml 42 | 43 | # Build Results of an ATL Project 44 | [Dd]ebugPS/ 45 | [Rr]eleasePS/ 46 | dlldata.c 47 | 48 | # Benchmark Results 49 | BenchmarkDotNet.Artifacts/ 50 | 51 | # .NET Core 52 | project.lock.json 53 | project.fragment.lock.json 54 | artifacts/ 55 | **/Properties/launchSettings.json 56 | 57 | # StyleCop 58 | StyleCopReport.xml 59 | 60 | # Files built by Visual Studio 61 | *_i.c 62 | *_p.c 63 | *_i.h 64 | *.ilk 65 | *.meta 66 | *.obj 67 | *.iobj 68 | *.pch 69 | *.pdb 70 | *.ipdb 71 | *.pgc 72 | *.pgd 73 | *.rsp 74 | *.sbr 75 | *.tlb 76 | *.tli 77 | *.tlh 78 | *.tmp 79 | *.tmp_proj 80 | *.log 81 | *.vspscc 82 | *.vssscc 83 | .builds 84 | *.pidb 85 | *.svclog 86 | *.scc 87 | 88 | # Chutzpah Test files 89 | _Chutzpah* 90 | 91 | # Visual C++ cache files 92 | ipch/ 93 | *.aps 94 | *.ncb 95 | *.opendb 96 | *.opensdf 97 | *.sdf 98 | *.cachefile 99 | *.VC.db 100 | *.VC.VC.opendb 101 | 102 | # Visual Studio profiler 103 | *.psess 104 | *.vsp 105 | *.vspx 106 | *.sap 107 | 108 | # Visual Studio Trace Files 109 | *.e2e 110 | 111 | # TFS 2012 Local Workspace 112 | $tf/ 113 | 114 | # Guidance Automation Toolkit 115 | *.gpState 116 | 117 | # ReSharper is a .NET coding add-in 118 | _ReSharper*/ 119 | *.[Rr]e[Ss]harper 120 | *.DotSettings.user 121 | 122 | # JustCode is a .NET coding add-in 123 | .JustCode 124 | 125 | # TeamCity is a build add-in 126 | _TeamCity* 127 | 128 | # DotCover is a Code Coverage Tool 129 | *.dotCover 130 | 131 | # AxoCover is a Code Coverage Tool 132 | .axoCover/* 133 | !.axoCover/settings.json 134 | 135 | # Visual Studio code coverage results 136 | *.coverage 137 | *.coveragexml 138 | 139 | # NCrunch 140 | _NCrunch_* 141 | .*crunch*.local.xml 142 | nCrunchTemp_* 143 | 144 | # MightyMoose 145 | *.mm.* 146 | AutoTest.Net/ 147 | 148 | # Web workbench (sass) 149 | .sass-cache/ 150 | 151 | # Installshield output folder 152 | [Ee]xpress/ 153 | 154 | # DocProject is a documentation generator add-in 155 | DocProject/buildhelp/ 156 | DocProject/Help/*.HxT 157 | DocProject/Help/*.HxC 158 | DocProject/Help/*.hhc 159 | DocProject/Help/*.hhk 160 | DocProject/Help/*.hhp 161 | DocProject/Help/Html2 162 | DocProject/Help/html 163 | 164 | # Click-Once directory 165 | publish/ 166 | 167 | # Publish Web Output 168 | *.[Pp]ublish.xml 169 | *.azurePubxml 170 | # Note: Comment the next line if you want to checkin your web deploy settings, 171 | # but database connection strings (with potential passwords) will be unencrypted 172 | *.pubxml 173 | *.publishproj 174 | 175 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 176 | # checkin your Azure Web App publish settings, but sensitive information contained 177 | # in these scripts will be unencrypted 178 | PublishScripts/ 179 | 180 | # NuGet Packages 181 | *.nupkg 182 | # The packages folder can be ignored because of Package Restore 183 | **/[Pp]ackages/* 184 | # except build/, which is used as an MSBuild target. 185 | !**/[Pp]ackages/build/ 186 | # Uncomment if necessary however generally it will be regenerated when needed 187 | #!**/[Pp]ackages/repositories.config 188 | # NuGet v3's project.json files produces more ignorable files 189 | *.nuget.props 190 | *.nuget.targets 191 | 192 | # Microsoft Azure Build Output 193 | csx/ 194 | *.build.csdef 195 | 196 | # Microsoft Azure Emulator 197 | ecf/ 198 | rcf/ 199 | 200 | # Windows Store app package directories and files 201 | AppPackages/ 202 | BundleArtifacts/ 203 | Package.StoreAssociation.xml 204 | _pkginfo.txt 205 | *.appx 206 | 207 | # Visual Studio cache files 208 | # files ending in .cache can be ignored 209 | *.[Cc]ache 210 | # but keep track of directories ending in .cache 211 | !*.[Cc]ache/ 212 | 213 | # Others 214 | ClientBin/ 215 | ~$* 216 | *~ 217 | *.dbmdl 218 | *.dbproj.schemaview 219 | *.jfm 220 | *.pfx 221 | *.publishsettings 222 | orleans.codegen.cs 223 | 224 | # Including strong name files can present a security risk 225 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 226 | #*.snk 227 | 228 | # Since there are multiple workflows, uncomment next line to ignore bower_components 229 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 230 | #bower_components/ 231 | 232 | # RIA/Silverlight projects 233 | Generated_Code/ 234 | 235 | # Backup & report files from converting an old project file 236 | # to a newer Visual Studio version. Backup files are not needed, 237 | # because we have git ;-) 238 | _UpgradeReport_Files/ 239 | Backup*/ 240 | UpgradeLog*.XML 241 | UpgradeLog*.htm 242 | ServiceFabricBackup/ 243 | *.rptproj.bak 244 | 245 | # SQL Server files 246 | *.mdf 247 | *.ldf 248 | *.ndf 249 | 250 | # Business Intelligence projects 251 | *.rdl.data 252 | *.bim.layout 253 | *.bim_*.settings 254 | *.rptproj.rsuser 255 | 256 | # Microsoft Fakes 257 | FakesAssemblies/ 258 | 259 | # GhostDoc plugin setting file 260 | *.GhostDoc.xml 261 | 262 | # Node.js Tools for Visual Studio 263 | .ntvs_analysis.dat 264 | node_modules/ 265 | 266 | # Visual Studio 6 build log 267 | *.plg 268 | 269 | # Visual Studio 6 workspace options file 270 | *.opt 271 | 272 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 273 | *.vbw 274 | 275 | # Visual Studio LightSwitch build output 276 | **/*.HTMLClient/GeneratedArtifacts 277 | **/*.DesktopClient/GeneratedArtifacts 278 | **/*.DesktopClient/ModelManifest.xml 279 | **/*.Server/GeneratedArtifacts 280 | **/*.Server/ModelManifest.xml 281 | _Pvt_Extensions 282 | 283 | # Paket dependency manager 284 | .paket/paket.exe 285 | paket-files/ 286 | 287 | # FAKE - F# Make 288 | .fake/ 289 | 290 | # JetBrains Rider 291 | .idea/ 292 | *.sln.iml 293 | 294 | # CodeRush 295 | .cr/ 296 | 297 | # Python Tools for Visual Studio (PTVS) 298 | __pycache__/ 299 | *.pyc 300 | 301 | # Cake - Uncomment if you are using it 302 | # tools/** 303 | # !tools/packages.config 304 | 305 | # Tabs Studio 306 | *.tss 307 | 308 | # Telerik's JustMock configuration file 309 | *.jmconfig 310 | 311 | # BizTalk build output 312 | *.btp.cs 313 | *.btm.cs 314 | *.odx.cs 315 | *.xsd.cs 316 | 317 | # OpenCover UI analysis results 318 | OpenCover/ 319 | 320 | # Azure Stream Analytics local run output 321 | ASALocalRun/ 322 | 323 | # MSBuild Binary and Structured Log 324 | *.binlog 325 | 326 | # NVidia Nsight GPU debugger configuration file 327 | *.nvuser 328 | 329 | # MFractors (Xamarin productivity tool) working folder 330 | .mfractor/ 331 | Speckle.exe 332 | SpeckleDynamo/ 333 | SpeckleRhino/ 334 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/.gitmodules -------------------------------------------------------------------------------- /Assets/installer.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/Assets/installer.bmp -------------------------------------------------------------------------------- /Assets/speckle.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/Assets/speckle.ico -------------------------------------------------------------------------------- /InnoSetup/Default.isl: -------------------------------------------------------------------------------- 1 | ; *** Inno Setup version 5.5.3+ English messages *** 2 | ; 3 | ; To download user-contributed translations of this file, go to: 4 | ; http://www.jrsoftware.org/files/istrans/ 5 | ; 6 | ; Note: When translating this text, do not add periods (.) to the end of 7 | ; messages that didn't have them already, because on those messages Inno 8 | ; Setup adds the periods automatically (appending a period would result in 9 | ; two periods being displayed). 10 | 11 | [LangOptions] 12 | ; The following three entries are very important. Be sure to read and 13 | ; understand the '[LangOptions] section' topic in the help file. 14 | LanguageName=English 15 | LanguageID=$0409 16 | LanguageCodePage=0 17 | ; If the language you are translating to requires special font faces or 18 | ; sizes, uncomment any of the following entries and change them accordingly. 19 | ;DialogFontName= 20 | ;DialogFontSize=8 21 | ;WelcomeFontName=Verdana 22 | ;WelcomeFontSize=12 23 | ;TitleFontName=Arial 24 | ;TitleFontSize=29 25 | ;CopyrightFontName=Arial 26 | ;CopyrightFontSize=8 27 | 28 | [Messages] 29 | 30 | ; *** Application titles 31 | SetupAppTitle=Setup 32 | SetupWindowTitle=Setup - %1 33 | UninstallAppTitle=Uninstall 34 | UninstallAppFullTitle=%1 Uninstall 35 | 36 | ; *** Misc. common 37 | InformationTitle=Information 38 | ConfirmTitle=Confirm 39 | ErrorTitle=Error 40 | 41 | ; *** SetupLdr messages 42 | SetupLdrStartupMessage=This will install %1. Do you wish to continue? 43 | LdrCannotCreateTemp=Unable to create a temporary file. Setup aborted 44 | LdrCannotExecTemp=Unable to execute file in the temporary directory. Setup aborted 45 | 46 | ; *** Startup error messages 47 | LastErrorMessage=%1.%n%nError %2: %3 48 | SetupFileMissing=The file %1 is missing from the installation directory. Please correct the problem or obtain a new copy of the program. 49 | SetupFileCorrupt=The setup files are corrupted. Please obtain a new copy of the program. 50 | SetupFileCorruptOrWrongVer=The setup files are corrupted, or are incompatible with this version of Setup. Please correct the problem or obtain a new copy of the program. 51 | InvalidParameter=An invalid parameter was passed on the command line:%n%n%1 52 | SetupAlreadyRunning=Setup is already running. 53 | WindowsVersionNotSupported=This program does not support the version of Windows your computer is running. 54 | WindowsServicePackRequired=This program requires %1 Service Pack %2 or later. 55 | NotOnThisPlatform=This program will not run on %1. 56 | OnlyOnThisPlatform=This program must be run on %1. 57 | OnlyOnTheseArchitectures=This program can only be installed on versions of Windows designed for the following processor architectures:%n%n%1 58 | MissingWOW64APIs=The version of Windows you are running does not include functionality required by Setup to perform a 64-bit installation. To correct this problem, please install Service Pack %1. 59 | WinVersionTooLowError=This program requires %1 version %2 or later. 60 | WinVersionTooHighError=This program cannot be installed on %1 version %2 or later. 61 | AdminPrivilegesRequired=You must be logged in as an administrator when installing this program. 62 | PowerUserPrivilegesRequired=You must be logged in as an administrator or as a member of the Power Users group when installing this program. 63 | SetupAppRunningError=Setup has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. 64 | UninstallAppRunningError=Uninstall has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. 65 | 66 | ; *** Misc. errors 67 | ErrorCreatingDir=Setup was unable to create the directory "%1" 68 | ErrorTooManyFilesInDir=Unable to create a file in the directory "%1" because it contains too many files 69 | 70 | ; *** Setup common messages 71 | ExitSetupTitle=Exit Setup 72 | ExitSetupMessage=Setup is not complete. If you exit now, the program will not be installed.%n%nYou may run Setup again at another time to complete the installation.%n%nExit Setup? 73 | AboutSetupMenuItem=&About Setup... 74 | AboutSetupTitle=About Setup 75 | AboutSetupMessage=%1 version %2%n%3%n%n%1 home page:%n%4 76 | AboutSetupNote= 77 | TranslatorNote= 78 | 79 | ; *** Buttons 80 | ButtonBack=< &Back 81 | ButtonNext=&Next > 82 | ButtonInstall=&Install 83 | ButtonOK=OK 84 | ButtonCancel=Cancel 85 | ButtonYes=&Yes 86 | ButtonYesToAll=Yes to &All 87 | ButtonNo=&No 88 | ButtonNoToAll=N&o to All 89 | ButtonFinish=&Finish 90 | ButtonBrowse=&Browse... 91 | ButtonWizardBrowse=B&rowse... 92 | ButtonNewFolder=&Make New Folder 93 | 94 | ; *** "Select Language" dialog messages 95 | SelectLanguageTitle=Select Setup Language 96 | SelectLanguageLabel=Select the language to use during the installation: 97 | 98 | ; *** Common wizard text 99 | ClickNext=Click Next to continue, or Cancel to exit Setup. 100 | BeveledLabel= 101 | BrowseDialogTitle=Browse For Folder 102 | BrowseDialogLabel=Select a folder in the list below, then click OK. 103 | NewFolderName=New Folder 104 | 105 | ; *** "Welcome" wizard page 106 | WelcomeLabel1=Welcome to the [name] Setup Wizard 107 | WelcomeLabel2=This will install [name/ver] on your computer.%n%nIt is recommended that you close all other applications before continuing. 108 | 109 | ; *** "Password" wizard page 110 | WizardPassword=Password 111 | PasswordLabel1=This installation is password protected. 112 | PasswordLabel3=Please provide the password, then click Next to continue. Passwords are case-sensitive. 113 | PasswordEditLabel=&Password: 114 | IncorrectPassword=The password you entered is not correct. Please try again. 115 | 116 | ; *** "License Agreement" wizard page 117 | WizardLicense=License Agreement 118 | LicenseLabel=Please read the following important information before continuing. 119 | LicenseLabel3=Please read the following License Agreement. You must accept the terms of this agreement before continuing with the installation. 120 | LicenseAccepted=I &accept the agreement 121 | LicenseNotAccepted=I &do not accept the agreement 122 | 123 | ; *** "Information" wizard pages 124 | WizardInfoBefore=Information 125 | InfoBeforeLabel=Please read the following important information before continuing. 126 | InfoBeforeClickLabel=When you are ready to continue with Setup, click Next. 127 | WizardInfoAfter=Information 128 | InfoAfterLabel=Please read the following important information before continuing. 129 | InfoAfterClickLabel=When you are ready to continue with Setup, click Next. 130 | 131 | ; *** "User Information" wizard page 132 | WizardUserInfo=User Information 133 | UserInfoDesc=Please enter your information. 134 | UserInfoName=&User Name: 135 | UserInfoOrg=&Organization: 136 | UserInfoSerial=&Serial Number: 137 | UserInfoNameRequired=You must enter a name. 138 | 139 | ; *** "Select Destination Location" wizard page 140 | WizardSelectDir=Select Destination Location 141 | SelectDirDesc=Where should [name] be installed? 142 | SelectDirLabel3=Setup will install [name] into the following folder. 143 | SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. 144 | DiskSpaceMBLabel=At least [mb] MB of free disk space is required. 145 | CannotInstallToNetworkDrive=Setup cannot install to a network drive. 146 | CannotInstallToUNCPath=Setup cannot install to a UNC path. 147 | InvalidPath=You must enter a full path with drive letter; for example:%n%nC:\APP%n%nor a UNC path in the form:%n%n\\server\share 148 | InvalidDrive=The drive or UNC share you selected does not exist or is not accessible. Please select another. 149 | DiskSpaceWarningTitle=Not Enough Disk Space 150 | DiskSpaceWarning=Setup requires at least %1 KB of free space to install, but the selected drive only has %2 KB available.%n%nDo you want to continue anyway? 151 | DirNameTooLong=The folder name or path is too long. 152 | InvalidDirName=The folder name is not valid. 153 | BadDirName32=Folder names cannot include any of the following characters:%n%n%1 154 | DirExistsTitle=Folder Exists 155 | DirExists=The folder:%n%n%1%n%nalready exists. Would you like to install to that folder anyway? 156 | DirDoesntExistTitle=Folder Does Not Exist 157 | DirDoesntExist=The folder:%n%n%1%n%ndoes not exist. Would you like the folder to be created? 158 | 159 | ; *** "Select Components" wizard page 160 | WizardSelectComponents=Select Components 161 | SelectComponentsDesc=Which components should be installed? 162 | SelectComponentsLabel2=Select the components you want to install; clear the components you do not want to install. Click Next when you are ready to continue. 163 | FullInstallation=Full installation 164 | ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) 165 | CompactInstallation=Compact installation 166 | CustomInstallation=Custom installation 167 | NoUninstallWarningTitle=Components Exist 168 | NoUninstallWarning=Setup has detected that the following components are already installed on your computer:%n%n%1%n%nDeselecting these components will not uninstall them.%n%nWould you like to continue anyway? 169 | ComponentSize1=%1 KB 170 | ComponentSize2=%1 MB 171 | ComponentsDiskSpaceMBLabel=Current selection requires at least [mb] MB of disk space. 172 | 173 | ; *** "Select Additional Tasks" wizard page 174 | WizardSelectTasks=Select Additional Tasks 175 | SelectTasksDesc=Which additional tasks should be performed? 176 | SelectTasksLabel2=Select the additional tasks you would like Setup to perform while installing [name], then click Next. 177 | 178 | ; *** "Select Start Menu Folder" wizard page 179 | WizardSelectProgramGroup=Select Start Menu Folder 180 | SelectStartMenuFolderDesc=Where should Setup place the program's shortcuts? 181 | SelectStartMenuFolderLabel3=Setup will create the program's shortcuts in the following Start Menu folder. 182 | SelectStartMenuFolderBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. 183 | MustEnterGroupName=You must enter a folder name. 184 | GroupNameTooLong=The folder name or path is too long. 185 | InvalidGroupName=The folder name is not valid. 186 | BadGroupName=The folder name cannot include any of the following characters:%n%n%1 187 | NoProgramGroupCheck2=&Don't create a Start Menu folder 188 | 189 | ; *** "Ready to Install" wizard page 190 | WizardReady=Ready to Install 191 | ReadyLabel1=Setup is now ready to begin installing [name] on your computer. 192 | ReadyLabel2a=Click Install to continue with the installation, or click Back if you want to review or change any settings. 193 | ReadyLabel2b=Click Install to continue with the installation. 194 | ReadyMemoUserInfo=User information: 195 | ReadyMemoDir=Destination location: 196 | ReadyMemoType=Setup type: 197 | ReadyMemoComponents=Selected components: 198 | ReadyMemoGroup=Start Menu folder: 199 | ReadyMemoTasks=Additional tasks: 200 | 201 | ; *** "Preparing to Install" wizard page 202 | WizardPreparing=Preparing to Install 203 | PreparingDesc=Setup is preparing to install [name] on your computer. 204 | PreviousInstallNotCompleted=The installation/removal of a previous program was not completed. You will need to restart your computer to complete that installation.%n%nAfter restarting your computer, run Setup again to complete the installation of [name]. 205 | CannotContinue=Setup cannot continue. Please click Cancel to exit. 206 | ApplicationsFound=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications. 207 | ApplicationsFound2=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications. After the installation has completed, Setup will attempt to restart the applications. 208 | CloseApplications=&Automatically close the applications 209 | DontCloseApplications=&Do not close the applications 210 | ErrorCloseApplications=Setup was unable to automatically close all applications. It is recommended that you close all applications using files that need to be updated by Setup before continuing. 211 | 212 | ; *** "Installing" wizard page 213 | WizardInstalling=Installing 214 | InstallingLabel=Please wait while Setup installs [name] on your computer. 215 | 216 | ; *** "Setup Completed" wizard page 217 | FinishedHeadingLabel=Completing the [name] Setup Wizard 218 | FinishedLabelNoIcons=Setup has finished installing [name] on your computer. 219 | FinishedLabel=Setup has finished installing [name] on your computer. The application may be launched by selecting the installed shortcuts. 220 | ClickFinish=Click Finish to exit Setup. 221 | FinishedRestartLabel=To complete the installation of [name], Setup must restart your computer. Would you like to restart now? 222 | FinishedRestartMessage=To complete the installation of [name], Setup must restart your computer.%n%nWould you like to restart now? 223 | ShowReadmeCheck=Yes, I would like to view the README file 224 | YesRadio=&Yes, restart the computer now 225 | NoRadio=&No, I will restart the computer later 226 | ; used for example as 'Run MyProg.exe' 227 | RunEntryExec=Run %1 228 | ; used for example as 'View Readme.txt' 229 | RunEntryShellExec=View %1 230 | 231 | ; *** "Setup Needs the Next Disk" stuff 232 | ChangeDiskTitle=Setup Needs the Next Disk 233 | SelectDiskLabel2=Please insert Disk %1 and click OK.%n%nIf the files on this disk can be found in a folder other than the one displayed below, enter the correct path or click Browse. 234 | PathLabel=&Path: 235 | FileNotInDir2=The file "%1" could not be located in "%2". Please insert the correct disk or select another folder. 236 | SelectDirectoryLabel=Please specify the location of the next disk. 237 | 238 | ; *** Installation phase messages 239 | SetupAborted=Setup was not completed.%n%nPlease correct the problem and run Setup again. 240 | EntryAbortRetryIgnore=Click Retry to try again, Ignore to proceed anyway, or Abort to cancel installation. 241 | 242 | ; *** Installation status messages 243 | StatusClosingApplications=Closing applications... 244 | StatusCreateDirs=Creating directories... 245 | StatusExtractFiles=Extracting files... 246 | StatusCreateIcons=Creating shortcuts... 247 | StatusCreateIniEntries=Creating INI entries... 248 | StatusCreateRegistryEntries=Creating registry entries... 249 | StatusRegisterFiles=Registering files... 250 | StatusSavingUninstall=Saving uninstall information... 251 | StatusRunProgram=Finishing installation... 252 | StatusRestartingApplications=Restarting applications... 253 | StatusRollback=Rolling back changes... 254 | 255 | ; *** Misc. errors 256 | ErrorInternal2=Internal error: %1 257 | ErrorFunctionFailedNoCode=%1 failed 258 | ErrorFunctionFailed=%1 failed; code %2 259 | ErrorFunctionFailedWithMessage=%1 failed; code %2.%n%3 260 | ErrorExecutingProgram=Unable to execute file:%n%1 261 | 262 | ; *** Registry errors 263 | ErrorRegOpenKey=Error opening registry key:%n%1\%2 264 | ErrorRegCreateKey=Error creating registry key:%n%1\%2 265 | ErrorRegWriteKey=Error writing to registry key:%n%1\%2 266 | 267 | ; *** INI errors 268 | ErrorIniEntry=Error creating INI entry in file "%1". 269 | 270 | ; *** File copying errors 271 | FileAbortRetryIgnore=Click Retry to try again, Ignore to skip this file (not recommended), or Abort to cancel installation. 272 | FileAbortRetryIgnore2=Click Retry to try again, Ignore to proceed anyway (not recommended), or Abort to cancel installation. 273 | SourceIsCorrupted=The source file is corrupted 274 | SourceDoesntExist=The source file "%1" does not exist 275 | ExistingFileReadOnly=The existing file is marked as read-only.%n%nClick Retry to remove the read-only attribute and try again, Ignore to skip this file, or Abort to cancel installation. 276 | ErrorReadingExistingDest=An error occurred while trying to read the existing file: 277 | FileExists=The file already exists.%n%nWould you like Setup to overwrite it? 278 | ExistingFileNewer=The existing file is newer than the one Setup is trying to install. It is recommended that you keep the existing file.%n%nDo you want to keep the existing file? 279 | ErrorChangingAttr=An error occurred while trying to change the attributes of the existing file: 280 | ErrorCreatingTemp=An error occurred while trying to create a file in the destination directory: 281 | ErrorReadingSource=An error occurred while trying to read the source file: 282 | ErrorCopying=An error occurred while trying to copy a file: 283 | ErrorReplacingExistingFile=An error occurred while trying to replace the existing file: 284 | ErrorRestartReplace=RestartReplace failed: 285 | ErrorRenamingTemp=An error occurred while trying to rename a file in the destination directory: 286 | ErrorRegisterServer=Unable to register the DLL/OCX: %1 287 | ErrorRegSvr32Failed=RegSvr32 failed with exit code %1 288 | ErrorRegisterTypeLib=Unable to register the type library: %1 289 | 290 | ; *** Post-installation errors 291 | ErrorOpeningReadme=An error occurred while trying to open the README file. 292 | ErrorRestartingComputer=Setup was unable to restart the computer. Please do this manually. 293 | 294 | ; *** Uninstaller messages 295 | UninstallNotFound=File "%1" does not exist. Cannot uninstall. 296 | UninstallOpenError=File "%1" could not be opened. Cannot uninstall 297 | UninstallUnsupportedVer=The uninstall log file "%1" is in a format not recognized by this version of the uninstaller. Cannot uninstall 298 | UninstallUnknownEntry=An unknown entry (%1) was encountered in the uninstall log 299 | ConfirmUninstall=Are you sure you want to completely remove %1 and all of its components? 300 | UninstallOnlyOnWin64=This installation can only be uninstalled on 64-bit Windows. 301 | OnlyAdminCanUninstall=This installation can only be uninstalled by a user with administrative privileges. 302 | UninstallStatusLabel=Please wait while %1 is removed from your computer. 303 | UninstalledAll=%1 was successfully removed from your computer. 304 | UninstalledMost=%1 uninstall complete.%n%nSome elements could not be removed. These can be removed manually. 305 | UninstalledAndNeedsRestart=To complete the uninstallation of %1, your computer must be restarted.%n%nWould you like to restart now? 306 | UninstallDataCorrupted="%1" file is corrupted. Cannot uninstall 307 | 308 | ; *** Uninstallation phase messages 309 | ConfirmDeleteSharedFileTitle=Remove Shared File? 310 | ConfirmDeleteSharedFile2=The system indicates that the following shared file is no longer in use by any programs. Would you like for Uninstall to remove this shared file?%n%nIf any programs are still using this file and it is removed, those programs may not function properly. If you are unsure, choose No. Leaving the file on your system will not cause any harm. 311 | SharedFileNameLabel=File name: 312 | SharedFileLocationLabel=Location: 313 | WizardUninstalling=Uninstall Status 314 | StatusUninstalling=Uninstalling %1... 315 | 316 | ; *** Shutdown block reasons 317 | ShutdownBlockReasonInstallingApp=Installing %1. 318 | ShutdownBlockReasonUninstallingApp=Uninstalling %1. 319 | 320 | ; The custom messages below aren't used by Setup itself, but if you make 321 | ; use of them in your scripts, you'll want to translate them. 322 | 323 | [CustomMessages] 324 | 325 | NameAndVersion=%1 version %2 326 | AdditionalIcons=Additional shortcuts: 327 | CreateDesktopIcon=Create a &desktop shortcut 328 | CreateQuickLaunchIcon=Create a &Quick Launch shortcut 329 | ProgramOnTheWeb=%1 on the Web 330 | UninstallProgram=Uninstall %1 331 | LaunchProgram=Launch %1 332 | AssocFileExtension=&Associate %1 with the %2 file extension 333 | AssocingFileExtension=Associating %1 with the %2 file extension... 334 | AutoStartProgramGroupDescription=Startup: 335 | AutoStartProgram=Automatically start %1 336 | AddonHostProgramNotFound=%1 could not be located in the folder you selected.%n%nDo you want to continue anyway? 337 | -------------------------------------------------------------------------------- /InnoSetup/ISCC.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/ISCC.exe -------------------------------------------------------------------------------- /InnoSetup/ISCmplr.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/ISCmplr.dll -------------------------------------------------------------------------------- /InnoSetup/ISPP.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/ISPP.dll -------------------------------------------------------------------------------- /InnoSetup/ISPPBuiltins.iss: -------------------------------------------------------------------------------- 1 | ; BEGIN ISPPBUILTINS.ISS 2 | // 3 | // Inno Setup Preprocessor 5 4 | // 5 | // Copyright (C) 2001-2004 Alex Yackimoff. All Rights Reserved. 6 | // Portions by Martijn Laan. 7 | // http://ispp.sourceforge.net 8 | // 9 | // Inno Setup (C) 1997-2009 Jordan Russell. All Rights Reserved. 10 | // Portions by Martijn Laan. 11 | // 12 | // $Id: ISPPBuiltins.iss,v 1.3 2010/12/29 15:20:26 mlaan Exp $ 13 | // 14 | #if defined(ISPP_INVOKED) && !defined(_BUILTINS_ISS_) 15 | // 16 | #if PREPROCVER < 0x01000000 17 | # error Inno Setup Preprocessor version is outdated 18 | #endif 19 | // 20 | #define _BUILTINS_ISS_ 21 | // 22 | // =========================================================================== 23 | // 24 | // Default states for options. 25 | // 26 | //#pragma parseroption -b+ ; short circuit boolean evaluation: on 27 | //#pragma parseroption -m- ; short circuit multiplication evaluation (0 * A will not eval A): off 28 | //#pragma parseroption -p+ ; string literals without escape sequences: on 29 | //#pragma parseroption -u- ; allow undeclared identifiers: off 30 | //#pragma option -c+ ; pass script to the compiler: on 31 | //#pragma option -e- ; emit empty lines to translation: off 32 | //#pragma option -v- ; verbose mode: off 33 | // 34 | // --------------------------------------------------------------------------- 35 | // 36 | // Verbose levels: 37 | // 0 - #include and #file acknowledgements 38 | // 1 - information about any temp files created by #file 39 | // 2 - #insert and #append acknowledgements 40 | // 3 - reserved 41 | // 4 - #dim, #define and #undef acknowledgements 42 | // 5 - reserved 43 | // 6 - conditional inclusion acknowledgements 44 | // 7 - reserved 45 | // 8 - show strings emitted with #emit directive 46 | // 9 - macro and functions successfull call acknowledgements 47 | //10 - Local macro array allocation acknowledgements 48 | // 49 | //#pragma verboselevel 0 50 | // 51 | #ifndef __POPT_P__ 52 | # define private CStrings 53 | # pragma parseroption -p+ 54 | #endif 55 | // 56 | #pragma spansymbol "\" 57 | // 58 | #define True 1 59 | #define False 0 60 | #define Yes True 61 | #define No False 62 | // 63 | #define MaxInt 0x7FFFFFFFL 64 | #define MinInt 0x80000000L 65 | // 66 | #define NULL 67 | #define void 68 | // 69 | // TypeOf constants 70 | // 71 | #define TYPE_ERROR 0 72 | #define TYPE_NULL 1 73 | #define TYPE_INTEGER 2 74 | #define TYPE_STRING 3 75 | #define TYPE_MACRO 4 76 | #define TYPE_FUNC 5 77 | #define TYPE_ARRAY 6 78 | // 79 | // Helper macro to find out the type of an array element or expression. TypeOf 80 | // standard function only allows identifier as its parameter. Use this macro 81 | // to convert an expression to identifier. 82 | // 83 | #define TypeOf2(any Expr) TypeOf(Expr) 84 | // 85 | // ReadReg constants 86 | // 87 | #define HKEY_CLASSES_ROOT 0x80000000UL 88 | #define HKEY_CURRENT_USER 0x80000001UL 89 | #define HKEY_LOCAL_MACHINE 0x80000002UL 90 | #define HKEY_USERS 0x80000003UL 91 | #define HKEY_CURRENT_CONFIG 0x80000005UL 92 | #define HKEY_CLASSES_ROOT_64 0x82000000UL 93 | #define HKEY_CURRENT_USER_64 0x82000001UL 94 | #define HKEY_LOCAL_MACHINE_64 0x82000002UL 95 | #define HKEY_USERS_64 0x82000003UL 96 | #define HKEY_CURRENT_CONFIG_64 0x82000005UL 97 | // 98 | #define HKCR HKEY_CLASSES_ROOT 99 | #define HKCU HKEY_CURRENT_USER 100 | #define HKLM HKEY_LOCAL_MACHINE 101 | #define HKU HKEY_USERS 102 | #define HKCC HKEY_CURRENT_CONFIG 103 | #define HKCR64 HKEY_CLASSES_ROOT_64 104 | #define HKCU64 HKEY_CURRENT_USER_64 105 | #define HKLM64 HKEY_LOCAL_MACHINE_64 106 | #define HKU64 HKEY_USERS_64 107 | #define HKCC64 HKEY_CURRENT_CONFIG_64 108 | // 109 | // Exec constants 110 | // 111 | #define SW_HIDE 0 112 | #define SW_SHOWNORMAL 1 113 | #define SW_NORMAL 1 114 | #define SW_SHOWMINIMIZED 2 115 | #define SW_SHOWMAXIMIZED 3 116 | #define SW_MAXIMIZE 3 117 | #define SW_SHOWNOACTIVATE 4 118 | #define SW_SHOW 5 119 | #define SW_MINIMIZE 6 120 | #define SW_SHOWMINNOACTIVE 7 121 | #define SW_SHOWNA 8 122 | #define SW_RESTORE 9 123 | #define SW_SHOWDEFAULT 10 124 | #define SW_MAX 10 125 | // 126 | // Find constants 127 | // 128 | #define FIND_MATCH 0x00 129 | #define FIND_BEGINS 0x01 130 | #define FIND_ENDS 0x02 131 | #define FIND_CONTAINS 0x03 132 | #define FIND_CASESENSITIVE 0x04 133 | #define FIND_SENSITIVE FIND_CASESENSITIVE 134 | #define FIND_AND 0x00 135 | #define FIND_OR 0x08 136 | #define FIND_NOT 0x10 137 | #define FIND_TRIM 0x20 138 | // 139 | // FindFirst constants 140 | // 141 | #define faReadOnly 0x00000001 142 | #define faHidden 0x00000002 143 | #define faSysFile 0x00000004 144 | #define faVolumeID 0x00000008 145 | #define faDirectory 0x00000010 146 | #define faArchive 0x00000020 147 | #define faSymLink 0x00000040 148 | #define faAnyFile 0x0000003F 149 | // 150 | // GetStringFileInfo standard names 151 | // 152 | #define COMPANY_NAME "CompanyName" 153 | #define FILE_DESCRIPTION "FileDescription" 154 | #define FILE_VERSION "FileVersion" 155 | #define INTERNAL_NAME "InternalName" 156 | #define LEGAL_COPYRIGHT "LegalCopyright" 157 | #define ORIGINAL_FILENAME "OriginalFilename" 158 | #define PRODUCT_NAME "ProductName" 159 | #define PRODUCT_VERSION "ProductVersion" 160 | // 161 | // GetStringFileInfo helpers 162 | // 163 | #define GetFileCompany(str FileName) GetStringFileInfo(FileName, COMPANY_NAME) 164 | #define GetFileCopyright(str FileName) GetStringFileInfo(FileName, LEGAL_COPYRIGHT) 165 | #define GetFileDescription(str FileName) GetStringFileInfo(FileName, FILE_DESCRIPTION) 166 | #define GetFileProductVersion(str FileName) GetStringFileInfo(FileName, PRODUCT_VERSION) 167 | #define GetFileVersionString(str FileName) GetStringFileInfo(FileName, FILE_VERSION) 168 | // 169 | // ParseVersion 170 | // 171 | // Macro internally calls GetFileVersion function and parses string returned 172 | // by that function (in form "0.0.0.0"). All four version elements are stored 173 | // in by-reference parameters Major, Minor, Rev, and Build. Macro returns 174 | // string returned by GetFileVersion. 175 | // 176 | #define DeleteToFirstPeriod(str *S) \ 177 | Local[1] = Copy(S, 1, (Local[0] = Pos(".", S)) - 1), \ 178 | S = Copy(S, Local[0] + 1), \ 179 | Local[1] 180 | // 181 | #define ParseVersion(str FileName, *Major, *Minor, *Rev, *Build) \ 182 | Local[1] = Local[0] = GetFileVersion(FileName), \ 183 | Local[1] == "" ? "" : ( \ 184 | Major = Int(DeleteToFirstPeriod(Local[1])), \ 185 | Minor = Int(DeleteToFirstPeriod(Local[1])), \ 186 | Rev = Int(DeleteToFirstPeriod(Local[1])), \ 187 | Build = Int(Local[1]), \ 188 | Local[0]) 189 | // 190 | // EncodeVer 191 | // 192 | // Encodes given four version elements to a 32 bit integer number (8 bits for 193 | // each element, i.e. elements must be within 0...255 range). 194 | // 195 | #define EncodeVer(int Major, int Minor, int Revision = 0, int Build = -1) \ 196 | Major << 24 | (Minor & 0xFF) << 16 | (Revision & 0xFF) << 8 | (Build >= 0 ? Build & 0xFF : 0) 197 | // 198 | // DecodeVer 199 | // 200 | // Decodes given 32 bit integer encoded version to its string representation, 201 | // Digits parameter indicates how many elements to show (if the fourth element 202 | // is 0, it won't be shown anyway). 203 | // 204 | #define DecodeVer(int Ver, int Digits = 3) \ 205 | Str(Ver >> 0x18 & 0xFF) + (Digits > 1 ? "." : "") + \ 206 | (Digits > 1 ? \ 207 | Str(Ver >> 0x10 & 0xFF) + (Digits > 2 ? "." : "") : "") + \ 208 | (Digits > 2 ? \ 209 | Str(Ver >> 0x08 & 0xFF) + (Digits > 3 && (Local = Ver & 0xFF) ? "." : "") : "") + \ 210 | (Digits > 3 && Local ? \ 211 | Str(Ver & 0xFF) : "") 212 | // 213 | // FindSection 214 | // 215 | // Returns index of the line following the header of the section. This macro 216 | // is intended to be used with #insert directive. 217 | // 218 | #define FindSection(str Section = "Files") \ 219 | Find(0, "[" + Section + "]", FIND_MATCH | FIND_TRIM) + 1 220 | // 221 | // FindSectionEnd 222 | // 223 | // Returns index of the line following last entry of the section. This macro 224 | // is intended to be used with #insert directive. 225 | // 226 | #if VER >= 0x03000000 227 | # define FindNextSection(int Line) \ 228 | Find(Line, "[", FIND_BEGINS | FIND_TRIM, "]", FIND_ENDS | FIND_AND) 229 | # define FindSectionEnd(str Section = "Files") \ 230 | FindNextSection(FindSection(Section)) 231 | #else 232 | # define FindSectionEnd(str Section = "Files") \ 233 | FindSection(Section) + EntryCount(Section) 234 | #endif 235 | // 236 | // FindCode 237 | // 238 | // Returns index of the line (of translation) following either [Code] section 239 | // header, or "program" keyword, if any. 240 | // 241 | #define FindCode() \ 242 | Local[1] = FindSection("Code"), \ 243 | Local[0] = Find(Local[1] - 1, "program", FIND_BEGINS, ";", FIND_ENDS | FIND_AND), \ 244 | (Local[0] < 0 ? Local[1] : Local[0] + 1) 245 | // 246 | // ExtractFilePath 247 | // 248 | // Returns directory portion of the given filename without backslash (unless 249 | // it is a root directory). If PathName doesn't contain directory portion, 250 | // the result is an empty string. 251 | // 252 | #define ExtractFilePath(str PathName) \ 253 | (Local[0] = \ 254 | !(Local[1] = RPos("\", PathName)) ? \ 255 | "" : \ 256 | Copy(PathName, 1, Local[1] - 1)), \ 257 | Local[0] + \ 258 | ((Local[2] = Len(Local[0])) == 2 && Copy(Local[0], Local[2]) == ":" ? \ 259 | "\" : \ 260 | "") 261 | #define ExtractFileDir(str PathName) \ 262 | RemoveBackslash(ExtractFilePath(PathName)) 263 | 264 | #define ExtractFileExt(str PathName) \ 265 | Local[0] = RPos(".", PathName), \ 266 | Copy(PathName, Local[0] + 1) 267 | // 268 | // ExtractFileName 269 | // 270 | // Returns name portion of the given filename. If PathName ends with 271 | // a backslash, the result is an empty string. 272 | // 273 | #define ExtractFileName(str PathName) \ 274 | !(Local[0] = RPos("\", PathName)) ? \ 275 | PathName : \ 276 | Copy(PathName, Local[0] + 1) 277 | // 278 | // ChangeFileExt 279 | // 280 | // Changes extension in FileName with NewExt. NewExt must not contain 281 | // period. 282 | // 283 | #define ChangeFileExt(str FileName, str NewExt) \ 284 | !(Local[0] = RPos(".", FileName)) ? \ 285 | FileName + "." + NewExt : \ 286 | Copy(FileName, 1, Local[0]) + NewExt 287 | // 288 | // RemoveFileExt 289 | // 290 | // Removes extension in FileName. 291 | // 292 | #define RemoveFileExt(str FileName) \ 293 | !(Local[0] = RPos(".", FileName)) ? \ 294 | FileName : \ 295 | Copy(FileName, 1, Local[0] - 1) 296 | // 297 | // AddBackslash 298 | // 299 | // Adds a backslash to the string, if it's not already there. 300 | // 301 | #define AddBackslash(str S) \ 302 | Copy(S, Len(S)) == "\" ? S : S + "\" 303 | // 304 | // RemoveBackslash 305 | // 306 | // Removes trailing backslash from the string unless the string points to 307 | // a root directory. 308 | // 309 | #define RemoveBackslash(str S) \ 310 | Local[0] = Len(S), \ 311 | Local[0] > 0 ? \ 312 | Copy(S, Local[0]) == "\" ? \ 313 | (Local[0] == 3 && Copy(S, 2, 1) == ":" ? \ 314 | S : \ 315 | Copy(S, 1, Local[0] - 1)) : \ 316 | S : \ 317 | "" 318 | // 319 | // Delete 320 | // 321 | // Deletes specified number of characters beginning with Index from S. S is 322 | // passed by reference (therefore is modified). Acts like Delete function in 323 | // Delphi (from System unit). 324 | // 325 | #define Delete(str *S, int Index, int Count = MaxInt) \ 326 | S = Copy(S, 1, Index - 1) + Copy(S, Index + Count) 327 | // 328 | // Insert 329 | // 330 | // Inserts specified Substr at Index'th character into S. S is passed by 331 | // reference (therefore is modified). 332 | // 333 | #define Insert(str *S, int Index, str Substr) \ 334 | Index > Len(S) + 1 ? \ 335 | S : \ 336 | S = Copy(S, 1, Index - 1) + SubStr + Copy(S, Index) 337 | // 338 | // YesNo, IsDirSet 339 | // 340 | // Returns nonzero value if given string is "yes", "true" or "1". Intended to 341 | // be used with SetupSetting function. This macro replaces YesNo function 342 | // available in previous releases. 343 | // 344 | #define YesNo(str S) \ 345 | (S = LowerCase(S)) == "yes" || S == "true" || S == "1" 346 | // 347 | #define IsDirSet(str SetupDirective) \ 348 | YesNo(SetupSetting(SetupDirective)) 349 | // 350 | // 351 | #define Power(int X, int P = 2) \ 352 | !P ? 1 : X * Power(X, P - 1) 353 | // 354 | #define Min(int A, int B, int C = MaxInt) \ 355 | A < B ? A < C ? Int(A) : Int(C) : Int(B) 356 | // 357 | #define Max(int A, int B, int C = MinInt) \ 358 | A > B ? A > C ? Int(A) : Int(C) : Int(B) 359 | // 360 | 361 | #ifdef CStrings 362 | # pragma parseroption -p- 363 | #endif 364 | #endif 365 | ; END ISPPBUILTINS.ISS 366 | 367 | -------------------------------------------------------------------------------- /InnoSetup/Setup.e32: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/Setup.e32 -------------------------------------------------------------------------------- /InnoSetup/SetupLdr.e32: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/SetupLdr.e32 -------------------------------------------------------------------------------- /InnoSetup/WizModernImage-IS.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/WizModernImage-IS.bmp -------------------------------------------------------------------------------- /InnoSetup/WizModernImage.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/WizModernImage.bmp -------------------------------------------------------------------------------- /InnoSetup/WizModernSmallImage-IS.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/WizModernSmallImage-IS.bmp -------------------------------------------------------------------------------- /InnoSetup/WizModernSmallImage.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/WizModernSmallImage.bmp -------------------------------------------------------------------------------- /InnoSetup/islzma.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/islzma.dll -------------------------------------------------------------------------------- /InnoSetup/islzma32.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/islzma32.exe -------------------------------------------------------------------------------- /InnoSetup/islzma64.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/speckleworks/SpeckleInstaller/b80411b74eecce849b0b48f63c1c335be3696618/InnoSetup/islzma64.exe -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Speckle Works 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Speckle Installer 2 | 3 | [![Build status](https://ci.appveyor.com/api/projects/status/pkdn8l2bumxy3esa/branch/master?svg=true)](https://ci.appveyor.com/project/SpeckleWorks/speckleinstaller) ![GitHub All Releases](https://img.shields.io/github/downloads/speckleworks/speckleinstaller/total) 4 | 5 | ## ⚠️ IMPORTANT ⚠️ 6 | 7 | Speckle v1 has reached EOL and is no longer mainatined. Check out our brand new 👉 [Speckle v2](https://github.com/specklesystems)! 8 | Read more about the announcemnt [here](https://speckle.systems/blog/speckle2-vision-and-faq) and check out or new [website](https://speckle.systems). 9 | 10 | 11 | 12 | ![image](https://user-images.githubusercontent.com/2679513/48942587-fba54a00-ef17-11e8-8708-65f6be50ebe0.png) 13 | 14 | Speckle desktop client installer for: 15 | 16 | - Grasshopper 17 | - Rhino 18 | - Dynamo 19 | - (NEW) [SpeckleCoreGeometry](https://github.com/speckleworks/SpeckleCoreGeometry) 20 | 21 | The installer does not require admin privileges and auto updates! 22 | 23 | ## Creating a new (pre) release 24 | 25 | 1. Change version in `appveyor.yml` file 26 | 2. Commit & tag commit with the new version 27 | 3. Push to origin 28 | 29 | To push the newly minted pre-release, you'll need to edit it and change its status from `prerelease` to `release`. 30 | 31 | ## Installer tool 32 | This project uses [Inno Setup](http://www.jrsoftware.org/) to create the installer. 33 | 34 | If you'd like to contribute to the project, please first head over to [Inno Setup download page](http://www.jrsoftware.org/isdl.php) and install it. 35 | -------------------------------------------------------------------------------- /SpeckleInstaller.iss: -------------------------------------------------------------------------------- 1 | ;defining variables 2 | #define AppName "Speckle" 3 | #define AppVersion GetFileVersion("SpeckleUpdater\bin\Release\SpeckleUpdater.exe") 4 | #define RhinoVersion GetFileVersion("SpeckleRhino\SpeckleRhinoConverter.dll") 5 | #define DynamoVersion GetFileVersion("SpeckleDynamo\bin\SpeckleDynamo.dll") 6 | #define RevitVersion GetFileVersion("SpeckleRevit2021\SpeckleRevit\SpeckleRevit.dll") 7 | #define CoreGeometryVersion GetFileVersion("SpeckleCoreGeometry\SpeckleCoreGeometry.dll") 8 | #define SpeckleElementsVersion GetFileVersion("SpeckleElements\SpeckleElements.dll") 9 | #define SpeckleStructuralVersion GetFileVersion("SpeckleStructural\SpeckleStructural.dll") 10 | #define AppPublisher "Speckle" 11 | #define AppURL "https://speckle.works" 12 | #define SpeckleFolder "{localappdata}\Speckle" 13 | #define UpdaterFilename "SpeckleUpdater.exe" 14 | 15 | [Setup] 16 | AppId={{BA3A01AA-F70D-4747-AA0E-E93F38C793C8} 17 | AppName={#AppName} 18 | AppVersion={#AppVersion} 19 | AppVerName={#AppName} {#AppVersion} 20 | AppPublisher={#AppPublisher} 21 | AppPublisherURL={#AppURL} 22 | AppSupportURL={#AppURL} 23 | AppUpdatesURL={#AppURL} 24 | DefaultDirName={#SpeckleFolder} 25 | DisableDirPage=yes 26 | DefaultGroupName={#AppName} 27 | DisableProgramGroupPage=yes 28 | DisableWelcomePage=no 29 | OutputDir="." 30 | OutputBaseFilename=Speckle 31 | SetupIconFile=Assets\speckle.ico 32 | Compression=lzma 33 | SolidCompression=yes 34 | WizardImageFile=Assets\installer.bmp 35 | ChangesAssociations=yes 36 | PrivilegesRequired=lowest 37 | VersionInfoVersion={#AppVersion} 38 | 39 | [Languages] 40 | Name: "english"; MessagesFile: "compiler:Default.isl" 41 | 42 | [Components] 43 | Name: updater; Description: Speckle Updater - v{#AppVersion}; Types: full custom; Flags: fixed 44 | Name: coregeometry; Description: Basic Geometry Object Model - v{#CoreGeometryVersion}; Types: full custom; Flags: fixed 45 | Name: elements; Description: A Higher Level Object Model - v{#SpeckleElementsVersion}; Types: full custom; Flags: fixed 46 | Name: structural; Description: Structural Object Model - v{#SpeckleStructuralVersion}; Types: full custom; Flags: fixed 47 | Name: dynamo; Description: Speckle for Dynamo 2.1+ - v{#DynamoVersion}; Types: full 48 | Name: gh; Description: Speckle for Rhino 6 & Grasshopper - v{#RhinoVersion}; Types: full 49 | Name: revit19; Description: Speckle for Revit 2019 ALPHA - v{#RevitVersion}; Types: full 50 | Name: revit20; Description: Speckle for Revit 2020 ALPHA - v{#RevitVersion}; Types: full 51 | Name: revit21; Description: Speckle for Revit 2021 ALPHA - v{#RevitVersion}; Types: full 52 | 53 | ;Name: excel; Description: Speckle for Revit; Types: full 54 | 55 | [Types] 56 | Name: "full"; Description: "Full installation" 57 | Name: "custom"; Description: "Custom installation"; Flags: iscustom 58 | 59 | [Tasks] 60 | Name: updates; Description: "Auto update, make sure I always have the best Speckle!"; 61 | 62 | [Dirs] 63 | Name: "{app}"; Permissions: everyone-full 64 | 65 | [Files] 66 | ;updater 67 | Source: "SpeckleUpdater\bin\Release\*"; DestDir: "{#SpeckleFolder}"; Flags: ignoreversion recursesubdirs; 68 | 69 | ;rhino+gh 70 | Source: "SpeckleRhino\*"; DestDir: "{userappdata}\McNeel\Rhinoceros\6.0\Plug-ins\Speckle Rhino Plugin (512d9705-6f92-49ca-a606-d6d5c1ac6aa2)\{#RhinoVersion}"; Flags: ignoreversion recursesubdirs; Components: gh 71 | 72 | ;dynamo 73 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Revit\2.1\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 74 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Core\2.1\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 75 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Revit\2.2\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 76 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Core\2.2\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 77 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Revit\2.3\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 78 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Core\2.3\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 79 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Revit\2.4\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 80 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Core\2.4\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 81 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Revit\2.5\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 82 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Core\2.5\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 83 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Revit\2.6\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 84 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Dynamo\Dynamo Core\2.6\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 85 | 86 | ;dynamo for civil 3d 87 | ;Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Autodesk\C3D 2020\Dynamo\2.0\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 88 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Autodesk\C3D 2020\Dynamo\2.1\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 89 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Autodesk\C3D 2020\Dynamo\2.4\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 90 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Autodesk\C3D 2021\Dynamo\2.5\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 91 | Source: "SpeckleDynamo\*"; DestDir: "{userappdata}\Autodesk\C3D 2021\Dynamo\2.6\packages\Speckle for Dynamo\"; Flags: ignoreversion recursesubdirs; Components: dynamo 92 | 93 | ;revit 94 | Source: "SpeckleRevit2019\*"; DestDir: "{userappdata}\Autodesk\Revit\Addins\2019\"; Flags: ignoreversion recursesubdirs; Components: revit19 95 | Source: "SpeckleRevit2020\*"; DestDir: "{userappdata}\Autodesk\Revit\Addins\2020\"; Flags: ignoreversion recursesubdirs; Components: revit20 96 | Source: "SpeckleRevit2021\*"; DestDir: "{userappdata}\Autodesk\Revit\Addins\2021\"; Flags: ignoreversion recursesubdirs; Components: revit21 97 | 98 | ;coregeometry 99 | Source: "SpeckleCoreGeometry\*"; DestDir: "{localappdata}\SpeckleKits\SpeckleCoreGeometry"; Flags: ignoreversion recursesubdirs; Components: coregeometry 100 | 101 | ;elements 102 | Source: "SpeckleElements\*"; DestDir: "{localappdata}\SpeckleKits\SpeckleElements"; Flags: ignoreversion recursesubdirs; Components: elements 103 | 104 | ;structural 105 | Source: "SpeckleStructural\*"; DestDir: "{localappdata}\SpeckleKits\SpeckleStructural"; Flags: ignoreversion recursesubdirs; Components: elements 106 | 107 | ;excel 108 | ;Source: "{#Repository}\Arup.Compute.Excel\bin\Release\Arup.Compute.Excel-AddIn-packed.xll"; DestDir: "{userappdata}\Microsoft\AddIns\"; Flags: ignoreversion; Components: excel 109 | 110 | ;revit 111 | ;TODO 112 | 113 | ;tekla 114 | ;42 115 | 116 | [InstallDelete] 117 | Type: filesandordirs; Name: "{userappdata}\McNeel\Rhinoceros\6.0\Plug-ins\Speckle Rhino Plugin (512d9705-6f92-49ca-a606-d6d5c1ac6aa2)\*" 118 | Type: filesandordirs; Name: "{cf}\McNeel\Rhinoceros\6.0\Plug-ins\Speckle Rhino Plugin (512d9705-6f92-49ca-a606-d6d5c1ac6aa2)\*" 119 | Type: filesandordirs; Name: "{localappdata}\SpeckleKits\SpeckleCoreGeometry\*" 120 | Type: filesandordirs; Name: "{localappdata}\SpeckleKits\SpeckleElements\*" 121 | Type: filesandordirs; Name: "{localappdata}\SpeckleKits\SpeckleStructural\*" 122 | 123 | [Registry] 124 | Root: HKCU; Subkey: "SOFTWARE\McNeel\Rhinoceros\6.0\Plug-ins\512d9705-6f92-49ca-a606-d6d5c1ac6aa2"; ValueType: string; ValueName: "Name"; ValueData: "Speckle"; 125 | Root: HKCU; Subkey: "SOFTWARE\McNeel\Rhinoceros\6.0\Plug-ins\512d9705-6f92-49ca-a606-d6d5c1ac6aa2"; ValueType: string; ValueName: "FileName"; ValueData: "{userappdata}\McNeel\Rhinoceros\6.0\Plug-ins\Speckle Rhino Plugin (512d9705-6f92-49ca-a606-d6d5c1ac6aa2)\{#RhinoVersion}\SpeckleWinR6.rhp"; 126 | 127 | 128 | [Icons] 129 | Name: "{group}\Check for updates"; Filename: "{#SpeckleFolder}\{#UpdaterFilename}"; Parameters: "-showprogress" 130 | Name: "{userappdata}\Microsoft\Windows\Start Menu\Programs\Startup\Speckle"; Filename: "{#SpeckleFolder}\{#UpdaterFilename}"; Tasks: updates 131 | Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}" 132 | ;Name: "{commondesktop}\{#AppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon 133 | 134 | ;checks if minimun requirements are met 135 | [Code] 136 | function IsDotNetDetected(version: string; service: cardinal): boolean; 137 | // Indicates whether the specified version and service pack of the .NET Framework is installed. 138 | // 139 | // version -- Specify one of these strings for the required .NET Framework version: 140 | // 'v1.1.4322' .NET Framework 1.1 141 | // 'v2.0.50727' .NET Framework 2.0 142 | // 'v3.0' .NET Framework 3.0 143 | // 'v3.5' .NET Framework 3.5 144 | // 'v4\Client' .NET Framework 4.0 Client Profile 145 | // 'v4\Full' .NET Framework 4.0 Full Installation 146 | // 'v4.5' .NET Framework 4.5 147 | // 148 | // service -- Specify any non-negative integer for the required service pack level: 149 | // 0 No service packs required 150 | // 1, 2, etc. Service pack 1, 2, etc. required 151 | var 152 | key: string; 153 | install, release, serviceCount: cardinal; 154 | check45, success: boolean; 155 | begin 156 | // .NET 4.5 installs as update to .NET 4.0 Full 157 | if version = 'v4.5' then begin 158 | version := 'v4\Full'; 159 | check45 := true; 160 | end else 161 | check45 := false; 162 | 163 | // installation key group for all .NET versions 164 | key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version; 165 | 166 | // .NET 3.0 uses value InstallSuccess in subkey Setup 167 | if Pos('v3.0', version) = 1 then begin 168 | success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install); 169 | end else begin 170 | success := RegQueryDWordValue(HKLM, key, 'Install', install); 171 | end; 172 | 173 | // .NET 4.0/4.5 uses value Servicing instead of SP 174 | if Pos('v4', version) = 1 then begin 175 | success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount); 176 | end else begin 177 | success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount); 178 | end; 179 | 180 | // .NET 4.5 uses additional value Release 181 | if check45 then begin 182 | success := success and RegQueryDWordValue(HKLM, key, 'Release', release); 183 | success := success and (release >= 378389); 184 | end; 185 | 186 | result := success and (install = 1) and (serviceCount >= service); 187 | end; 188 | 189 | //Revit 2017/18 need 4.6, should update? 190 | function InitializeSetup(): Boolean; 191 | var 192 | ErrCode: integer; 193 | begin 194 | if not IsDotNetDetected('v4.5', 0) then begin 195 | if MsgBox('{#AppName} requires Microsoft .NET Framework 4.5.'#13#13 196 | 'Do you want me to open http://www.microsoft.com/net'#13 197 | 'so you can download it?', mbConfirmation, MB_YESNO) = IDYES 198 | then begin 199 | ShellExec('open', 'http://www.microsoft.com/net', 200 | '', '', SW_SHOW, ewNoWait, ErrCode); 201 | end; 202 | 203 | result := false; 204 | end else 205 | result := true; 206 | end; -------------------------------------------------------------------------------- /SpeckleUpdater.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.28010.2046 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpeckleUpdater", "SpeckleUpdater\SpeckleUpdater.csproj", "{26D97083-672D-49E4-84D6-70FA299A48EB}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{30517B14-C5E5-42CB-A80A-CABDF95D2EA8}" 9 | ProjectSection(SolutionItems) = preProject 10 | appveyor.yml = appveyor.yml 11 | EndProjectSection 12 | EndProject 13 | Global 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Debug|Any CPU = Debug|Any CPU 16 | Release|Any CPU = Release|Any CPU 17 | EndGlobalSection 18 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 19 | {26D97083-672D-49E4-84D6-70FA299A48EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 20 | {26D97083-672D-49E4-84D6-70FA299A48EB}.Debug|Any CPU.Build.0 = Debug|Any CPU 21 | {26D97083-672D-49E4-84D6-70FA299A48EB}.Release|Any CPU.ActiveCfg = Release|Any CPU 22 | {26D97083-672D-49E4-84D6-70FA299A48EB}.Release|Any CPU.Build.0 = Release|Any CPU 23 | EndGlobalSection 24 | GlobalSection(SolutionProperties) = preSolution 25 | HideSolutionNode = FALSE 26 | EndGlobalSection 27 | GlobalSection(ExtensibilityGlobals) = postSolution 28 | SolutionGuid = {9C2FBBD8-C4E9-4A68-BA5D-57C8B56EFE34} 29 | EndGlobalSection 30 | EndGlobal 31 | -------------------------------------------------------------------------------- /SpeckleUpdater/Api.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using System; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Net.Http; 6 | using System.Net.Http.Headers; 7 | using System.Threading.Tasks; 8 | using static SpeckleUpdater.GitHub; 9 | 10 | namespace SpeckleUpdater 11 | { 12 | internal class Api 13 | { 14 | 15 | internal static async Task GetLatestRelease() 16 | { 17 | Release release = null; 18 | try 19 | { 20 | using (var client = new HttpClient()) 21 | { 22 | client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 23 | client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("User-Agent", "speckle-updater")); 24 | 25 | // get the latest build on master 26 | using (var response = await client.GetAsync(Globals.LatestReopEndpoint)) 27 | { 28 | response.EnsureSuccessStatusCode(); 29 | 30 | var githubRelease = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); 31 | try 32 | { 33 | release = new Release(githubRelease.tag_name, githubRelease.assets.First(x => x.name == Globals.InstallerName).browser_download_url); 34 | } 35 | catch (Exception e) 36 | { 37 | throw e; 38 | } 39 | return release; 40 | } 41 | } 42 | } 43 | catch (Exception e) 44 | { 45 | throw new Exception("Check for updates failed.", e); 46 | } 47 | } 48 | 49 | internal static async Task DownloadRelease(string url, string folder, string path) 50 | { 51 | try 52 | { 53 | 54 | if (!Directory.Exists(folder)) 55 | { 56 | Directory.CreateDirectory(folder); 57 | } 58 | 59 | using (HttpClient client = new HttpClient()) 60 | { 61 | client.Timeout = TimeSpan.FromMinutes(42); 62 | client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 63 | client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("User-Agent", "speckle-updater")); 64 | 65 | using (var response = await client.GetAsync(url)) 66 | { 67 | response.EnsureSuccessStatusCode(); 68 | 69 | if (response.IsSuccessStatusCode) 70 | { 71 | HttpContent content = response.Content; 72 | var contentStream = await content.ReadAsStreamAsync(); // get the actual content stream 73 | 74 | using (var fileStream = File.Create(path)) 75 | { 76 | contentStream.Seek(0, SeekOrigin.Begin); 77 | contentStream.CopyTo(fileStream); 78 | } 79 | } 80 | else 81 | { 82 | throw new FileNotFoundException(); 83 | } 84 | } 85 | 86 | return path; 87 | } 88 | } 89 | 90 | catch (Exception e) 91 | { 92 | throw new Exception("Release download failed.", e); 93 | } 94 | 95 | } 96 | 97 | 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /SpeckleUpdater/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /SpeckleUpdater/App.xaml: -------------------------------------------------------------------------------- 1 |  7 | 8 | 9 | -------------------------------------------------------------------------------- /SpeckleUpdater/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data; 5 | using System.IO; 6 | using System.Linq; 7 | using System.Threading.Tasks; 8 | using System.Windows; 9 | 10 | namespace SpeckleUpdater 11 | { 12 | /// 13 | /// Interaction logic for App.xaml 14 | /// 15 | public partial class App : Application 16 | { 17 | private void Application_Startup(object sender, StartupEventArgs e) 18 | { 19 | try 20 | { 21 | var showProgress = false; 22 | if (e.Args.Length == 1 && e.Args[0] == "-showprogress") 23 | showProgress = true; 24 | 25 | MainWindow wnd = new MainWindow(showProgress); 26 | 27 | if (showProgress) 28 | wnd.Show(); 29 | 30 | } 31 | catch (Exception ex) 32 | { 33 | //fail silently 34 | } 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /SpeckleUpdater/GitHub.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace SpeckleUpdater 8 | { 9 | class GitHub 10 | { 11 | public class Author 12 | { 13 | public string login { get; set; } 14 | public int id { get; set; } 15 | public string node_id { get; set; } 16 | public string avatar_url { get; set; } 17 | public string gravatar_id { get; set; } 18 | public string url { get; set; } 19 | public string html_url { get; set; } 20 | public string followers_url { get; set; } 21 | public string following_url { get; set; } 22 | public string gists_url { get; set; } 23 | public string starred_url { get; set; } 24 | public string subscriptions_url { get; set; } 25 | public string organizations_url { get; set; } 26 | public string repos_url { get; set; } 27 | public string events_url { get; set; } 28 | public string received_events_url { get; set; } 29 | public string type { get; set; } 30 | public bool site_admin { get; set; } 31 | } 32 | 33 | public class Uploader 34 | { 35 | public string login { get; set; } 36 | public int id { get; set; } 37 | public string node_id { get; set; } 38 | public string avatar_url { get; set; } 39 | public string gravatar_id { get; set; } 40 | public string url { get; set; } 41 | public string html_url { get; set; } 42 | public string followers_url { get; set; } 43 | public string following_url { get; set; } 44 | public string gists_url { get; set; } 45 | public string starred_url { get; set; } 46 | public string subscriptions_url { get; set; } 47 | public string organizations_url { get; set; } 48 | public string repos_url { get; set; } 49 | public string events_url { get; set; } 50 | public string received_events_url { get; set; } 51 | public string type { get; set; } 52 | public bool site_admin { get; set; } 53 | } 54 | 55 | public class Asset 56 | { 57 | public string url { get; set; } 58 | public int id { get; set; } 59 | public string node_id { get; set; } 60 | public string name { get; set; } 61 | public object label { get; set; } 62 | public Uploader uploader { get; set; } 63 | public string content_type { get; set; } 64 | public string state { get; set; } 65 | public int size { get; set; } 66 | public int download_count { get; set; } 67 | public DateTime created_at { get; set; } 68 | public DateTime updated_at { get; set; } 69 | public string browser_download_url { get; set; } 70 | } 71 | 72 | public class GitHubRelease 73 | { 74 | public string url { get; set; } 75 | public string assets_url { get; set; } 76 | public string upload_url { get; set; } 77 | public string html_url { get; set; } 78 | public int id { get; set; } 79 | public string node_id { get; set; } 80 | public string tag_name { get; set; } 81 | public string target_commitish { get; set; } 82 | public string name { get; set; } 83 | public bool draft { get; set; } 84 | public Author author { get; set; } 85 | public bool prerelease { get; set; } 86 | public DateTime created_at { get; set; } 87 | public DateTime published_at { get; set; } 88 | public List assets { get; set; } 89 | public string tarball_url { get; set; } 90 | public string zipball_url { get; set; } 91 | public string body { get; set; } 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /SpeckleUpdater/Globals.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace SpeckleUpdater 8 | { 9 | public static class Globals 10 | { 11 | internal static string AppName = "Speckle"; 12 | internal static string InstallerName = "Speckle.exe"; 13 | internal static string LatestReopEndpoint = @"https://api.github.com/repos/speckleworks/SpeckleInstaller/releases/latest"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SpeckleUpdater/MainWindow.xaml: -------------------------------------------------------------------------------- 1 |  19 | 20 | 21 | 22 | 30 | 31 |