; --------------------------------------------------------------------------------------------; Copyright (c) Fantaisie Software. All rights reserved.; Dual licensed under the GPL and Fantaisie Software licenses.; See LICENSE and LICENSE-FANTAISIE in the project root for license information.; --------------------------------------------------------------------------------------------; The URL that contains the update check file;; Example file:;; <?xml version="1.0" encoding="UTF-8"?>; <versions xmlns="http://www.purebasic.com/namespace">; <version category="bugfix" number="5.11" name="PureBasic 5.11" />; <version category="beta" number="5.30" beta="3" name="PureBasic 5.30 beta 3" />; <version category="release" number="5.20" lts="1" name="PureBasic 5.20 LTS" />; </versions>;; Possible values for each release: (note that names are case sensitive);; category:; "release" - a feature release: 5.10, 5.20, ...; "bugfix" - a bugfix release: 5.11, 5.12, ...; "beta" - a beta release;; number:; release number in the form "5.20";; beta:; beta number for beta releases;; lts:; "1" if the release is a LTS release;; name:; full name of the version for display;#UPDATE_CHECK_URL = #ProductWebSite$ + "/versions.xml"; info about an available version;Structure ReleaseName$ ; string for displayCategory.l ; see belowNumber.l ; release number (same as #PB_Compiler_Version)Beta.l ; number of beta release (if category is "beta")LTS.l ; true if this is an LTS versionSortKey.l ; for simpler sortingEndStructure; more important release last for sorting (so a final is higher than a beta)Enumeration 1#CATEGORY_Beta#CATEGORY_Bugfix#CATEGORY_FinalEndEnumerationGlobal UpdateCheck_DownloadCompleteGlobal UpdateCheck_DownloadResultGlobal UpdateCheck_ShowNoUpdatesProcedure VisitDownloadSite()CompilerIf #DEMO = 0; For registered users, directly open the secure download pageSelect UCase(CurrentLanguage$)Case "DEUTSCH": Url$ = #ProductWebSite$ + "/securedownload/Login.php?language=DE"Case "FRANCAIS": Url$ = #ProductWebSite$ + "/securedownload/Login.php?language=FR"Default: Url$ = #ProductWebSite$ + "/securedownload/Login.php?language="EndSelectCompilerElse; For demo users, show the main download pageSelect UCase(CurrentLanguage$)Case "DEUTSCH": Url$ = #ProductWebSite$ + "/german/download.php"Case "FRANCAIS": Url$ = #ProductWebSite$ + "/french/download.php"Default: Url$ = #ProductWebSite$ + "/download.php"EndSelectCompilerEndIfOpenWebBrowser(Url$)EndProcedureProcedure UpdateWindowEvents(EventID)If EventID = #PB_Event_Menu ; Little wrapper to map the shortcut events (identified as menu)EventID = #PB_Event_Gadget ; to normal gadget events...GadgetID = EventMenu()ElseGadgetID = EventGadget()EndIfSelect EventIDCase #PB_Event_CloseWindowQuit = 1Case #PB_Event_GadgetSelect GadgetIDCase #GADGET_Updates_WebsiteVisitDownloadSite()Quit = 1Case #GADGET_Updates_SettingsOpenPreferencesWindow()Quit = 1Case #GADGET_Updates_OkQuit = 1EndSelectEndSelectIf QuitIf MemorizeWindowUpdateWindowDialog\Close(@UpdateWindowPosition)ElseUpdateWindowDialog\Close()EndIfEndIfEndProcedureProcedure ReadVersionFile(FileName,ドル List Releases.Release())ClearList(Releases())Result = #FalseIf LoadXML(#XML_UpdateCheck, FileName$)If XMLStatus(#XML_UpdateCheck) = #PB_XML_Success And MainXMLNode(#XML_UpdateCheck); check the namespace*AllVersions = MainXMLNode(#XML_UpdateCheck)If ResolveXMLNodeName(*AllVersions, "/") = #UpdateCheckNamespace$ + "/versions"; examine child nodes*Version = ChildXMLNode(*AllVersions)While *VersionIf XMLNodeType(*Version) = #PB_XML_Normal And GetXMLNodeName(*Version) = "version"Select GetXMLAttribute(*Version, "category")Case "final": Category = #CATEGORY_FinalCase "bugfix": Category = #CATEGORY_BugfixCase "beta": Category = #CATEGORY_BetaDefault: Category = -1EndSelectIf Category <> -1 ; filter unknown categories (for future expandability)AddElement(Releases())Releases()\Name$ = GetXMLAttribute(*Version, "name")Releases()\Category = CategoryReleases()\Number = Int(ValD(Trim(GetXMLAttribute(*Version, "number"))) * 100)LTS$ = GetXMLAttribute(*Version, "lts")If LTS$Releases()\LTS = Val(LTS$)EndIfBeta$ = GetXMLAttribute(*Version, "beta")If Beta$ <> ""Releases()\Beta = Val(Beta$)EndIf; calculate a sort keyReleases()\SortKey = Releases()\Number * 10000 + Releases()\Category * 100 + Releases()\BetaEndIfEndIf*Version = NextXMLNode(*Version)WendResult = #TrueEndIfEndIfFreeXML(#XML_UpdateCheck)EndIf; sort to have the highest release firstSortStructuredList(Releases(), #PB_Sort_Descending, OffsetOf(Release\SortKey), #PB_Long)ProcedureReturn ResultEndProcedureProcedure UpdateCheckTimer(); test if the download is completeIf Not UpdateCheck_DownloadCompleteProcedureReturnEndIf; kill the timerRemoveWindowTimer(#WINDOW_Main, #TIMER_UpdateCheck)If Not UpdateCheck_DownloadResult; download failedIf UpdateCheck_ShowNoUpdatesMessageRequester(Language("Updates","Title"), Language("Updates","Error"))EndIfProcedureReturnEndIf; perform the update checkProtected NewList CheckedReleases.Release()Protected NewList AvailableReleases.Release(); read the file from the previous check (if any)ReadVersionFile(UpdateCheckFile,ドル CheckedReleases()); read the newly downloaded fileIf ReadVersionFile(UpdateCheckFile$ + "_new", AvailableReleases()); replace the old file with the current oneDeleteFile(UpdateCheckFile$)RenameFile(UpdateCheckFile$ + "_new", UpdateCheckFile$)ElseIf UpdateCheck_ShowNoUpdatesMessageRequester(Language("Updates","Title"), Language("Updates","Error"))EndIfDeleteFile(UpdateCheckFile$ + "_new")ProcedureReturnEndIf; get the current compiler versionTokenizeCompilerVersion(DefaultCompiler\VersionString,ドル @CurrentNumber, @CurrentBeta, @OS, @Processor)If CurrentBeta = $FFFF; a final releaseIf (CurrentNumber % 10) = 0CurrentCategory = #CATEGORY_FinalElseCurrentCategory = #CATEGORY_BugfixEndIfCurrentBeta = 0Else; a beta releaseCurrentCategory = #CATEGORY_BetaCurrentBeta >> 8 ; remove the alpha partEndIf; filter the available releases list by:; - the list of previously checked versions; - the current compiler (default one); - the preference settings;ForEach AvailableReleases()Filter = #False; check against current versionIf AvailableReleases()\Number < CurrentNumberFilter = #TrueElseIf AvailableReleases()\Number = CurrentNumber And AvailableReleases()\Category < CurrentCategoryFilter = #TrueElseIf AvailableReleases()\Number = CurrentNumber And AvailableReleases()\Category = CurrentCategory And AvailableReleases()\Beta <= CurrentBetaFilter = #TrueEndIf; check against preferencesIf UpdateCheckVersions = #UPDATE_Version_LTS And (AvailableReleases()\LTS = 0 Or AvailableReleases()\Category = #CATEGORY_Beta)Filter = #TrueElseIf UpdateCheckVersions = #UPDATE_Version_Final And AvailableReleases()\Category = #CATEGORY_BetaFilter = #TrueEndIf; check against previously seen versionsForEach CheckedReleases()If CheckedReleases()\Category = AvailableReleases()\Category AndCheckedReleases()\Number = AvailableReleases()\Number AndCheckedReleases()\Beta = AvailableReleases()\Beta AndCheckedReleases()\LTS = AvailableReleases()\LTS AndCheckedReleases()\Name$ = AvailableReleases()\Name$Filter = #TrueBreakEndIfNext CheckedReleases()If FilterDeleteElement(AvailableReleases())EndIfNext AvailableReleases(); open the dialog only if one or more releases remain!;If ListSize(AvailableReleases()) > 0UpdateWindowDialog = OpenDialog(?Dialog_Updates, WindowID(#WINDOW_Main), @UpdateWindowPosition)If UpdateWindowDialogEnsureWindowOnDesktop(#WINDOW_Updates); get the right textIf #DEMOText$ = Language("Updates", "MessageDemo")ElseIf ListSize(AvailableReleases()) = 1Text$ = Language("Updates", "MessageSingle")ElseText$ = Language("Updates", "MessageMulti")EndIfText$ + ":" + #NewLine + #NewLineForEach AvailableReleases()Text$ + AvailableReleases()\Name$ + #NewLineNext AvailableReleases()SetGadgetText(#GADGET_Updates_Message, Text$)SetGadgetColor(#GADGET_Updates_Website, #PB_Gadget_FrontColor, $F00000)SetGadgetColor(#GADGET_Updates_Settings, #PB_Gadget_FrontColor, $F00000)UpdateWindowDialog\GuiUpdate() ; needed in case the text is very bigHideWindow(#WINDOW_Updates, #False); fix required for the centereing of non-resizable windows in the dialog manager; (works only if window is visible)CompilerIf #CompileLinuxGtkIf UpdateWindowPosition\x = -1 And UpdateWindowPosition\y = -1While WindowEvent(): Wendgtk_window_set_position_(WindowID(#WINDOW_Updates), #GTK_WIN_POS_CENTER)EndIfCompilerEndIfEndIfElseIf UpdateCheck_ShowNoUpdates = #TrueIf UpdateCheckVersions = #UPDATE_Version_LTSNoUpdate$ = Language("Updates", "NoUpdatesLTS")ElseIf UpdateCheckVersions = #UPDATE_Version_AllNoUpdate$ = Language("Updates", "NoUpdatesBeta")ElseNoUpdate$ = Language("Updates", "NoUpdates")EndIfMessageRequester(Language("Updates","Title"), NoUpdate,ドル #FLAG_Info)EndIf; update the "last check" timeLastUpdateCheck = Date()EndProcedure; a thread to download the update check file in the background;Procedure UpdateCheck_Download(Dummy)CompilerIf #PB_Compiler_Thread = 0CompilerError "Need threadsafe for this routine"CompilerEndIf; debugging;UpdateCheck_DownloadResult = CopyFile("b:\versions.xml", UpdateCheckFile$ + "_new")UpdateCheck_DownloadResult = ReceiveHTTPFile(#UPDATE_CHECK_URL, UpdateCheckFile$ + "_new")UpdateCheck_DownloadComplete = #TrueEndProcedureProcedure UpdateCheck_Start(); close any existing windowIf IsWindow(#WINDOW_Updates)UpdateWindowEvents(#PB_Event_CloseWindow)EndIf; initiate a background downloadUpdateCheck_DownloadComplete = #FalseCreateThread(@UpdateCheck_Download(), 0); set a timer to read the result when download is completeAddWindowTimer(#WINDOW_Main, #TIMER_UpdateCheck, 500)EndProcedureProcedure CheckForUpdatesManual(); show a requester if no updates are foundUpdateCheck_ShowNoUpdates = #True; delete old file, so any found version is returned, even; if it was already shown in a previous checkDeleteFile(UpdateCheckFile$)UpdateCheck_Start()EndProcedureProcedure CheckForUpdatesSchedule(); When doing this check, do not show the requester if there; are no updatesUpdateCheck_ShowNoUpdates = #False; Do the check only if the configured interval elapsed;Select UpdateCheckIntervalCase #UPDATE_Interval_StartUpdateCheck_Start()Case #UPDATE_Interval_WeeklyIf Date() > LastUpdateCheck + (7 * 24 * 60 * 60)UpdateCheck_Start()EndIfCase #UPDATE_Interval_MonthlyNow = Date()If Year(Now) > Year(LastUpdateCheck) Or Month(Now) > Month(LastUpdateCheck)UpdateCheck_Start()EndIfCase #UPDATE_Interval_Never; don't checkEndSelectEndProcedure
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。