'/**
'<font color="green">
'<br> Function CheckNewVersion_Continue
'<br> Description: Функция проверки необходимости перезагрузки клиента после релиза
'<br>
'<br> RESULT description:
'<br> @return
'<br> False - если продолжение операции недопустимо (требуется перезагрузка клиента); также пользователю выводится диалог и MsgBox
'<br>
'<br> ЛОГИКА РАБОТЫ:
'<br> Получение из БД настроек данных о последнем релизе (время релиза, список обновленных баз)
'<br> Поиск в notes.ini переменной $NEW_VERSION.
'<br> ЕСЛИ найдена И время запуска клиента Lotus > времени последнего релиза ТО
'<br> заменить значение переменной $CUR_VERSION значением переменной $NEW_VERSION;
'<br> удалить $NEW_VERSION.
'<br> ИНАЧЕ
'<br> ЕСЛИ время релиза > переменной $CUR_VERSION ТО
'<br> ЕСЛИ текущая БД есть в списке обновленных БД ТО
'<br> Получить значения полей "информация о нововведениях" и "требуется перезагрузка".
'<br> ЕСЛИ нет переменной $NEW_VERSION И поле "информация о нововведениях" не пустое ТО
'<br> Отобразить диалог с информацией о нововведениях
'<br> ЕСЛИ "требуется перезагрузка" ТО
'<br> Время релиза поместить в переменную $NEW_VERSION;
'<br> ИНАЧЕ
'<br> Время релиза поместить в переменную $CUR_VERSION;
'<br> Очистить переменную $NEW_VERSION;
'</font>
'*/
Public Function CheckNewVersion_Continue() As Boolean
On Error GoTo ErrH
CheckNewVersion_Continue = True
Const CURVER = "CUR_VERSION"
Const NEWVER = "NEW_VERSION"
Const VIEW_RELEASES = "Releases"
Dim ns As New NotesSession
'============================= Получение времени запуска Notes-клиента
Dim sStartTime As String, dUpTime As NotesDateTime
sStartTime = ns.GetEnvironmentString("NotesStartTime", False)
If IsDate(sStartTime) Then
Set dUpTime = New NotesDateTime(sStartTime)
Else
Set dUpTime = New NotesDateTime(Now)
Dim nUpTimeSeconds As Long
nUpTimeSeconds = getUptimeSeconds()
Dim nMinutes As Long
Dim nHours As Long
Dim nDays As Long
'ВАЖНО использование Fix, т.к. Mod округляет операнды
nMinutes = Fix(nUpTimeSeconds / 60) Mod 60
Call dUpTime.AdjustMinute(-nMinutes)
nHours = Fix(nUpTimeSeconds / 3600) Mod 24
Call dUpTime.AdjustHour(-nHours)
nDays = Fix(nUpTimeSeconds / 86400) Mod 30
Call dUpTime.AdjustDay(-nDays)
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] UpTime: ", CStr(nUpTimeSeconds)
End If
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] Start time: ", dUpTime.LocalTime
'============================= Получение $CUR_VERSION time
Dim dCurVerTime As NotesDateTime
Set dCurVerTime = dtCommonGet(ns.GetEnvironmentString(CURVER, False))
If dCurVerTime Is Nothing Then
Set dCurVerTime = dUpTime
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] CURVER flag NOT found. Use client's uptime"
End If
'============================= Получение времени последнего релиза
Dim ndbConf As NotesDatabase
'Set ndbConf = ...
Dim nvSett As NotesView
Set nvSett = ndbConf.GetView(VIEW_RELEASES)
Call nvSett.Refresh()
Dim oNVE As NotesViewEntry
Set oNVE = nvSett.GetEntryByKey(ns.CurrentDatabase.FileName, False)
If Not oNVE Is Nothing Then
Dim dLastRelease As NotesDateTime
Set dLastRelease = dtCommonGet(CStr(oNVE.ColumnValues(2)))
'========================= Поиск в notes.ini переменной $NEW_VERSION
Dim bNewVerPresent As Boolean
'переменная нужна для определения, перезагрузился ли Notes по требованию или нет
Dim dNewVerTime As NotesDateTime
Set dNewVerTime = dtCommonGet(ns.GetEnvironmentString(NEWVER, False))
bNewVerPresent = (Not dNewVerTime Is Nothing)
If bNewVerPresent Then
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] NEWVER flag found"
End If
If dUpTime.TimeDifference(dLastRelease) > 0 Then
'Если время запуска клиента Lotus > времени последнего релиза
If Not bNewVerPresent Then
'этот кусок выполняется чаще всего
If dCurVerTime.TimeDifference(dLastRelease) <> 0 Then
'если стартовал клиента с утра, а релиз был вчера вечером, то перезагрузка также ненужна
Call dtCommonSetVar(CURVER, dLastRelease)
End If
Else
Call dtCommonSetVar(CURVER, dNewVerTime)
Call setEnvironmentVar(NEWVER, "", False)
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] NEWVER is present AND client was rebooted - update local flags"
End If
Else
'Если время запуска клиента Lotus <= времени последнего релиза
If dLastRelease.TimeDifference(dCurVerTime) > 0 Then
'Если время релиза > переменной $CUR_VERSION
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] Update available (" + dLastRelease.Dateonly + " " + dLastRelease.Timeonly + ")"
'Получаем документ со служебными флагами релиза
Dim ndSett As NotesDocument
Set ndSett = oNVE.Document
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] Updated DBs: ", Join(ndSett.vDBsList, ", ")
'Если текущая БД есть в списке обновленных БД
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] " + ns.CurrentDatabase.FilePath + " database was updated"
If Not bNewVerPresent And ndSett.whatsNewPresent(0) = "1" Then
'Если нет переменной $NEW_VERSION И поле "информация о нововведениях" не пустое
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] Show what's new dialog"
'Отобразить диалог с информацией о нововведениях
ndSett.subject = "Обновление в ЭДБ от " + dLastRelease.DateOnly + " " + StrLeftBack(dLastRelease.TimeOnly, ":")
Dim wrk As New NotesUIWorkspace
Call wrk.Dialogbox("Release", True, True, True, True, True, True, "Новое обновление ЭДБ", ndSett, True, False, False)
End If
If ndSett.getItemValue("bNeedClientReboot")(0) = "1" Then
'Если "требуется перезагрузка"
Call dtCommonSetVar(NEWVER, dLastRelease)
CheckNewVersion_Continue = False
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] NEED to REBOOT"
MsgBox "Обнаружено обновление СЭД." + Chr(13) + Chr(13) + "Для корректной работы в Lotus Вам необходимо ЗАКРЫТЬ ВСЕ ВКЛАДКИ и перезагрузить его.", 48, "Проверка обновлений..."
Else
Call dtCommonSetVar(CURVER, dLastRelease)
Call setEnvironmentVar(NEWVER, "", False)
If DEBUG_MODE = 1 Then Print "[CheckNewVersion_Continue] Update local flags"
End If
End If
End If
End If
Quit:
Exit Function
ErrH:
Dim sErrText As String
sErrText = GetThreadInfo(1) & " (" & Erl & ") -> " & Error$ + " {" & Err & "}"
Print "ОШИБКА при проверке обновлений: " + sErrText
Resume Quit
End Function