C0rey 0 Newbie Poster

Hello all,

I'm new to VB .Net, I found this open source file editor. Its can read unicode text fine, but its doesn't save unicode and its read only ITST01 and not QEST01. How to make its detect both and save as unicode?

Here is the file format.

BSTR stl_type
DWORD entry_count
:FOREACH( entry_count )
BSTR string_id
DWORD id
:ENDFOR
DWORD language_count
:FOREACH( language_count )
DWORD language_offset
:ENDFOR
:FOREACH( language_count )
// Seek to <language_offset>
:FOREACH( entry_count )
DWORD entry_offset
:ENDFOR
:ENDFOR
:FOREACH( language_count )
:FOREACH( entry_count )
// Seek to <entry_offset>
BSTR text
:IF( stl_type == “QEST01? OR stl_type == “ITST01? )
BSTR comment
:IF( stl_type == “QEST01? )
BSTR quest1
BSTR quest2
:ENDIF
:ENDIF
:ENDFOR
:ENDFOR

Here is the source:

Public Class STLeditor

    Dim filenaam As String
    Dim fn As String()
    Dim content As Byte()
    Dim content2 As Byte()
    Dim index As Long
    Dim index2 As Long
    Dim lenheader As Byte
    Dim header As String
    Dim i As Long
    Dim aantal As Long
    Dim aantal2 As Long
    Dim recordnr As Long
    Dim idstring As String()
    Dim idnr As Long()
    Dim idnaam As String(,)
    Dim idomschrijving As String(,)
    Dim idomschrijving2 As String(,)
    Dim lenstr As Long
    Dim taalblokken As Long
    Dim taaloffset As Long()
    Dim stringoffset As Long(,)
    Dim taalblok As Long
    Dim heeftomschrijving As Boolean
    Dim taalid = 1
    Dim checkcancel As Boolean
    Dim nieuwaantal As Long
    Dim copy As String
    Dim cut As String
    Dim paste As String
    ' Opslaan

    Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8

    Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
        filenaam = OpenFileDialog1.FileName
        fn = Split(filenaam, "\", -1)
        Me.Text = fn(fn.Length - 1) + " - HolodeckRose STL Editor"
    End Sub

    ' When open is clicked start this
    Private Sub OpenButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenButton.Click

        OpenFileDialog1.DefaultExt = "STL"
        OpenFileDialog1.Filter = "STL Files (*.STL)|*.STL|All files|*.*"
        OpenFileDialog1.ReadOnlyChecked = False
        OpenFileDialog1.Title = "Select a file to open"
        OpenFileDialog1.FileName = " "

        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            leeggrid()
            leesfile()
            uitkleden()
            gridvullen()
            vulTextBoxen()
        End If
    End Sub

    ' When exit is clicked shut down the application
    Private Sub ExitButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitButton.Click
        Me.Close()
    End Sub

    ' When save button is clicked start saving
    Private Sub SaveToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

    End Sub

    ' Fill in the record count
    Private Sub vulTextBoxen()
        statusrecordnr.Text = "Record Count: " + recordnr.ToString
    End Sub

    ' Empties the grid
    Private Sub leeggrid()
        grid1.SelectAll()
        grid1.Rows.Clear()
        'For i = 0 To grid1.SelectedRows.Count
        '    grid1.SelectedRows(i).Cells.Clear()
        'Next i
    End Sub

    ' Read the file
    Private Sub leesfile()
        Try
            content = My.Computer.FileSystem.ReadAllBytes(filenaam)
        Catch

        End Try
    End Sub

    Private Sub uitkleden()
        index = 0
        lenheader = leesbyte()
        header = leesstring(lenheader)
        heeftomschrijving = header = "ITST01"
        aantal = leeslong() - 1
        Dim lenstr As Integer
        ReDim idstring(aantal)
        ReDim idnr(aantal)
        For recordnr = 0 To aantal
            lenstr = leeslengte()
            idstring(recordnr) = leesstring(lenstr)
            idnr(recordnr) = leeslong()
        Next recordnr
        taalblokken = leeslong()
        ReDim taaloffset(taalblokken)
        For taalblok = 0 To taalblokken - 1
            taaloffset(taalblok) = leeslong()
        Next taalblok
        ReDim stringoffset(taalblokken, aantal)
        ReDim idnaam(taalblokken, aantal)
        ReDim idomschrijving(taalblokken, aantal)
        For taalblok = 0 To taalblokken - 1
            'index = taaloffset(taalblok)
            For recordnr = 0 To aantal
                stringoffset(taalblok, recordnr) = leeslong()
            Next recordnr
            For recordnr = 0 To aantal
                index = stringoffset(taalblok, recordnr)
                Dim lennaam = leeslengte()
                idnaam(taalblok, recordnr) = leesstring(lennaam)
                If heeftomschrijving Then
                    Dim lenomschrijving = leeslengte()
                    'If lenomschrijving > 127 Then
                    '    Dim extra = leesbyte()
                    '    lenomschrijving = lenomschrijving - 128
                    '    lenomschrijving = lenomschrijving + extra * 128
                    '    'If extra <> 1 Then
                    '    '    MsgBox("Description is longer than expected (255)" + lenomschrijving.ToString + " " + extra.ToString, MsgBoxStyle.Exclamation)
                    '    '    'debuglabel.Text = debuglabel.Text + Convert.ToString(extra) + " "
                    '    'End If
                    'End If
                    idomschrijving(taalblok, recordnr) = leesstring(lenomschrijving)
                End If
            Next recordnr
        Next taalblok
    End Sub

    Private Sub gridvullen()
        Dim regel As Object()
        For recordnr = 0 To aantal
            ReDim regel(11)
            regel(0) = idstring(recordnr)
            regel(1) = idnr(recordnr)
            regel(2) = idnaam(taalid, recordnr)
            regel(3) = ""
            If heeftomschrijving Then regel(3) = idomschrijving(taalid, recordnr)
            regel(4) = idnaam(0, recordnr)
            regel(5) = idnaam(2, recordnr)
            regel(6) = idnaam(3, recordnr)
            regel(7) = idnaam(4, recordnr)
            regel(8) = ""
            regel(9) = ""
            regel(10) = ""
            regel(11) = ""
            If heeftomschrijving Then regel(8) = idomschrijving(0, recordnr)
            If heeftomschrijving Then regel(9) = idomschrijving(2, recordnr)
            If heeftomschrijving Then regel(10) = idomschrijving(3, recordnr)
            If heeftomschrijving Then regel(11) = idomschrijving(4, recordnr)
            grid1.Rows.Add(regel)
        Next recordnr
    End Sub
    Private Function leesstring(ByVal aantal As Long) As String
        REM read everything including string length to read
        Dim buffer As String
        buffer = ""
        For i = 0 To aantal - 1
            buffer = buffer + Chr(content(index + i))
        Next
        index = index + aantal
        Return buffer
    End Function
    Private Function leeslengte() As Integer
        Dim lenstring As Integer
        lenstring = leesbyte()
        If lenstring > 127 Then
            Dim extra = leesbyte()
            lenstring = lenstring - 128
            lenstring = lenstring + extra * 128
        End If
        Return lenstring
    End Function
    Private Function leesbyte() As Byte
        index = index + 1
        Return content(index - 1)
    End Function
    Private Function leeslong() As Long
        Dim b1 = leesbyte()
        Dim b2 = leesbyte()
        Dim b3 = leesbyte()
        Dim b4 = leesbyte()
        Return b1 + (256 * (b2 + (256 * (b3 + 256 * b4))))
    End Function

    Private Sub AboutToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AboutToolStripMenuItem1.Click
        MsgBox("Made by The Holodec Team", MsgBoxStyle.OkOnly, "About")
    End Sub

    ' Select the entire grid
    Private Sub SelectAllToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        grid1.SelectAll()
    End Sub

    Private Sub SaveasButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveasButton.Click

        SaveFileDialog1.DefaultExt = "STL"
        SaveFileDialog1.Filter = "STL Files (*.STL)|*.STL|All files|*.*"
        SaveFileDialog1.Title = "Select a file to open"
        filenaam = OpenFileDialog1.FileName
        fn = Split(filenaam, "\", -1)
        SaveFileDialog1.FileName = fn(fn.Length - 1)

        If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            leesgrid()
            aankleden()
            schrijffile(SaveFileDialog1.FileName)
        End If

    End Sub

    Private Sub leesgrid()
        Dim regel As Object()
        aantal2 = grid1.Rows.Count - 1
        Dim j As Integer
        ReDim regel(11)
        ReDim idstring(aantal2)
        ReDim idnr(aantal2)
        ReDim taaloffset(taalblokken)
        ReDim idnaam(taalblokken, aantal2)
        ReDim idomschrijving2(taalblokken, aantal2)
        Dim celcontent
        For recordnr = 0 To aantal2 - 1
            For j = 0 To grid1.ColumnCount - 1
                ' grid1.Rows(recordnr).Cells(j).ValueType)
                celcontent = grid1.Rows(recordnr).Cells(j).Value
                If celcontent = Nothing Then celcontent = ""
                regel(j) = celcontent.ToString()
            Next j
            ' grid1.Rows(recordnr).Cells(j).ValueType)
            idstring(recordnr) = regel(0)
            idnr(recordnr) = Convert.ToInt64(regel(1))
            idnaam(taalid, recordnr) = regel(2)
            If heeftomschrijving Then idomschrijving2(taalid, recordnr) = regel(3)
            idnaam(0, recordnr) = regel(4)
            idnaam(2, recordnr) = regel(5)
            idnaam(3, recordnr) = regel(6)
            idnaam(4, recordnr) = regel(7)
            If heeftomschrijving Then idomschrijving2(0, recordnr) = regel(8)
            If heeftomschrijving Then idomschrijving2(2, recordnr) = regel(9)
            If heeftomschrijving Then idomschrijving2(3, recordnr) = regel(10)
            If heeftomschrijving Then idomschrijving2(4, recordnr) = regel(11)
        Next recordnr
    End Sub
    Private Sub aankleden()
        index2 = 0
        ReDim content2(content.Length * 2)
        'Header "ITST01" / "nogwat"
        'schrijfbyte(lenheader) ' -> blijft hetzelfde
        schrijfstring(header)
        ' heeftomschrijving = header = "ITST01"
        schrijflong(aantal2)
        For recordnr = 0 To aantal2 -1
            schrijfstring(idstring(recordnr))
            schrijflong(idnr(recordnr))
        Next recordnr
        schrijflong(taalblokken)
        'later opnieuw vullen
        Dim taalblokindex2 = index2
        For taalblok = 0 To taalblokken - 1
            schrijflong(0)
        Next taalblok
        ReDim stringoffset(taalblokken, aantal2)
        For taalblok = 0 To taalblokken - 1
            taaloffset(taalblok) = index2
            For recordnr = 0 To aantal2 - 1
                schrijflong(0)
            Next recordnr
            For recordnr = 0 To aantal2 - 1
                stringoffset(taalblok, recordnr) = index2
                schrijfstring(idnaam(taalblok, recordnr))
                If heeftomschrijving Then
                    schrijfstring(idomschrijving2(taalblok, recordnr))
                    'If Len(idomschrijving(taalblok, recordnr)) <> Len(idomschrijving2(taalblok, recordnr)) Then
                    'debuglabel.Text = debuglabel.Text + Convert.ToString(taalblok * 100000 + recordnr) + ":" + Convert.ToString(Len(idomschrijving(taalblok, recordnr))) + "<>" + Convert.ToString(Len(idomschrijving2(taalblok, recordnr))) + " "
                    'End If
                End If
            Next recordnr
        Next taalblok
        REM taalblokoffset nog vullen
        Dim saveindex2 = index2
        index2 = taalblokindex2
        For taalblok = 0 To taalblokken - 1
            schrijflong(taaloffset(taalblok))
        Next taalblok
        REM stringoffset nog invullen
        For taalblok = 0 To taalblokken - 1
            index2 = taaloffset(taalblok)
            For recordnr = 0 To aantal2 - 1
                schrijflong(stringoffset(taalblok, recordnr))
            Next recordnr
        Next taalblok
        index2 = saveindex2

    End Sub
    Private Sub schrijfstring(ByVal opslaanstring As String)
        Dim aantalbytes As Integer
        aantalbytes = Len(opslaanstring)
        If aantalbytes > 127 Then
            Dim aantalbyteslow
            Dim aantalbyteshigh = Math.DivRem(aantalbytes, 128, aantalbyteslow)
            schrijfbyte(aantalbyteslow + 128)
            schrijfbyte(aantalbyteshigh)
        Else
            schrijfbyte(aantalbytes)
        End If
        For i = 0 To aantalbytes - 1
            content2(index2 + i) = Asc(Mid(opslaanstring, i + 1))
        Next
        index2 = index2 + aantalbytes
    End Sub
    Private Function schrijflengte(ByVal lenstring) As Integer
        lenstring = leesbyte()
        If lenstring > 127 Then
            Dim extra = leesbyte()
            lenstring = lenstring - 128
            lenstring = lenstring + extra * 128
        End If
        Return lenstring
    End Function
    Private Sub schrijfbyte(ByVal opslaanbyte As Byte)
        content2(index2) = opslaanbyte
        index2 = index2 + 1
    End Sub
    Private Sub schrijflong(ByVal opslaanlong As Long)

        Dim b1 As Long
        opslaanlong = Math.DivRem(opslaanlong, 256, b1)
        Dim b2 As Long
        opslaanlong = Math.DivRem(opslaanlong, 256, b2)
        Dim b3 As Long
        opslaanlong = Math.DivRem(opslaanlong, 256, b3)
        Dim b4 As Long
        opslaanlong = Math.DivRem(opslaanlong, 256, b4)

        schrijfbyte(b1)
        schrijfbyte(b2)
        schrijfbyte(b3)
        schrijfbyte(b4)

    End Sub
    Private Sub schrijffile(ByVal filenaam2 As String)
        Dim content3 As Byte()
        ReDim content3(index2 - 1)
        For i = 0 To index2 - 1
            content3(i) = content2(i)
        Next i
        My.Computer.FileSystem.WriteAllBytes(filenaam2, content3,False)
    End Sub

    Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveButton.Click

        Dim save As String
        fn = Split(filenaam, "\", -1)
        save = fn(fn.Length - 1)
        leesgrid()
        aankleden()
        schrijffile(save)

    End Sub

    Private Sub searchButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles searchButton.Click

        Dim j As Integer
        Dim a As Integer
        Dim gevonden As Boolean
        gevonden = False
        Dim regel As Object()

        ' For a = 0 To recordnr - 1
        'For j = 0 To grid1.ColumnCount - 1
        ' grid1.Rows(recordnr).Cells(j).ValueType)
        'regel(j) = grid1.Rows(a).Cells(j).Value.ToString()
        ' If searchtext.Text = grid1.Rows(a).Cells(j).Value.ToString Then
        'MsgBox("hoi", MsgBoxStyle.Critical, "hoi")
        'gevonden = True
        'Exit For
        'End If
        'Next j
        'If gevonden = True Then
        'Exit For
        'End If
        ' Next a
        'MsgBox(searchtext.Text + " is found on record: " + b, MsgBoxStyle.OkOnly, "Search")
        'gevonden = True

    End Sub

    Private Sub CopyToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopyToolStripMenuItem.Click


        If grid1.CurrentCell.Value = Nothing Then
        Else
            copy = grid1.CurrentCell.Value
        End If

    End Sub

    Private Sub PasteToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PasteToolStripMenuItem.Click

        Dim selected As String

        If cut = Nothing Then
        Else
            grid1.CurrentCell.Value = cut
            cut = Nothing
            Exit Sub
        End If

        If copy = Nothing Then
        Else
            grid1.CurrentCell.Value = copy
        End If



    End Sub

    Private Sub CutToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CutToolStripMenuItem.Click

        If grid1.CurrentCell.Value = Nothing Then
        Else
            cut = grid1.CurrentCell.Value
            grid1.CurrentCell.Value = ""
            copy = Nothing
        End If

    End Sub
End Class