'
' libreria  : VBlib
' file      : ComCNOsaiVB6 
'
' funzioni  : connessione con CN OSAI come classe - override metodi per vecchie versioni WinNbi
'
' copyright 2008-2016 C.Viviani
'
Imports Microsoft.Win32

Public Class ComCNOSAIVB6

    Inherits ComCNOsai

    Public Sub New(ByRef szRemoteName As String, ByRef b_debug As Boolean)

        MyBase.New(szRemoteName, b_debug)

    End Sub

    Public Overrides Function OpenSession() As Boolean

        Dim nReturn As Short

        'mi connetto al server Cndex
        nReturn = ConnectServer_C("", mErrClass, mErrNum)

        If nReturn = ERRORE_OSAI Then
            Connected = False
            ErrMsg = "Error on ConnectServer_C" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
        Else
            'apro una sessione col CN
            Connected = True
            nReturn = OpenSession_C(NomeCn, SessionOpened, mErrClass, mErrNum)

            If nReturn = ERRORE_OSAI Then
                Connected = False
                ErrMsg = "Error on OpenSession_C" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
            End If
        End If

        Return Connected

    End Function

    Public Overrides Function CloseSession() As Boolean
        Dim nReturn As Short
        Dim bOk As Boolean

        bOk = True

        'chiudo la sessione
        nReturn = CloseSession_C(SessionOpened, mErrClass, mErrNum)
        If nReturn = ERRORE_OSAI Then
            ErrMsg = "Error on CloseSession_C" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
            Connected = False
            bOk = False
        Else
            Connected = False
        End If

        'rilascio il server Cndex
        nReturn = ReleaseServer_C(mErrClass, mErrNum)
        If nReturn = ERRORE_OSAI Then
            ErrMsg = "Error on ReleaseServer_C" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
            Connected = False
            bOk = False
        Else
            Connected = False
        End If

        Return bOk

    End Function

    '------------------------------
    ' Lettura variabile Short su Cn
    '------------------------------
    Public Overrides Function ReadShortVar(ByVal szVar As stVAR, Optional ByVal nProcess As Integer = 1) As Short

        Dim nValues As Short
        Dim pVar As PLVARDESC
        Dim nComOk As Short                 ' Se 1 lettura OK Se 0 lettura KO
        Dim nNumVarToBeReaded As Integer = 1  ' Numero di variabili da leggere (fisso a 1)

        pVar.Code = CndexLinkUserVB6.GW_CODE
        pVar.Index = szVar.nAddress

        ' se macchina collegata e non in debug
        If (Not (Debug)) Then

            nComOk = GetPLVarWord_C(SessionOpened, nNumVarToBeReaded, pVar, nValues, ErrClass, ErrNum)

            If (nComOk = ERRORE_OSAI) Then

                ErrMsg = "Error on GetPLVarWord_C" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
                Return CShort(ERRORVALUE)     ' In uscita setto variabile a ERRORVALUE errore 

            Else

                ' return con il valore letto
                Return nValues

            End If


        Else  ' gestione se debug

            ' ritorno true
            Return 1

        End If

   End Function

   '--------------------------------
   ' Lettura multi variabile MW su Cn
   '--------------------------------
   Public Overrides Function ReadMultipleVarMW(ByVal nAddress As Integer, ByRef nValues() As Short, ByVal nNumVarToRead As Short, Optional ByVal nProcess As Integer = 1) As Boolean

      Dim pVar As PLVARDESC
      Dim nComOk As Short                 ' Se 1 lettura OK Se 0 lettura KO

      pVar.Code = CndexLinkUserVB6.MW_CODE
      pVar.Index = nAddress

      ' se macchina collegata e non in debug
      If (Not (Debug)) Then

         nComOk = GetPLVarWord_M_C(SessionOpened, nNumVarToRead, pVar, nValues, ErrClass, ErrNum)

         If (nComOk = ERRORE_OSAI) Then

            ErrMsg = "Error on GetPLVarWord_M_C" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
            Return False
            
         Else

            ' return con il valore letto
            Return True

         End If


      Else  ' gestione se debug

         ' ritorno true
         Return True

      End If
   
   End Function

   ' -------------------------------
   ' Scrittura variabile Short su Cn
   '---------------------------------
    Public Overrides Function WriteShortVar(ByVal szVar As stVAR, ByVal nValue As Short, Optional ByVal nProcess As Integer = 1) As Boolean

        Dim pVar As PLVARDESC
        Dim nComOk As Short                   ' Se 1 scritt. OK Se 0 lettura KO
        Dim nNumVarToBeWrited As Integer = 1  ' Numero di variabili da leggere (fisso a 1)

        If (Not (Debug)) Then        ' Se macchina collegata

            pVar.Bit = szVar.nBit
            pVar.Code = CndexLinkUserVB6.GW_CODE
            pVar.Index = szVar.nAddress
            nComOk = SetPLVarWord_C(SessionOpened, nNumVarToBeWrited, pVar, nValue, ErrClass, ErrNum)

            If (nComOk = ERRORE_OSAI) Then

                ErrMsg = "Error on SetPLVarWord_C" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
                Return False

            Else

                Return True

            End If

        Else    ' gestione in debug

            Return True

        End If


    End Function

    '--------------------------------
    ' Lettura variabile SC su Cn
    '--------------------------------
    Public Overrides Function ReadSCVar(ByVal nIndex As Integer, ByVal nNumChar As Integer, Optional ByVal nProcess As Integer = 1) As String

        Dim szValue As String = "                                                                                                    "
        Dim nComOk As Short                   ' Se 1 lettura OK Se 0 lettura KO

        ' se macchina collegata e non in debug
        If (Not (Debug)) Then

            nComOk = GetVarSC_C(SessionOpened, nProcess, nIndex, nNumChar, szValue, ErrClass, ErrNum)

            If (nComOk = ERRORE_OSAI) Then
                ErrMsg = "Error on reading SC variable" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
                Return ""     ' In uscita setto variabile a ERRORVALUE errore 
            Else
                ' return con il valore letto
                Return szValue
            End If


        Else  ' gestione se debug

            ' ritorno true
            Return "SC VAR - DEBUG"

        End If


    End Function

    ' ---------------------------------
    ' Scrittura variabile SC su Cn
    '----------------------------------
    Public Overrides Function WriteSCVar(ByVal nIndex As Integer, ByVal nNumChar As Integer, ByVal szText As String, Optional ByVal nProcess As Integer = 1) As Boolean

        Dim nComOk As Short                   ' Se 1 scrittura OK Se 0 scrittura KO

        ' se macchina collegata e non in debug
        If (Not (Debug)) Then

            nComOk = SetVarSC_C(SessionOpened, nProcess, nIndex, nNumChar, szText, ErrClass, ErrNum)

            If (nComOk = ERRORE_OSAI) Then

                ErrMsg = "Error on writing SC variable" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
                Return False      ' In uscita setto variabile a ERRORVALUE errore 

            Else

                Return True

            End If

            ' se sono in debug
        Else

            Return True

        End If                                  ' Endif gestione macchina collegata

    End Function

   '------------------------------
   ' Lettura variabile E su Cn
   '------------------------------
   Public Overrides Function ReadVarE(ByVal szVar As stVAR, Optional ByVal nProcess As Integer = 1) As Double

      Dim dValues As Double
      Dim pVar As PLVARDESC
      Dim nComOk As Short                 ' Se 1 lettura OK Se 0 lettura KO
      Dim nNumVarToBeReaded As Integer = 1  ' Numero di variabili da leggere (fisso a 1)

      pVar.Code = CndexLinkUserVB6.GW_CODE
      pVar.Index = szVar.nAddress

      ' se macchina collegata e non in debug
      If (Not (Debug)) Then

         nComOk = GetVarE_C(SessionOpened, nProcess, szVar.nAddress, nNumVarToBeReaded, dValues, ErrClass, ErrNum)

         If (nComOk = ERRORE_OSAI) Then

            ErrMsg = "Error on GetVarE_C" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
            Return CShort(ERRORVALUE)     ' In uscita setto variabile a ERRORVALUE errore 

         Else

            ' return con il valore letto
            Return dValues

         End If


      Else  ' gestione se debug

         ' ritorno true
         Return 1

      End If

   End Function


    '------------------------------
    ' Lettura process stato info Cn
    '------------------------------
    '
    ' ha causato molto dispiacere il fatto che se uso la Server.GetProcessStatus_C con winnbi < 3.1.1
    ' dà una UNRESOLVED a run time della GetProcessStatus_C8 ( notare l' "8" finale ) nella CNDEXLINK.DLL
    '
    ' soluzione : con Win Nbi recenti, uso Server.GetProcessStatus_C ; con Winnbi vecchi, faccio override
    ' di questa funzione USANDO LA STRUTTURA NUOVA CndexLinkDotNet.Cndex.PROCDATA ( altrimenti non è possibile
    ' fare override; uso una variabile locale tipo vecchio ( PROCDATA ) e in caso di esito positivo, 
    ' copio i dati risultanti.
    '
    ' Attenzione : si ha lo stesso problema anche con la Server.GetNcInfo1_C ma curiosamente non con le funzioni
    ' di lettura scrittura variabili CN .... boh !!

    Public Overrides Function NcProcessStatus(ByRef ncInfo As CndexLinkDotNet.Cndex.PROCDATA, Optional ByVal nProcess As Integer = 1) As Boolean

        Dim nComOk As Short                 ' Se 1 lettura OK Se 0 lettura KO
        Dim geppodata As PROCDATA           ' trucco sporchissimo : la versione dotnet richiede un altro tipo di dati... 

        ' se macchina collegata e non in debug
        If (Not (Debug)) Then

            nComOk = GetProcessStatus_C(SessionOpened, nProcess, geppodata, ErrClass, ErrNum)

            If (nComOk = ERRORE_OSAI) Then

                ErrMsg = "Error on GetProcessStatus_C" & vbCrLf & "Class: " & Str(ErrClass) & "  Number: 0x" & Hex(ErrNum)
                Return False      ' In uscita setto variabile a ERRORVALUE errore 

            Else
                ncInfo.Status = geppodata.status
                ncInfo.SubStatus = geppodata.substatus

                Return True

            End If

            ' se sono in debug
        Else

            Return True

        End If                                  ' Endif gestione macchina collegata

    End Function

   ' -------------------------------------------------
   ' Lettura stato macchina su processo passato per parametro
   '--------------------------------------------------
   Public Overrides Function GetMachineStatus(Optional ByVal nProcess As Integer = 1) As Byte
      '
      ' se non andasse, usare NcProcessStatus e prendere solo lo stato......

      Dim RetVal As Short

      Dim geppodata As PROCDATA           ' trucco sporchissimo : la versione dotnet richiede un altro tipo di dati... 

      ' se macchina collegata e non in debug
      If (Not (Debug)) Then

         RetVal = GetProcessStatus_C(SessionOpened, nProcess, geppodata, ErrClass, ErrNum)

         If RetVal > 0 Then
            Return Convert.ToByte(geppodata.status)

         Else
            ErrMsg = "Error on GetMachineStatus" & vbCrLf & what_happened()
            Return 255

         End If
         ' se sono in debug
      Else
         Return True
      End If


   End Function



End Class

