This commit is contained in:
SchreiberM
2017-02-02 17:13:17 +01:00
parent 6c1d38e67f
commit 20da19c9b0
31 changed files with 6850 additions and 4819 deletions

View File

@@ -6,7 +6,7 @@ Public Class ClassInit
End Sub
Public Sub InitLogger()
ClassLogger.Init("", "VersionChecker")
ClassLogger.Init("", "")
clsLogger.LOGFILE_PATH = ClassLogger.logDateiname
End Sub
@@ -24,31 +24,40 @@ Public Class ClassInit
End If
Catch ex As Exception
MsgBox("Unexpected Error in Init Database:" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
ClassLogger.Add("Unexpected Error in InitDatabase: " & ex.Message, True)
Return False
End Try
End Function
Public Sub InitBasics()
Try
InitAddons()
Dim sql = String.Format("SELECT * FROM TBPMO_KONFIGURATION WHERE GUID = 1")
Dim UPDATE_ID As Integer
InitInstallPath()
Dim sql = String.Format("SELECT * FROM TBDD_MODULES WHERE UPPER(NAME) = ('Record-Organizer')")
Dim KONFIG_DT As DataTable = clsDatabase.Return_Datatable(sql, False)
If KONFIG_DT.Rows.Count = 1 Then
Try
MyServer_UpdatePath = KONFIG_DT.Rows(0).Item("UPDATE_PATH")
VERSION_SERVER = KONFIG_DT.Rows(0).Item("VERSION_CLIENT")
Catch ex As Exception
End Try
MyServer_UpdatePath = KONFIG_DT.Rows(0).Item("VERSION_UPATE_PATH")
End If
sql = String.Format("SELECT * FROM TBDD_VERSION_UPDATE WHERE GUID = (SELECT MAX(GUID) FROM TBDD_VERSION_UPDATE WHERE UPPER(MODULE_NAME) = UPPER('{0}'))", "Record-Organizer")
Dim DT_UPDATE As DataTable = clsDatabase.Return_Datatable(sql, False)
If Not IsNothing(DT_UPDATE) Then
If DT_UPDATE.Rows.Count = 1 Then
UPDATE_ID = DT_UPDATE.Rows(0).Item("GUID")
VERSION_SERVER = DT_UPDATE.Rows(0).Item("VERSION_NO")
FORCE_UPDATE = DT_UPDATE.Rows(0).Item("FORCE_UPD")
VERSIONS_FOR_FORCE_UPDATE = DT_UPDATE.Rows(0).Item("VERSION_FORCE_UPD")
sql = String.Format("SELECT * FROM TBDD_VERSION_ITEMS WHERE UPDATE_ID = {0} ORDER BY GUID", UPDATE_ID)
DT_UPDATE_ITEMS = clsDatabase.Return_Datatable(sql)
End If
End If
Catch ex As Exception
MsgBox("Unexpected Error in InitBasics:" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
ClassLogger.Add("Unexpected Error in InitBasics: " & ex.Message, True)
End Try
End Sub
Public Shared Function InitUserLogin(Optional _User As String = "")
Public Shared Function InitUser(Optional _User As String = "")
Try
Dim sql = ""
USER_USERNAME = Environment.UserName
@@ -63,63 +72,55 @@ Public Class ClassInit
Return False
Else
USER_GUID = USER_DT.Rows(0).Item("GUID")
sql = String.Format("SELECT UPDATE_PATH FROM TBPMO_USER_UPDATE_PATH WHERE USER_ID = {0}", USER_GUID)
USER_LANGUAGE = USER_DT.Rows(0).Item("LANGUAGE")
sql = String.Format("SELECT UPDATE_PATH FROM TBDD_VERSION_USER_UPDATE_PATH WHERE USER_ID = {0} AND UPPER(MODULE_NAME) = UPPER('{1}')", USER_GUID, "Record-Organizer")
Dim USER_UPDATE_PATH = clsDatabase.Execute_Scalar(sql)
If Not IsNothing(USER_UPDATE_PATH) Then
If USER_UPDATE_PATH <> String.Empty Then
MyServer_UpdatePath = USER_UPDATE_PATH
End If
End If
sql = String.Format("SELECT CASE VERSION_CLIENT WHEN '' THEN '1.0.0.0' ELSE VERSION_CLIENT END AS VERSION_CLIENT FROM VWDD_LOGIN_USER_HISTORY WHERE GUID = (select MAX(GUID) from VWDD_LOGIN_USER_HISTORY where USER_ID = {0} AND VERSION_CLIENT <> '')", USER_GUID)
sql = String.Format("SELECT CASE VERSION_CLIENT WHEN '' THEN '1.0.0.0' ELSE VERSION_CLIENT END AS VERSION_CLIENT FROM VWDD_LOGIN_USER_HISTORY WHERE GUID = (select MAX(GUID) from VWDD_LOGIN_USER_HISTORY where USER_ID = {0} AND VERSION_CLIENT <> '' AND UPPER(MACHINE_NAME) = UPPER('{1}') AND UPPER(MODULE) = UPPER('{2}'))", USER_GUID, Environment.MachineName, "Record-Organizer")
VERSION_USER = clsDatabase.Execute_Scalar(sql)
If IsNothing(VERSION_USER) Then
sql = String.Format("SELECT CASE VERSION_CLIENT WHEN '' THEN '1.0.0.0' ELSE VERSION_CLIENT END AS VERSION_CLIENT FROM VWDD_LOGIN_USER_HISTORY WHERE GUID = (select MAX(GUID) from VWDD_LOGIN_USER_HISTORY where USER_ID = {0} AND VERSION_CLIENT <> '' AND UPPER(MODULE) = UPPER('{1}'))", USER_GUID, "Record-Organizer")
VERSION_USER = clsDatabase.Execute_Scalar(sql)
If IsNothing(VERSION_USER) Then
VERSION_USER = "1.0.0.0"
End If
End If
Return True
End If
Catch ex As Exception
ClassLogger.Add("Unexpected Error in InitUserLogin: " & ex.Message, True)
MsgBox("Unexpected Error in InitUserLogin: " & ex.Message, MsgBoxStyle.Critical)
ClassLogger.Add("Unexpected Error in InitUser_Update_Spec: " & ex.Message, True)
Return False
End Try
End Function
Public Sub InitAddons()
Public Sub InitInstallPath()
Try
Dim CurrentDir As String = My.Application.Info.DirectoryPath
' Dim Sql As String = "SELECT PATH_ADDONS from TBPMO_KONFIGURATION WHERE GUID = 1"
Dim AddonPath As String = MY_ADDON_PATH ' ClassDatabase.Execute_Scalar(Sql)
Dim Dev_AddonPath As String = System.IO.Path.GetFullPath(System.IO.Path.Combine(CurrentDir, "..\..\..\..\app"))
If AddonPath Is Nothing OrElse AddonPath = "" Then
' Addon Pfad in der Datenbank ist leer
Dim path = System.IO.Path.Combine(CurrentDir, "Addons")
Dim AddonDir As New DirectoryInfo(path)
If AddonDir.Exists Then
AddonPath = path
Else
AddonPath = Dev_AddonPath
End If
Dim readValue = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\Digital Data\Record Organizer", "Path", Nothing)
If Not IsNothing(readValue) Then
MY_INSTALL_PATH = readValue
Else
' Addon Pfad steht in der Datenbank
Dim path = AddonPath
Dim AddonDir As New DirectoryInfo(path)
If (AddonDir.Exists) Then
If AddonDir.Name = "Addons" Then
AddonPath = path
Else
AddonPath = Dev_AddonPath
End If
Else
AddonPath = Dev_AddonPath
End If
MY_INSTALL_PATH = readValue = ""
End If
MY_ADDON_PATH = AddonPath
Catch ex As Exception
MsgBox("Unexpected Error in InitAddons:" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
ClassLogger.Add("Unexpected Error in InitInstallPath: " & ex.Message, True)
End Try
End Sub
Public Shared Function InsertEssential_Log(REFERENCE_KEY As Integer, REFERENCE_STRING As String, COMMENT As String)
Try
Dim insert = String.Format("INSERT INTO TBPMO_LOG_ESSENTIALS (REFERENCE_KEY,REFERENCE_STRING,COMMENT,ADDED_WHO) VALUES ({0},'{1}','{2}','{3}')", REFERENCE_KEY, REFERENCE_STRING, COMMENT, USER_USERNAME)
Return clsDatabase.Execute_non_Query(insert, False)
Catch ex As Exception
ClassLogger.Add("Unexpected Error in InsertEssential_Log: " & ex.Message, True)
Return False
End Try
End Function
End Class

View File

@@ -1,4 +1,5 @@
Imports System.IO
Imports DD_LIB_Standards
Public Class ClassLogger
Public Shared DateiSpeicherort As String = Nothing
Public Shared DateiPrefix As String = ""
@@ -39,13 +40,12 @@ Public Class ClassLogger
' legt den Speicherort fest
Public Shared Sub SetSpeicherort(ByVal speicherort As String)
Dim f As String = Application.UserAppDataPath() & "\Log"
Dim f As New IO.DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Digital Data\RecordOrganizer-VersionCheck\Log"))
If speicherort = "" Then
If IO.Directory.Exists(f) = False Then
IO.Directory.CreateDirectory(f)
If IO.Directory.Exists(f.ToString) = False Then
IO.Directory.CreateDirectory(f.ToString)
End If
ClassLogger.DateiSpeicherort = f
ClassLogger.DateiSpeicherort = f.ToString
Else
ClassLogger.DateiSpeicherort = speicherort
End If
@@ -61,7 +61,9 @@ Public Class ClassLogger
If ClassLogger.OpenFile Then
Try
If ACHTUNG Then
ClassLogger.StreamWriter.WriteLine("#ATTENTION# (" & System.DateTime.Now & "): " & information)
ClassLogger.StreamWriter.WriteLine("#ERROR# (" & System.DateTime.Now & "): " & information)
ERROR_WHILE_UPDATING = True
Else
ClassLogger.StreamWriter.WriteLine(information)
End If

View File

@@ -8,14 +8,19 @@ Module ModuleMySettings
Public DTEXCLUDE_FILES As DataTable
Public USER_USERNAME As String = ""
Public USER_GUID As Integer
Public USER_LANGUAGE As String = "de-DE"
Public MyConnectionString As String = ""
Public MyServer_UpdatePath As String = ""
Public VERSION_SERVER As String = ""
Public VERSION_USER As String = "1.0.0.0"
Public VERSION_SERVER
Public VERSION_USER
Public FORCE_UPDATE As Boolean = False
Public VERSIONS_FOR_FORCE_UPDATE As String = ""
Public FOLDER_TEMP As String
Public LogErrorsOnly As Boolean = True
Public MY_ADDON_PATH As String
Public MY_INSTALL_PATH As String
Public DT_UPDATE_ITEMS As DataTable
Public ERROR_WHILE_UPDATING As Boolean = False
Public Function LoadFileExclusion()
Dim rowresult As String = ""
@@ -143,38 +148,4 @@ Module ModuleMySettings
End Try
End Function
Private Function CreateConfigTable() As DataTable
Try
' Create sample Customers table, in order
' to demonstrate the behavior of the DataTableReader.
Dim table As New DataTable
table.TableName = "MyConfig"
' Create two columns, ID and Name.
Dim idColumn As DataColumn = table.Columns.Add("ID", _
GetType(System.Int32))
idColumn.AutoIncrement = True
idColumn.AutoIncrementSeed = 0
idColumn.AutoIncrementStep = 1
table.Columns.Add("ConfigName", GetType(System.String))
table.Columns.Add("Value", GetType(System.String))
'Set the ID column as the primary key column.
table.PrimaryKey = New DataColumn() {idColumn}
Dim newRow As DataRow = table.NewRow()
newRow("ConfigName") = "MyConnectionString"
newRow("Value") = ""
table.Rows.Add(newRow)
Dim newRow1 As DataRow = table.NewRow()
newRow1("ConfigName") = "LogErrorsOnly"
newRow1("Value") = "True"
table.Rows.Add(newRow1)
table.AcceptChanges()
Return table
Catch ex As Exception
MsgBox("Error in CreateConfigTable" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
Return Nothing
End Try
End Function
End Module

View File

@@ -50,11 +50,6 @@
<Reference Include="DD_LIB_Standards">
<HintPath>..\..\..\DDLibStandards\DD_LIB_Standards\bin\Debug\DD_LIB_Standards.dll</HintPath>
</Reference>
<Reference Include="DevExpress.Data.v15.2, Version=15.2.9.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.Printing.v15.2.Core, Version=15.2.9.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.Sparkline.v15.2.Core, Version=15.2.9.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.Utils.v15.2, Version=15.2.9.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.XtraEditors.v15.2, Version=15.2.9.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Data" />

View File

@@ -25,17 +25,20 @@ Partial Class frmVersionCheck
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmVersionCheck))
Me.lblStatus = New System.Windows.Forms.Label()
Me.pbStatus = New System.Windows.Forms.ProgressBar()
Me.Label1 = New System.Windows.Forms.Label()
Me.PictureBox2 = New System.Windows.Forms.PictureBox()
CType(Me.PictureBox2, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'lblStatus
'
Me.lblStatus.AutoSize = True
Me.lblStatus.BackColor = System.Drawing.SystemColors.Control
Me.lblStatus.Font = New System.Drawing.Font("Segoe UI", 9.0!)
Me.lblStatus.Font = New System.Drawing.Font("Segoe UI", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lblStatus.ForeColor = System.Drawing.SystemColors.Info
Me.lblStatus.ImeMode = System.Windows.Forms.ImeMode.NoControl
Me.lblStatus.Location = New System.Drawing.Point(-1, 19)
Me.lblStatus.Location = New System.Drawing.Point(213, 94)
Me.lblStatus.Name = "lblStatus"
Me.lblStatus.Size = New System.Drawing.Size(163, 15)
Me.lblStatus.Size = New System.Drawing.Size(173, 15)
Me.lblStatus.TabIndex = 3
Me.lblStatus.Text = "Checking for newer version...."
Me.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
@@ -43,30 +46,62 @@ Partial Class frmVersionCheck
'pbStatus
'
Me.pbStatus.ImeMode = System.Windows.Forms.ImeMode.NoControl
Me.pbStatus.Location = New System.Drawing.Point(2, 37)
Me.pbStatus.Location = New System.Drawing.Point(216, 112)
Me.pbStatus.Name = "pbStatus"
Me.pbStatus.Size = New System.Drawing.Size(546, 23)
Me.pbStatus.Size = New System.Drawing.Size(320, 23)
Me.pbStatus.TabIndex = 2
'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Font = New System.Drawing.Font("Segoe UI", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label1.ForeColor = System.Drawing.SystemColors.Info
Me.Label1.ImeMode = System.Windows.Forms.ImeMode.NoControl
Me.Label1.Location = New System.Drawing.Point(23, 12)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(208, 21)
Me.Label1.TabIndex = 6
Me.Label1.Text = "Checking for new updates"
Me.Label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'PictureBox2
'
Me.PictureBox2.Image = CType(resources.GetObject("PictureBox2.Image"), System.Drawing.Image)
Me.PictureBox2.ImeMode = System.Windows.Forms.ImeMode.NoControl
Me.PictureBox2.Location = New System.Drawing.Point(27, 36)
Me.PictureBox2.Name = "PictureBox2"
Me.PictureBox2.Size = New System.Drawing.Size(183, 185)
Me.PictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom
Me.PictureBox2.TabIndex = 5
Me.PictureBox2.TabStop = False
'
'frmVersionCheck
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(551, 92)
Me.BackColor = System.Drawing.Color.DodgerBlue
Me.ClientSize = New System.Drawing.Size(551, 229)
Me.ControlBox = False
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.PictureBox2)
Me.Controls.Add(Me.lblStatus)
Me.Controls.Add(Me.pbStatus)
Me.Font = New System.Drawing.Font("Tahoma", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "frmVersionCheck"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "Checking for newer version of ADDI"
CType(Me.PictureBox2, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents lblStatus As System.Windows.Forms.Label
Friend WithEvents pbStatus As System.Windows.Forms.ProgressBar
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents PictureBox2 As System.Windows.Forms.PictureBox
End Class

View File

@@ -118,6 +118,321 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="PictureBox2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
RU5ErkJggg==
</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAIAEBAQAAEABAAoAQAAJgAAABAQAAABAAgAaAUAAE4BAAAoAAAAEAAAACAAAAABAAQAAAAAAIAA

View File

@@ -1,10 +1,13 @@
Imports System.ComponentModel
Imports System.IO
Imports DD_LIB_Standards
Public Class frmVersionCheck
Private InitSteps As Integer = 6
Private bw As New BackgroundWorker()
Private mainForm As Form
Private UPDATE_NECESSARY As Boolean = False
Private UPDATE_CANCELLED As Boolean = False
Private Sub InitProgram()
bw.WorkerReportsProgress = True
AddHandler bw.DoWork, AddressOf bw_DoWork
@@ -20,6 +23,7 @@ Public Class frmVersionCheck
Return _step * (100 / InitSteps)
End Function
Private Sub bw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
Dim JUMP_UPDATE As Boolean = False
'Try
Dim Init = New ClassInit()
bw.ReportProgress(CalcProgress(1), "Initializing Logger")
@@ -35,12 +39,34 @@ Public Class frmVersionCheck
Init.InitBasics()
System.Threading.Thread.Sleep(200)
bw.ReportProgress(CalcProgress(4), "Initializing User-Configuration")
If ClassInit.InitUserLogin = False Then
If ClassInit.InitUser = False Then
Exit Sub
Else
VERSION_USER = CInt(VERSION_USER.ToString.Replace(".", ""))
VERSION_SERVER = CInt(VERSION_SERVER.ToString.Replace(".", ""))
If VERSION_USER = VERSION_SERVER Then
Exit Sub
End If
UPDATE_NECESSARY = True
If FORCE_UPDATE = False Then
If VERSIONS_FOR_FORCE_UPDATE.Contains(VERSION_USER) Then
ClassInit.InsertEssential_Log(USER_GUID, "USER-ID", String.Format("VersionChecker: ForceUpdate for User as Version '{0}' is used!", VERSION_USER))
FORCE_UPDATE = True
End If
End If
If FORCE_UPDATE = False Then
Dim msg = "Auf dem Server liegt ein Update für ADDI bereit!" & vbNewLine & "Wollen Sie das Update nun durchführen? Die Dauer ist abhängig von Ihrer Netzwerkverbindung!"
If USER_LANGUAGE <> "de-DE" Then
msg = "There is a new release available for ADDI!" & vbNewLine & "Would You like to install the update now? This might take some minutes!"
End If
Dim result As MsgBoxResult
result = MessageBox.Show(msg, "Confirmation:", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If result = MsgBoxResult.No Then
UPDATE_CANCELLED = True
Exit Sub
End If
End If
If MyServer_UpdatePath <> String.Empty Then
If Directory.Exists(MyServer_UpdatePath) Then
GetTempFolderGuid()
@@ -51,33 +77,29 @@ Public Class frmVersionCheck
' Get a reference to each file in that directory.
Dim fiArr As FileInfo() = di.GetFiles()
' Display the names of the files.
Dim fri As FileInfo
'Dim fri As FileInfo
Dim error_while_copying = False
For Each fri In fiArr
For Each Upd_item As DataRow In DT_UPDATE_ITEMS.Rows
If error_while_copying = True Then
Exit For
End If
Dim no_work = False
For Each row As DataRow In DTEXCLUDE_FILES.Rows
Dim content As String = row.Item(0).ToString.ToLower
If fri.Name.Contains(content) Then
no_work = True
End If
Next
If no_work = False Then 'Copy the file to tempFolder
Dim updatefile2copy = Path.Combine(MyServer_UpdatePath, Upd_item.Item("ITEM_INFO"))
Dim tempfilename = Path.Combine(FOLDER_TEMP, Upd_item.Item("ITEM_INFO"))
If File.Exists(updatefile2copy) Then
Try
System.IO.File.Copy(fri.FullName, Path.Combine(FOLDER_TEMP, fri.Name))
System.IO.File.Copy(updatefile2copy, tempfilename)
Catch ex As Exception
ClassLogger.Add(String.Format("Error while copying file {0} to {1}: " & ex.Message, fri.FullName, Path.Combine(FOLDER_TEMP, fri.Name)))
ClassLogger.Add(String.Format("Error while copying file {0} to {1}: " & ex.Message, updatefile2copy, tempfilename))
error_while_copying = True
End Try
If error_while_copying = False Then
End If
Else
ClassLogger.Add(String.Format("UpdateFile {0} is not existing or accessible", updatefile2copy))
End If
Console.WriteLine(fri.Name)
Next fri
Replace_Files()
Next
If error_while_copying = False Then
Replace_Files()
End If
Try
'Delete the tempfolder and all data
@@ -85,20 +107,19 @@ Public Class frmVersionCheck
Catch ex As Exception
End Try
Else
ClassLogger.Add(String.Format("The temporaryFolder could not be created!"))
End If
Else
ClassLogger.Add(String.Format("The Updatepath '{0}'is not accessible or does not exist", MyServer_UpdatePath))
End If
Else
ClassLogger.Add(String.Format("NO ACTION: the Updatepath is empty"))
End If
End If
System.Threading.Thread.Sleep(200)
bw.ReportProgress(CalcProgress(6), "Initializing Frontend")
' InitInterface wurde in frmMain integriert
'Init.InitInterface(mainForm)
System.Threading.Thread.Sleep(200)
Start_RO()
Else
ClassLogger.Add(String.Format(">> Database was not intialized!"), False)
End If
'Catch ex As Exception
' MsgBox("Unexpected Error in Init Classes: " & vbNewLine & ex.Message, MsgBoxStyle.Critical)
@@ -106,35 +127,129 @@ Public Class frmVersionCheck
End Sub
Sub Replace_Files()
Try
Dim ProductionPath As String = System.IO.Path.Combine(MY_ADDON_PATH, "Record Organizer")
Dim DevelPath As String = System.IO.Path.Combine(MY_ADDON_PATH, "DD-Record-Organiser\bin\Debug")
Dim COPY_FROM_PATH As String
If Directory.Exists(ProductionPath) Then
COPY_FROM_PATH = ProductionPath
Else
COPY_FROM_PATH = DevelPath
End If
'Jede Datei im tempfolder wird replaced
Dim di As New DirectoryInfo(FOLDER_TEMP)
' Get a reference to each file in that directory.
Dim fiArr As FileInfo() = di.GetFiles()
' Display the names of the files.
' Dim fri As FileInfo
Dim error_while_replacing = False
For Each Upd_item As DataRow In DT_UPDATE_ITEMS.Rows
Dim BackUpOfFileToReplace As String = MY_INSTALL_PATH & "\" & Upd_item.Item("ITEM_INFO") & ".bac"
Dim sourcefile = Path.Combine(FOLDER_TEMP, Upd_item.Item("ITEM_INFO"))
Dim targetfile = Path.Combine(MY_INSTALL_PATH, Upd_item.Item("ITEM_INFO"))
Try
' Replace the file.
If File.Exists(targetfile) Then
If File_Rename(targetfile, BackUpOfFileToReplace) = True Then
If MoveFile(sourcefile, targetfile) = True Then
File_Delete(BackUpOfFileToReplace)
Else
'Verschieben hat nicht geklappt also die Backupdatei wieder umbenennen!
File_Rename(BackUpOfFileToReplace, targetfile)
End If
End If
Else
MoveFile(sourcefile, targetfile)
End If
Catch ex As Exception
ClassLogger.Add(String.Format("Error while copying file {0} to {1}: " & ex.Message, sourcefile, targetfile))
error_while_replacing = True
End Try
Next
'For Each fri In fiArr
' If error_while_replacing = True Then
' Exit For
' End If
' Dim no_work = False
' For Each row As DataRow In DTEXCLUDE_FILES.Rows
' Dim content As String = row.Item(0).ToString.ToLower
' If fri.Name.Contains(content) Then
' no_work = True
' End If
' Next
' If no_work = False Then 'Copy the file to tempFolder
' Try
' Dim BackUpOfFileToReplace As String = REPLACE_RO_PATH & "\" & fri.Name & ".bac"
' ' Replace the file.
' Dim sourcefile = fri.FullName
' Dim targetfile = REPLACE_RO_PATH & "\" & fri.Name
' If File.Exists(targetfile) Then
' If File_Rename(targetfile, BackUpOfFileToReplace) = True Then
' If MoveFile(sourcefile, targetfile) = True Then
' File.Delete(BackUpOfFileToReplace)
' Else
' File_Rename(BackUpOfFileToReplace, targetfile)
' End If
' End If
' Else
' MoveFile(sourcefile, targetfile)
' End If
' Catch ex As Exception
' ClassLogger.Add(String.Format("Error while copying file {0} to {1}: " & ex.Message, fri.FullName, Path.Combine(FOLDER_TEMP, fri.Name)))
' error_while_replacing = True
' End Try
' End If
' Console.WriteLine(fri.Name)
'Next fri
Catch ex As Exception
MsgBox("Unexpected Error in Replace_Files: " & vbNewLine & ex.Message, MsgBoxStyle.Critical)
ClassLogger.Add(String.Format("Unexpected Error in Replace_Files: {0}", ex.Message))
End Try
End Sub
Sub Start_RO()
Private Shared Function File_Rename(targetfile As String, BackUpOfFileToReplace As String)
Try
Dim ProductionPath As String = System.IO.Path.Combine(MY_ADDON_PATH, "Record Organizer", "DD-Record-Organiser.exe")
Dim DevelPath As String = System.IO.Path.Combine(MY_ADDON_PATH, "DD-Record-Organiser\bin\Debug", "DD-Record-Organiser.exe")
If File.Exists(BackUpOfFileToReplace) Then
If File_Delete(BackUpOfFileToReplace) = False Then
Return False
End If
End If
Rename(targetfile, BackUpOfFileToReplace)
Return True
Catch ex As Exception
ClassLogger.Add(String.Format("Unexpected Error in File_Rename: " & vbNewLine & "targetfile '{0}'" & vbNewLine & "BackUpOfFileToReplace '{1}'" & vbNewLine & "ERROR: {2}", targetfile, BackUpOfFileToReplace, ex.Message))
Return False
End Try
End Function
Private Shared Function File_Delete(deletefile As String)
Try
File.Delete(deletefile)
Return True
Catch ex As Exception
ClassLogger.Add(String.Format("Unexpected Error in File_Delete: " & vbNewLine & "deletefile '{0}'" & vbNewLine & "ERROR: {2}", deletefile, ex.Message))
Return False
End Try
End Function
Private Shared Function MoveFile(sourcefile As String, targetfile As String)
Try
File.Move(sourcefile, targetfile)
Return True
Catch ex As Exception
ClassLogger.Add(String.Format("Unexpected Error in MoveFile: sourcefile '{0}', targetfile '{1}' - ERROR: {2}", sourcefile, targetfile, ex.Message))
Return False
End Try
End Function
Sub Start_RO()
Dim filename = ""
Try
Dim PMO_PATH = System.IO.Path.Combine(MY_INSTALL_PATH, "DD-Record-Organizer.exe")
Dim startInfo As New ProcessStartInfo()
startInfo.Arguments = """" & MyConnectionString & """"
filename = startInfo.FileName
If System.IO.File.Exists(ProductionPath) Then
startInfo.FileName = ProductionPath
If System.IO.File.Exists(PMO_PATH) Then
startInfo.FileName = PMO_PATH
Process.Start(startInfo)
Else
startInfo.FileName = DevelPath
MsgBox("Can not find ADDI-Executable in '" & filename & "'! Please inform your systemadmin.", MsgBoxStyle.Critical)
End If
Process.Start(startInfo)
Catch ex As Exception
MsgBox("Could not find Right manager: " & ex.Message, MsgBoxStyle.Critical)
ClassLogger.Add("Could not find RecordOrganizer: " & filename & " - " & ex.Message)
End Try
End Sub
@@ -149,8 +264,37 @@ Public Class frmVersionCheck
ClassLogger.Add(String.Format("Error while Creating tempfolder: " & ex.Message))
End Try
End Function
Private Sub frmVersionCheck_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
If ERROR_WHILE_UPDATING = True Then
Dim msg = String.Format("Während des Updatevorgangs für Version '{0}' haben sich unerwartet Fehler ereignet!" & vbNewLine & "Wollen Sie die Logdatei anzeigen?", VERSION_SERVER)
If USER_LANGUAGE <> "de-DE" Then
msg = String.Format("During update of version '{0}' unexpected errors occured!" & vbNewLine & "Would You like to show the logfile?", VERSION_SERVER)
End If
ClassInit.InsertEssential_Log(USER_GUID, "USER-ID", String.Format("Unexpected errors occured during client-update update of version '{0}'!", VERSION_SERVER))
Dim result As MsgBoxResult
result = MessageBox.Show(msg, "Confirmation:", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If result = MsgBoxResult.Yes Then
Process.Start(ClassLogger.DateiSpeicherort)
End If
Else
If UPDATE_NECESSARY = True Then
If UPDATE_CANCELLED = True Then
If clsDatabase.DB_DEFAULT_INITIALIZED = True Then
ClassInit.InsertEssential_Log(USER_GUID, "USER-ID", String.Format("The ClientUpdate {0} is necessary but user cancelled update-process!", VERSION_SERVER))
End If
Else
If clsDatabase.DB_DEFAULT_INITIALIZED = True Then
ClassInit.InsertEssential_Log(USER_GUID, "USER-ID", String.Format("The ClientUpdate {0} was completed without errors!", VERSION_SERVER))
End If
End If
End If
End If
Start_RO()
End Sub
Private Sub frmVersionCheck_Load(sender As Object, e As EventArgs) Handles Me.Load
InitProgram()
End Sub