-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfut_work.bas
More file actions
254 lines (254 loc) · 10.1 KB
/
fut_work.bas
File metadata and controls
254 lines (254 loc) · 10.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
Rem This file is part of the 'File Update Tool' program.
Rem Copyright (C) 2025 Ihar S. Areshchankau
Rem
Rem This program is free software: you can redistribute it and/or modify
Rem it under the terms of the GNU General Public License as published by
Rem the Free Software Foundation, either version 3 of the License, or
Rem (at your option) any later version.
Rem
Rem This program is distributed in the hope that it will be useful,
Rem but WITHOUT ANY WARRANTY; without even the implied warranty of
Rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Rem GNU General Public License for more details.
Rem
Rem You should have received a copy of the GNU General Public License
Rem along with this program. If not, see <https://www.gnu.org/licenses/>.
Rem
Rem ===================================================
Rem Ìîäóëü, ðåàëèçóþùèé îñíîâíóþ ôóíêöèþ ïðîãðàììû FUT.
Rem ßçûê ïðîãðàììèðîâàíèÿ: FreeBASIC.
Rem ===================================================
#include once "file.bi"
#include once "fut_work.bai"
#include once "fut_gui.bai"
#include once "fut_stte.bai"
#include once "fut_file.bai"
#include once "fut_jrnl.bai"
#include once "fut_text.bai"
#include once "fut_lang.bai"
#include once "fut_http.bai"
Dim Shared Description As String
Dim Shared ErrorDetails As String
Rem ============================================
Rem Ïå÷àòü ñîîáùåíèÿ ïåðåä âûïîëíåíèåì äåéñòâèÿ.
Rem Âûçîâ: s - òåêñò ñîîáùåíèÿ.
Rem ============================================
Private Sub workInformBefore (ByRef s As Const String)
Description = s
guiPrintLn s, 0
End Sub
Rem ==================================================
Rem Ïå÷àòü ñîîáùåíèÿ î ðåçóëüòàòå âûïîëíåíèÿ äåéñòâèÿ.
Rem Âûçîâ: r - ðåçóëüòàò âûïîëíåíèÿ äåéñòâèÿ:
Rem -1 - óñïåøíî, 0 - íåóäà÷íî.
Rem ==================================================
Private Sub workInformAfter (ByVal r As Integer)
guiPrintLn Iif (r, langStr (13), langStr (14)), -1
jrnlWrite jrnlMsgOperation (Description, r)
End Sub
Rem ==============================
Rem Ïå÷àòü ñîîáùåíèÿ ïðÿìî ñåé÷àñ.
Rem Âûçîâ: s - òåêñò ñîîáùåíèÿ.
Rem ==============================
Private Sub workInformJustNow (ByRef s As Const String)
guiPrintLn s, -1
jrnlWrite s
End Sub
Rem =================================================
Rem Ïîëó÷åíèå ôàéëà ñ îáíîâëåíèåì èç ýòàëîííîé ïàïêè.
Rem Âûçîâ: SrcFolder - ïóòü ê ýòàëîííîé ïàïêå,
Rem TgtFolder - ïóòü ê öåëåâîé ïàïêå,
Rem FileName - èìÿ ôàéëà ñ îáíîâëåíèåì.
Rem Âîçâðàò: -1 - ôàéë ñ îáíîâëåíèåì ïîëó÷åí,
Rem 0 - îøèáêà ïîëó÷åíèÿ ôàéëà.
Rem =================================================
Private Function RetrieveUpdate (ByRef SrcFolder As Const String, ByRef TgtFolder As String, ByRef FileName As Const String) As Integer
Dim res As Integer, FFN1 As String, FFN2 As String, p As Integer
FFN2 = TgtFolder + "\" + FileName
If "HTTP://" <> UCase (Left (SrcFolder, 7)) Then
Rem Ýòàëîííàÿ ïàïêà íàõîäèòñÿ â ôàéëîâîé ñèñòåìå.
FFN1 = SrcFolder + "\" + FileName
workInformBefore textSubstitute (langStr (16), FFN1 + "^" + FFN2)
res = 0 = FileCopy (FFN1, FFN2)
workInformAfter res
Else
Rem Ýòàëîííàÿ ïàïêà íàõîäèòñÿ íà âåá-ñåðâåðå.
FFN1 = SrcFolder + Iif ("/" = Right (SrcFolder, 1), FileName, "/" + FileName)
p = InStr (8, FFN1, "/")
workInformBefore textSubstitute (langStr (16), FFN1 + "^" + FFN2)
Rem Èìÿ èñõîäíîãî ôàéëà íà ñåðâåðå: Mid (FFN1, p)
res = httpDownloadFile (Mid (FFN1, p), FFN2)
workInformAfter res
End If
RetrieveUpdate = res
End Function
Rem ========================================================
Rem Óñòàíîâêà îáíîâëåíèÿ.
Rem Âûçîâ: FullUpdFileName - ïîëíîå èìÿ ôàéëà ñ îáíîâëåíèåì,
Rem TempFolder - ïóòü ê ïàïêå äëÿ âðåìåííûõ ôàéëîâ,
Rem TargetFolder - ïóòü ê öåëåâîé ïàïêå,
Rem UnpackCmd - êîìàíäà ðàñïàêîâêè.
Rem Âîçâðàò: -1 - îáíîâëåíèå óñïåøíî óñòàíîâëåíî,
Rem 0 - îøèáêà óñòàíîâêè îáíîâëåíèÿ.
Rem ========================================================
Private Function InstallUpdate (ByRef FullUpdFileName As Const String, ByRef TempFolder As Const String, _
ByRef TargetFolder As Const String, ByRef UnpackProgram As Const String, _
ByRef UnpackArguments As Const String) As Integer
Dim TempFolderName As String, CurDirSave As String, _
p As Integer, res As Integer, secres As Integer
Rem Ñîçäàíèå âðåìåííîé ïàïêè.
TempFolderName = TempFolder + "\" + fileBaseNameOnly (FullUpdFileName) + ".tmp"
res = 0 = MkDir (TempFolderName)
If 0 = res Then
Rem Ïðîèçîøëà îøèáêà ñîçäàíèÿ âðåìåííîé ïàïêè.
ErrorDetails = textSubstitute (langStr(21), TempFolderName)
Else
Rem Ðàñïàêîâêà îáíîâëåíèÿ âî âðåìåííóþ ïàïêó.
CurDirSave = CurDir
ChDir TempFolderName
Rem - workInformBefore UnpackProgram + " " + UnpackArguments
res = 0 = Iif ("" <> UnpackArguments, _
Exec (UnpackProgram, UnpackArguments + " " + FullUpdFileName), _
Exec (UnpackProgram, FullUpdFileName))
Rem - workInformAfter res
ChDir CurDirSave
If 0 = res Then
Rem Ïðîèçîøëà îøèáêà ðàñïàêîâêè.
ErrorDetails = langStr (22)
End If
If -1 = res Then
Rem Ïðîâåðêà ñîîòâåòñòâèÿ óñëîâèÿì çàùèòû öåëåâîé ïàïêè.
res = fileTargetFolderGuard (TempFolderName)
If 0 = res Then
Rem Îáíàðóæåíî íàðóøåíèå çàùèòû öåëåâîé ïàïêè
ErrorDetails = langStr (23)
End If
End If
If -1 = res Then
Rem Êîïèðîâàíèå ôàéëîâ èç âðåìåííîé ïàïêè â öåëåâóþ.
Rem - workInformBefore "Copy contents: " + TempFolderName + " -> " + TargetFolder
res = fileCopyFolderContents (TempFolderName, TargetFolder)
Rem -workInformAfter res
If 0 = res Then
Rem Ïðîèçîøëà îøèáêà êîïèðîâàíèÿ ôàéëîâ.
ErrorDetails = langStr (24)
End If
End If
Rem Óäàëåíèå âðåìåííîé ïàïêè ñî âñåì å¸ ñîäåðæèìûì.
Rem - workInformBefore "Delete folder: " + TempFolderName
secres = fileKillFolder (TempFolderName)
Rem - workInformAfter secres
Rem Ôèêñàöèÿ îøèáêè óäàëåíèÿ âðåìåííîé ïàïêè.
if -1 <> secres Then
ErrorDetails = langStr (25)
res = 0
End If
End If
InstallUpdate = res
End Function
Rem =====================================================
Rem Ïðîöåäóðà ñ ðåàëèçàöèåé îñíîâíîé ôóíêöèè ïðîãðàììû,
Rem ïðåäíàçíà÷åííàÿ äëÿ ðàáîòû â îòäåëüíîì ïîòîêå.
Rem Âûçîâ: UserData - óêàçàòåëü íà äîïîëíèòåëüíûå äàííûå.
Rem =====================================================
Public Sub workThread (ByVal UserData As Any Ptr)
Dim PWTD As workThreadData Pointer = UserData, n As Integer, _
lb1 As Integer, ub1 As Integer, lb2 As Integer, ub2 As Integer, _
i As Integer, j As Integer, FileName As String, _
FFN1 As String, FFN2 As String, res As Integer, secres As Integer
n = UBound (PWTD->UpdToRemove) - LBound (PWTD->UpdToRemove) + 1 + _
UBound (PWTD->UpdToRetrieve) - LBound (PWTD->UpdToRetrieve) + 1 + _
UBound (PWTD->UpdToInstall) - LBound (PWTD->UpdToInstall) + 1
res = -1
Rem ---------------------------------------------------
Rem Îæèäàíèå ãîòîâíîñòè ïîòîêà èíòåðôåéñà ïîëüçîâàòåëÿ.
Rem ---------------------------------------------------
guiWaitForReady
Rem -----------------------------
Rem Óäàëåíèå íåíóæíûõ îáíîâëåíèé.
Rem -----------------------------
lb1 = LBound (PWTD->UpdToRemove)
ub1 = UBound (PWTD->UpdToRemove)
i = lb1
While -1 = res AndAlso i <= ub1
FileName = PWTD->UpdToRemove(i)
FFN1 = PWTD->CacheFolder + "\" + FileName
workInformBefore textSubstitute (langStr (15), FFN1)
res = 0 = Kill (FFN1)
workInformAfter res
Rem Îøèáêà óäàëåíèÿ ñòàðûõ îáíîâëåíèé íå ÿâëÿåòñÿ êðèòè÷åñêîé,
Rem íî îøèáêà óäàëåíèÿ áóäóùèõ îáíîâëåíèé, êîòîðûõ íåò â èñòî÷íèêå,
Rem ÿâëÿåòñÿ êðèòè÷åñêîé. Ïîýòîìó ñ÷èòàåì ëþáóþ îøèáêó óäàëåíèÿ
Rem êðèòè÷åñêîé.
i += 1
Wend
Rem ---------------------
Rem Óñòàíîâêà îáíîâëåíèé.
Rem ---------------------
lb1 = LBound (PWTD->UpdToInstall)
ub1 = UBound (PWTD->UpdToInstall)
lb2 = LBound (PWTD->UpdToRetrieve)
ub2 = UBound (PWTD->UpdToRetrieve)
i = lb1
j = lb2
While -1 = res AndAlso i <= ub1
FileName = PWTD->UpdToInstall(i)
Rem Íàäî ëè ïîëó÷àòü îáíîâëåíèå?
If j <= ub2 AndAlso FileName = PWTD->UpdToRetrieve(j) Then
res = RetrieveUpdate (PWTD->SourceFolder, PWTD->CacheFolder, FileName)
j += 1
End If
Rem Óñòàíîâêà îáíîâëåíèÿ.
If -1 = res Then
FFN1 = PWTD->CacheFolder + "\" + FileName
workInformBefore textSubstitute (langStr (17), FFN1)
res = InstallUpdate (FFN1, PWTD->TempFolder, PWTD->TargetFolder, PWTD->UnpackProgram, PWTD->UnpackArguments)
workInformAfter res
If -1 = res Then
Rem Ôèêñèðîâàíèå íîâîãî ñîñòîÿíèÿ ñèñòåìû.
Rem Ýòî, ïîæàëóé, ñàìàÿ âàæíàÿ îïåðàöèÿ.
res = stteSetValue ("LastUpdateFileName", FileName)
If 0 = res Then
workInformJustNow langStr (18)
End If
Rem Óäàëåíèå ôàéëà óñòàíîâëåííîãî îáíîâëåíèÿ.
Rem Ýòà îïåðàöèÿ íå ÿâëÿåòñÿ êðèòè÷íîé.
workInformBefore textSubstitute (langStr(15), FFN1)
secres = 0 = Kill (FFN1)
workInformAfter secres
Else
Rem Äåòàëèçàöèÿ ïðè÷èíû îøèáêè îáíîâëåíèÿ, åñëè òàêîâàÿ èìååòñÿ.
If "" <> ErrorDetails Then
workInformJustNow "!!! " + ErrorDetails
End If
Rem  ñëó÷àå íåóäà÷è óñòàíîâêè îáíîâëåíèÿ ôàéë íå óäàëÿåòñÿ,
Rem ÷òîáû ìîæíî áûëî ðàññëåäîâàòü ïðè÷èíó: íå â í¸ì ëè äåëî?
End If
i += 1
End If
Wend
Rem ---------------------------------------------
Rem Ïîëó÷åíèå îáíîâëåíèé äëÿ óñòàíîâêè â áóäóùåì.
Rem ---------------------------------------------
While -1 = res AndAlso j <= ub2
FileName = PWTD->UpdToRetrieve(j)
res = RetrieveUpdate (PWTD->SourceFolder, PWTD->CacheFolder, FileName)
j += 1
Wend
Rem ----------------------------------------------------
Rem Çàâåðøåíèå ðàáîòû ñ æóðíàëîì, ïîêà ðàáîòà ïðèëîæåíèÿ
Rem íå çàáëîêèðîâàíà îæèäàíèåì ðåàêöèè ïîëüçîâàòåëÿ.
Rem ----------------------------------------------------
guiPrintLn langStr (19) + Iif (-1 = res, langStr (13), langStr (14)), -1
jrnlFooter res
If 0 = jrnlClose Then
Dim emsg As String
emsg = "+-+-+ " + langStr (28) + " +-+-+"
guiPrintLn emsg, -1
End If
Rem ----------------------------------------
Rem Ñîîáùåíèå î ðåçóëüòàòå âûïîëíåíèÿ çàäà÷.
Rem ----------------------------------------
guiNotifyWorkDone
PWTD->BadResult = -1 <> res
End Sub