'*************************************************************************
'
'      Author       : Esben Laursen (hyber@hyber.dk)
'      
'      Webpage      : http://www.hyber.dk or http://netsmsgw.sf.net
'
'      Notes        :
'
'      License      : This program is free software; you can redistribute
'                     it and/or modify it under the terms of the GNU
'                     General Public License as published by the Free
'                     Software Foundation version 2 of the License.
'
'*************************************************************************

Imports System.IO.Ports

Public Class frmNetSMS
    Dim mDeamon As netSMSgw.netSMSgwd.netSMSgwd
    Dim mServiceCtl As New System.ServiceProcess.ServiceController("Network SMS Gateway")
    Dim mbolServiceFound As Boolean = False
    Dim mcolSMTPHosts As New netSMSgw.netSMSgwd.xmlCollection
    Dim mcolHttpUsers As New netSMSgw.httpUserDB



    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Call SetupFormStatic() 'load static things into form
        Call LoadSettings() 'load preferences into form
        Call SetLogLevel() 'setup loglevel messages.
        Call SetupSMTPHosts()
        Call SetupHttpUsers()
        Call SetServiceStatus() 'check status of "Network SMS Gateway" service :-)



        If gSettings.CheckNewVersion Then Call CheckNewVersion() 'check for new version on startup
        Call SetDirty(False)
        Call RunDaemon(True)
        Call PrivacyStatement()
    End Sub

    Private Sub SetupFormDynamic()
        'general tab
        Me.fraRunAsService.Enabled = Me.chkRunAsService.Checked

        'SMTPd
        Me.fraSmtpSettings.Enabled = Me.chkSmtpEnable.Checked
        Me.fraSmtpAllowBlock.Enabled = Me.chkSmtpEnable.Checked

        'HTTPd
        Me.fraHTTPdSettings.Enabled = Me.chkHttpdEnable.Checked
        Me.chkHttpEnableUsers.Enabled = Me.chkHttpdEnable.Checked
        Me.fraHttpUsers.Enabled = Me.chkHttpEnableUsers.Checked
        If Not Me.chkHttpdEnable.Checked Then Me.fraHttpUsers.Enabled = False


        'SMSd
        Me.fraTimeRestrictions.Enabled = Me.chkSmsRestrictions.Checked


        'Serial

        'Logging
        Me.fraNormalLog.Enabled = Me.chkSaveLog.Checked
        Me.fraLogLevel.Enabled = Me.chkSaveLog.Checked

        'Statistics
        Me.fraStats.Enabled = Me.chkStatsSave.Checked
        Me.ckkStatsPhoneHome.Enabled = Me.chkStatsSave.Checked
        Me.fraStatsPhoneHome.Enabled = Me.ckkStatsPhoneHome.Checked
        If Not Me.chkStatsSave.Checked Then Me.fraStatsPhoneHome.Enabled = False
    End Sub

    Private Sub SetupSMTPHosts()
        Dim str As String
        Dim strIP(1) As String
        Dim strNetIP As String
        Dim strBroadIP As String
        Dim util As New netSMSgw.ipUtils

        For Each str In mcolSMTPHosts
            strIP = Microsoft.VisualBasic.Split(str, "/")
            strNetIP = util.GetNetworkAdr(strIP(0), strIP(1))
            strBroadIP = util.GetBroadCastAdr(strIP(0), strIP(1))

            Me.lstSMTPIPs.Items.Add(str & " (" & strNetIP & " - " & strBroadIP & ")")
        Next

    End Sub

    Private Sub SetupHttpUsers()
        Dim user As netSMSgw.httpUser

        For Each user In mcolHttpUsers
            Me.lstHttpUSers.Items.Add(user.Username & " / " & user.Password)
        Next


    End Sub

    Private Sub cboCom_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
        gstrCOMPort = Me.cboCom.Text
    End Sub

    Private Sub trbLogLevel_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles trbLogLevel.Scroll
        Call SetDirty(True)
        Call SetLogLevel()
    End Sub

    Private Sub SetServiceStatus()

        Try
            mServiceCtl = New System.ServiceProcess.ServiceController("Network SMS Gateway")

            Me.lblServiceStatus.Text = mServiceCtl.Status.ToString
            Me.cmdServiceInst.Text = "Uninstall Service"
            mbolServiceFound = True

            If mServiceCtl.Status = ServiceProcess.ServiceControllerStatus.Stopped Then
                Me.cmdStartService.Enabled = True
                Me.cmdStopService.Enabled = False
            Else
                If mServiceCtl.CanStop Then
                    Me.cmdStopService.Enabled = True
                    Me.cmdStartService.Enabled = False
                End If
            End If

        Catch ex As InvalidOperationException
            Me.lblServiceStatus.Text = ex.InnerException.Message
            Me.cmdStartService.Enabled = False
            Me.cmdStopService.Enabled = False
            'Me.tmrServiceCheck.Enabled = False
            Me.cmdServiceInst.Text = "Install Service"
            mbolServiceFound = False
        End Try
    End Sub


    Private Sub SetLogLevel()
        Select Case Me.trbLogLevel.Value
            Case 0
                Me.lblLoglevel.Text = "Log Level: Nothing"
                Me.lblLogLevelInfo.Text = "Nothing will be logged, you will not be able to see any faults or information on the progress"
            Case 1
                Me.lblLoglevel.Text = "Log Level: Critical"
                Me.lblLogLevelInfo.Text = "This will only log absolute critical warnings. If you see critical warnings in the log, if you see any of these the sms or email was not sent/received"
            Case 2
                Me.lblLoglevel.Text = "Log Level: Warnings"
                Me.lblLogLevelInfo.Text = "This will only log non critical warnings and you will not be able to see the any information on the progress"
            Case 3
                Me.lblLoglevel.Text = "Log Level: Notice"
                Me.lblLogLevelInfo.Text = "If you really only want stats of progess this is the log level to select"
            Case 4
                Me.lblLoglevel.Text = "Log Level: Info"
                Me.lblLogLevelInfo.Text = "This is the recomended log level, this will log progress information and warnings"
            Case 5
                Me.lblLoglevel.Text = "Log Level: Debug"
                Me.lblLogLevelInfo.Text = "This is ment for debugging only, it will produse a lot of information on the progress as well as the underlying engine progress."
        End Select
    End Sub

    Private Sub cmdLogBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLogBrowse.Click
        Me.dlgSave.Title = "Select path and filename"
        Me.dlgSave.FileName = Me.txtLogPath.Text
        Me.dlgSave.ShowDialog()
        Me.txtLogPath.Text = Me.dlgSave.FileName
    End Sub

    Private Sub cmdLogDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLogDel.Click
        If System.IO.File.Exists(Me.txtLogPath.Text) Then
            Call System.IO.File.Delete(Me.txtLogPath.Text)
        End If
        MsgBox("Log has been deleted!", MsgBoxStyle.Information, "Log Deleted")
    End Sub

    Private Sub SetupFormStatic()

        'SMSd
        'load COM ports from computer
        Dim i As Integer
        Do While i <= My.Computer.Ports.SerialPortNames.Count - 1
            Me.cboCom.Items.Add(My.Computer.Ports.SerialPortNames(i))
            i += 1
        Loop

        Me.cboBaud.Items.Add("9600")
        Me.cboBaud.Items.Add("19200")
        Me.cboBaud.Items.Add("38400")
        Me.cboBaud.Items.Add("57600")
        Me.cboBaud.Items.Add("115200")

        Me.cboDataBits.Items.Add("5")
        Me.cboDataBits.Items.Add("6")
        Me.cboDataBits.Items.Add("7")
        Me.cboDataBits.Items.Add("8")

        Me.cboParity.Items.Add(System.IO.Ports.Parity.None.ToString)
        Me.cboParity.Items.Add(System.IO.Ports.Parity.Even.ToString)
        Me.cboParity.Items.Add(System.IO.Ports.Parity.Mark.ToString)
        Me.cboParity.Items.Add(System.IO.Ports.Parity.Odd.ToString)
        Me.cboParity.Items.Add(System.IO.Ports.Parity.Space.ToString)

        Me.cboStopBits.Items.Add(System.IO.Ports.StopBits.One.ToString)
        Me.cboStopBits.Items.Add(System.IO.Ports.StopBits.OnePointFive.ToString)
        Me.cboStopBits.Items.Add(System.IO.Ports.StopBits.Two.ToString)
        Me.cboStopBits.Items.Add(System.IO.Ports.StopBits.None.ToString)

        Me.cboFlow.Items.Add(System.IO.Ports.Handshake.None.ToString)
        Me.cboFlow.Items.Add(System.IO.Ports.Handshake.RequestToSend.ToString)
        Me.cboFlow.Items.Add(System.IO.Ports.Handshake.RequestToSendXOnXOff.ToString)
        Me.cboFlow.Items.Add(System.IO.Ports.Handshake.XOnXOff.ToString)

        Me.cboDTR.Items.Add("True")
        Me.cboDTR.Items.Add("False")
        Me.cboRTS.Items.Add("True")
        Me.cboRTS.Items.Add("False")


        'stats

        'about
        Me.lblVer.Text = Me.lblVer.Text & Application.ProductVersion.ToString



    End Sub

    Private Sub PrivacyStatement()

        If Not gSettings.statsShownPrivacyStatement Then
            Dim str As String
            str = "PRIVACY STATEMENT, PLEASE READ!" & vbCrLf & vbCrLf & _
                "Per default netSMSgw will report anonymous statistic data back" & vbCrLf & _
                "to our Stats collector, this data is 100% anonymous, not even" & vbCrLf & _
                "your IP address is saved,we only collect information on how" & vbCrLf & _
                "many sms's you send, time, successrate, OS, country, etc." & vbCrLf & _
                "Pease see the manual for details on that is sent and where." & vbCrLf & vbCrLf & _
                "We very much appreciate you participation, so we can extend" & vbCrLf & _
                "netSMSgw further and collect information on featured used so we" & vbCrLf & _
                "know where to focus. Stats will be (at some point) available from" & vbCrLf & _
                "the official webpage. Again thanks for your participation!" & vbCrLf & vbCrLf & _
                " - The Network SMS Gateway Team"
            MsgBox(str, MsgBoxStyle.Exclamation, "PRIVACY STATEMENT")

            gSettings.statsShownPrivacyStatement = True
        End If

    End Sub

    Private Sub LoadSettings()

        gSettings = netSMSgwd.clsSettings.Deserialize(gstrSettingsPath)

        'general
        Me.chkRunAsService.Checked = gSettings.RunAsService
        Me.chkFakeIt.Checked = gSettings.FakeIt
        Me.chkCheckVer.Checked = gSettings.CheckNewVersion

        'Serial
        Me.cboCom.SelectedIndex = GetIndex(cboCom, gSettings.smsComPort)
        Me.cboBaud.SelectedIndex = GetIndex(cboBaud, gSettings.smsBaudRate)
        Me.cboDataBits.SelectedIndex = GetIndex(cboDataBits, gSettings.smsDataBits)
        Me.cboDTR.SelectedIndex = GetIndex(cboDTR, gSettings.smsDTR.ToString)
        Me.cboFlow.SelectedIndex = GetIndex(cboFlow, gSettings.smsHandShake.ToString)
        Me.cboParity.SelectedIndex = GetIndex(cboParity, gSettings.smsParity.ToString)
        Me.cboRTS.SelectedIndex = GetIndex(cboRTS, gSettings.smsRTS.ToString)
        Me.cboStopBits.SelectedIndex = GetIndex(cboStopBits, gSettings.smsStopBits.ToString)
        Me.numSMSWait.Value = gSettings.smsWaitSec

        'smsd
        Me.chkSmsRestrictions.Checked = gSettings.smsRestrictTime
        Me.chkSmsHighPriority.Checked = gSettings.smsIgnoreRestrictionOnHighPriority
        Me.dtpSmsStart.Value = gSettings.smsPeekHourStart
        Me.dtpSmsEnd.Value = gSettings.smsPeekHourEnd

        'smtpd
        Me.txtSMTPDName.Text = gSettings.smtpServerName
        Me.txtListenIP.Text = gSettings.smtpListenIPAdr
        Me.numPort.Value = gSettings.smtpListenPort
        mcolSMTPHosts = gSettings.smtpHosts
        Me.rdoSMTPDeny.Checked = gSettings.smtpDenyAll
        Me.rdoSMTPAllow.Checked = gSettings.smtpAllowAll
        Me.chkSmtpEnable.Checked = gSettings.smtpEnabled

        'httpd

        Me.chkHttpdEnable.Checked = gSettings.httpEnabled
        Me.txtHttpDomain.Text = gSettings.httpListenDomain
        Me.numHttpPort.Value = gSettings.httpPort
        Me.chkHttpEnableUsers.Checked = gSettings.httpEnableUsers
        mcolHttpUsers = gSettings.httpUsersDB

        'log
        Me.trbLogLevel.Value = gSettings.LogLevel
        Me.txtLogPath.Text = gSettings.LogFile
        Me.chkSaveLog.Checked = gSettings.SaveLogToFile

        'Stats
        Me.chkStatsSave.Checked = gSettings.statsSave
        Me.txtStatsPath.Text = gSettings.statsFile
        Me.ckkStatsPhoneHome.Checked = gSettings.statsAllowPhoneHome
        Me.numStatsPHInterval.Value = gSettings.statsPhoneHomeInterval

    End Sub

    Private Function GetIndex(ByVal pcboBox As ComboBox, ByVal pstrString As String) As Integer

        Dim i As Integer

        For i = 0 To pcboBox.Items.Count - 1

            If LCase(pcboBox.Items.Item(i).ToString) = LCase(pstrString) Then
                Return i
            End If
        Next

        Return 0

    End Function

    Private Function GetLogInt(ByVal pstr As String) As Integer

        If LCase(netSMSgw.logUtils.LogLevels.Info.ToString) = LCase(pstr) Then
            Return 4

        ElseIf LCase(netSMSgw.logUtils.LogLevels.Notice.ToString) = LCase(pstr) Then
            Return 3

        ElseIf LCase(netSMSgw.logUtils.LogLevels.Warnings.ToString) = LCase(pstr) Then
            Return 2

        ElseIf LCase(netSMSgw.logUtils.LogLevels.Critical.ToString) = LCase(pstr) Then
            Return 1

        ElseIf LCase(netSMSgw.logUtils.LogLevels.Debug.ToString) = LCase(pstr) Then
            Return 5

        ElseIf LCase(netSMSgw.logUtils.LogLevels.None.ToString) = LCase(pstr) Then
            Return 0
        End If

        Return 4
    End Function

    Private Sub RunDaemon(ByVal pbolStart As Boolean)

        'if we want to start the service and the RunAsService is not checked!
        If pbolStart And Not Me.chkRunAsService.Checked Then
            'if the daemon as not yet been started, start a new one..
            If mDeamon Is Nothing Then
                mDeamon = New netSMSgw.netSMSgwd.netSMSgwd
                mDeamon.StartService()
                'else we just stop and start the service (to reload the settings)
            Else
                mDeamon.StopService()
                mDeamon.StartService()
            End If
            'if we want to stop the service
        Else
            If Not mDeamon Is Nothing Then mDeamon.StopService()
        End If

    End Sub




    Private Sub cmdOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOK.Click
        Call SaveSettings()
        Call RunDaemon(False)
        Me.Close()
    End Sub

    Private Sub SaveSettings()


        With gSettings
            'general
            .RunAsService = Me.chkRunAsService.Checked
            .FakeIt = Me.chkFakeIt.Checked
            .CheckNewVersion = Me.chkCheckVer.Checked

            'Serial
            .smsBaudRate = Me.cboBaud.Items.Item(Me.cboBaud.SelectedIndex)
            .smsComPort = Me.cboCom.Items.Item(Me.cboCom.SelectedIndex)
            .smsDataBits = Me.cboDataBits.Items.Item(Me.cboDataBits.SelectedIndex)
            .smsDTR = Me.cboDTR.Items.Item(Me.cboDTR.SelectedIndex)

            'smsd
            .smsRestrictTime = Me.chkSmsRestrictions.Checked
            .smsPeekHourStart = Me.dtpSmsStart.Value
            .smsPeekHourEnd = Me.dtpSmsEnd.Value
            .smsIgnoreRestrictionOnHighPriority = Me.chkSmsHighPriority.Checked

            .smsHandShakeStr = Me.cboFlow.Items.Item(Me.cboFlow.SelectedIndex)
            .smsParityStr = Me.cboParity.Items.Item(Me.cboParity.SelectedIndex)
            .smsRTS = Me.cboRTS.Items.Item(Me.cboRTS.SelectedIndex)
            .smsStopBitsStr = Me.cboStopBits.Items.Item(Me.cboStopBits.SelectedIndex)
            .smsWaitSec = Me.numSMSWait.Value

            'smtpd
            .smtpListenIPAdr = Me.txtListenIP.Text
            .smtpListenPort = Me.numPort.Value
            .smtpServerName = Me.txtSMTPDName.Text
            .smtpHosts = mcolSMTPHosts
            .smtpAllowAll = Me.rdoSMTPAllow.Checked
            .smtpDenyAll = Me.rdoSMTPDeny.Checked
            .smtpEnabled = Me.chkSmtpEnable.Checked

            'httpd
            .httpEnabled = Me.chkHttpdEnable.Checked
            .httpEnableUsers = Me.chkHttpEnableUsers.Checked
            .httpListenDomain = Me.txtHttpDomain.Text
            .httpPort = Me.numHttpPort.Value
            .httpUsersDB = mcolHttpUsers


            'logging
            .LogLevel = Me.trbLogLevel.Value
            .SaveLogToFile = Me.chkSaveLog.Checked
            .LogFile = Me.txtLogPath.Text

            'stats
            .statsSave = Me.chkStatsSave.Checked
            .statsFile = Me.txtStatsPath.Text
            .statsAllowPhoneHome = Me.ckkStatsPhoneHome.Checked
            .statsPhoneHomeInterval = Me.numStatsPHInterval.Value

        End With

        netSMSgw.netSMSgwd.clsSettings.Serialize(gstrSettingsPath, gSettings)
    End Sub

    Private Sub cmdCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCancel.Click
        Call RunDaemon(False)
        Me.Close()
    End Sub

    Private Sub cmdApply_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdApply.Click
        Call SaveSettings()
        Call RunDaemon(True)
        Call SetDirty(False)
    End Sub

    Private Sub SetDirty(ByVal pbol As Boolean)
        Me.cmdApply.Enabled = pbol
        Call SetupFormDynamic()
    End Sub

#Region "SetDirty"
    Private Sub cboCom_SelectedIndexChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboCom.SelectedIndexChanged
        Call SetDirty(True)
    End Sub

    Private Sub cboBaud_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboBaud.SelectedIndexChanged
        Call SetDirty(True)
    End Sub

    Private Sub cboDataBits_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboDataBits.SelectedIndexChanged
        Call SetDirty(True)
    End Sub

    Private Sub cboParity_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboParity.SelectedIndexChanged
        Call SetDirty(True)
    End Sub

    Private Sub cboStopBits_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboStopBits.SelectedIndexChanged
        Call SetDirty(True)
    End Sub

    Private Sub cboFlow_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboFlow.SelectedIndexChanged
        Call SetDirty(True)
    End Sub

    Private Sub cboDTR_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboDTR.SelectedIndexChanged
        Call SetDirty(True)
    End Sub

    Private Sub cboRTS_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboRTS.SelectedIndexChanged
        Call SetDirty(True)
    End Sub

    Private Sub numSMSWait_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Call SetDirty(True)
    End Sub

    Private Sub txtSMTPDName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSMTPDName.TextChanged
        Call SetDirty(True)
    End Sub

    Private Sub txtListenIP_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtListenIP.TextChanged
        Call SetDirty(True)
    End Sub

    Private Sub numPort_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles numPort.ValueChanged
        Call SetDirty(True)
    End Sub

    Private Sub txtLogPath_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtLogPath.TextChanged
        Call SetDirty(True)
    End Sub

    Private Sub chkSaveLog_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkSaveLog.CheckedChanged
        Call SetDirty(True)
    End Sub
#End Region



    Private Sub chkRunAsService_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Call SetDirty(True)
    End Sub

    Private Sub chkFakeIt_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Call SetDirty(True)
    End Sub

    Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
        Help.ShowHelp(Me, "http://sf.net/projects/netsmsgw/")
    End Sub

    Private Sub LinkLabel2_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel2.LinkClicked
        Help.ShowHelp(Me, "https://sourceforge.net/project/project_donations.php?group_id=235198")
    End Sub


    Private Sub cmdStartService_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStartService.Click
        If Not mDeamon Is Nothing Then
            mDeamon.StopService()
        End If
        mServiceCtl.Start()
    End Sub

    Private Sub cmdStopService_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStopService.Click
        If mServiceCtl.CanStop Then mServiceCtl.Stop()
    End Sub

    Private Sub tmrServiceCheck_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrServiceCheck.Tick
        Call SetServiceStatus()
    End Sub

    Private Sub chkRunAsService_CheckedChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkRunAsService.CheckedChanged
        Call SetDirty(True)
    End Sub

    Private Sub cmdServiceInst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdServiceInst.Click
        Dim strInstaller As String = gSettings.InstallUtilFile
        Dim strDll As String = Chr(34).ToString & GetType(netSMSgw.netSMSgwd.netSMSgwd).Assembly.CodeBase.ToString.Remove(0, 8) & Chr(34).ToString
        Dim msgRes As MsgBoxResult



AnotherTry:
        If Not System.IO.File.Exists(strInstaller) Then

            msgRes = MsgBox("InstallUtil.exe was not found. " & vbCrLf & _
                            "This comes with Microsoft .NET package and is normally located: " & vbCrLf & _
                            strInstaller & vbCrLf & vbCrLf & _
                            "Would you like to point me to the file?", MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo, "InstallUtil.exe not found")

            If msgRes = MsgBoxResult.Yes Then
                Me.dlgOpen.Filter = "EXE|*.exe"
                Me.dlgOpen.Multiselect = False
                Me.dlgOpen.FileName = "InstallUtil.exe"
                Me.dlgOpen.ShowDialog()
                If Not LCase(Microsoft.VisualBasic.Right(Me.dlgOpen.FileName, 15)) = "installutil.exe" Then
                    GoTo AnotherTry
                Else
                    strInstaller = Me.dlgOpen.FileName
                    gSettings.InstallUtilFile = Me.dlgOpen.FileName
                End If
            Else
                MsgBox("(un)Installation Aborted!", MsgBoxStyle.Exclamation, "Abort")
                Exit Sub
            End If
        End If

        If mbolServiceFound Then
            'uninstall
            Shell(strInstaller & " /U " & strDll, AppWinStyle.NormalFocus, True)
        Else
            'install
            Shell(strInstaller & " " & strDll, AppWinStyle.NormalFocus, True)
        End If
    End Sub

    Private Sub cmdTestConn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdTestConn.Click
        Try

            If gSettings.RunAsService Then
                'this done work yet..
                'mServiceCtl.ExecuteCommand(netSMSgwd.netSMSgwd.CustomCommand.TestPhoneConnection)
                MsgBox("You can not test phone connection in ""Service Mode""", MsgBoxStyle.Exclamation, "No go sorry..")
            Else
                'if running as a daemon and service was started before start service.
                If Not mDeamon Is Nothing Then
                    mDeamon.TestPhoneConnection()
                Else
                    mDeamon = New netSMSgw.netSMSgwd.netSMSgwd
                    mDeamon.TestPhoneConnection()
                End If

            End If

        Catch ex As Exception
            MsgBox(ex.Message.ToString, MsgBoxStyle.Critical, "Error")
        End Try


    End Sub


    Private Sub chkCheckVer_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkCheckVer.CheckedChanged
        Call SetDirty(True)
    End Sub

    Private Sub cmdCheckVer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCheckVer.Click

        Call CheckNewVersion()

    End Sub

    Private Sub CheckNewVersion()
        Dim objCheckVer As New netSMSgw.netSMSgwd.Utils
        Dim strct As netSMSgw.netSMSgwd.Utils.netSMSgwVersionCheck

        strct = objCheckVer.CheckForNewVersion

        Me.lblCurVer.Text = strct.CurrentVer
        Me.lblNewestVer.Text = strct.NewestVer

        If strct.NewerAvailable Then
            Dim msgres As MsgBoxResult
            msgres = MsgBox("New version available from the webpage, go there now?", MsgBoxStyle.Information + MsgBoxStyle.YesNo, "New Version Available")

            If msgres = MsgBoxResult.Yes Then
                Help.ShowHelp(Me, "http://netsmsgw.hyber.dk/")
            End If
        End If
    End Sub

    Private Sub cmdTestMsg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdTestMsg.Click
        Dim frm As New frmSendSMS

        frm.ShowDialog()
    End Sub

    Private Sub cmdSMTPRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSMTPRemove.Click

        If Not Me.lstSMTPIPs.SelectedIndex = -1 Then
            Call SetDirty(True)
            mcolSMTPHosts.Remove(Me.lstSMTPIPs.SelectedIndex)
            Me.lstSMTPIPs.Items.RemoveAt(Me.lstSMTPIPs.SelectedIndex)
        End If
    End Sub

    Private Sub cmdSMTPAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSMTPAdd.Click
        Try

            Dim util As New netSMSgw.ipUtils
            Dim strIP(1) As String
            Dim strNetIP As String
            Dim strBroadIP As String

            If Not Me.txtSMTPHost.Text = "" Then

                Call SetDirty(True)
                strIP = Split(Me.txtSMTPHost.Text, "/")

                If Not strIP.Length = 2 Then GoTo ParseErr


                strNetIP = util.GetNetworkAdr(Trim(strIP(0)), Trim(strIP(1)))
                strBroadIP = util.GetBroadCastAdr(Trim(strIP(0)), (strIP(1)))


                mcolSMTPHosts.Add(strNetIP & "/" & strIP(1))
                Me.lstSMTPIPs.Items.Add(strNetIP & "/" & strIP(1) & " (" & strNetIP & " - " & strBroadIP & ")")
                Exit Sub
            End If


ParseErr:
            MsgBox("Parse error, must be in CIDR format (1.1.1.1/32)", MsgBoxStyle.Critical, "Parse error")

        Catch ex As Exception
            MsgBox("Parse error, must be in CIDR format (1.1.1.1/32)", MsgBoxStyle.Critical, "Parse error")

        End Try

    End Sub

    Private Sub rdoSMTPAllow_CheckedChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdoSMTPAllow.CheckedChanged
        Call SetDirty(True)
    End Sub

    Private Sub rdoSMTPDeny_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdoSMTPDeny.CheckedChanged
        Call SetDirty(True)
    End Sub


    Private Sub cmdHttpAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdHttpAdd.Click
        Dim user As New netSMSgw.httpUser

        If Not Me.txtHttpUser.Text = "" Then
            user.Username = Me.txtHttpUser.Text
            user.Password = Me.txtHttpPass.Text

            mcolHttpUsers.Add(user)
            Me.lstHttpUSers.Items.Add(Me.txtHttpUser.Text & " / " & Me.txtHttpPass.Text)

            Me.txtHttpUser.Text = ""
            Me.txtHttpPass.Text = ""
        End If

        Call SetDirty(True)
    End Sub

    Private Sub cmdHttpRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdHttpRemove.Click
        If Not Me.lstHttpUSers.SelectedIndex = -1 Then
            mcolHttpUsers.Remove(Me.lstHttpUSers.SelectedIndex)
            Me.lstHttpUSers.Items.RemoveAt(Me.lstHttpUSers.SelectedIndex)

            Call SetDirty(True)
        End If
    End Sub

    Private Sub chkHttpdEnable_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkHttpdEnable.CheckedChanged
        Call SetDirty(True)
    End Sub

    Private Sub txtHttpDomain_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtHttpDomain.TextChanged
        Call SetDirty(True)
    End Sub

    Private Sub numHttpPort_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles numHttpPort.ValueChanged
        Call SetDirty(True)
    End Sub

    Private Sub chkHttpEnableUsers_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkHttpEnableUsers.CheckedChanged
        Call SetDirty(True)
    End Sub


    Private Sub chkSmsRestrictions_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkSmsRestrictions.CheckedChanged
        Call SetDirty(True)
    End Sub

    Private Sub dtpSmsStart_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpSmsStart.ValueChanged

        If dtpSmsStart.Value.TimeOfDay >= dtpSmsEnd.Value.TimeOfDay Then dtpSmsEnd.Value = dtpSmsStart.Value.AddSeconds(1)
        dtpSmsStart.Value = "1800-01-01T" & dtpSmsStart.Value.TimeOfDay.ToString
        dtpSmsEnd.Value = "1800-01-01T" & dtpSmsEnd.Value.TimeOfDay.ToString
        Call SetDirty(True)
    End Sub

    Private Sub dtpSmsEnd_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpSmsEnd.ValueChanged
        If dtpSmsStart.Value.TimeOfDay >= dtpSmsEnd.Value.TimeOfDay Then dtpSmsStart.Value = dtpSmsEnd.Value.AddSeconds(-1)
        dtpSmsStart.Value = "1800-01-01T" & dtpSmsStart.Value.TimeOfDay.ToString
        dtpSmsEnd.Value = "1800-01-01T" & dtpSmsEnd.Value.TimeOfDay.ToString
        Call SetDirty(True)
    End Sub

    Private Sub chkSmsHighPriority_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkSmsHighPriority.CheckedChanged
        Call SetDirty(True)
    End Sub

    Private Sub numSMSWait_ValueChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles numSMSWait.ValueChanged
        Call SetDirty(True)
    End Sub

    Private Sub chkFakeIt_CheckedChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkFakeIt.CheckedChanged
        Call SetDirty(True)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        mDeamon.PhoneHomeStats()
        'mDeamon.GetPhoneInfo()
    End Sub

    Private Sub txtStatsPath_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Call SetDirty(True)
    End Sub

    Private Sub cmdStatsBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStatsBrowse.Click
        Me.dlgSave.Title = "Select path and filename"
        Me.dlgSave.FileName = Me.txtStatsPath.Text
        Me.dlgSave.ShowDialog()
        Me.txtStatsPath.Text = Me.dlgSave.FileName
    End Sub

    Private Sub cmdStatsDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStatsDelete.Click
        If System.IO.File.Exists(Me.txtStatsPath.Text) Then
            Call System.IO.File.Delete(Me.txtStatsPath.Text)
        End If
        MsgBox("Stats has been deleted!", MsgBoxStyle.Information, "Stats Deleted")
    End Sub

    Private Sub chkStatsSave_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkStatsSave.CheckedChanged
        Call SetDirty(True)
    End Sub

    Private Sub ckkStatsPhoneHome_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ckkStatsPhoneHome.CheckedChanged
        Call SetDirty(True)
    End Sub

    Private Sub numStatsPHInterval_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles numStatsPHInterval.ValueChanged
        Call SetDirty(True)
    End Sub

    Private Sub chkSmtpEnable_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkSmtpEnable.CheckedChanged
        Call SetDirty(True)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        mDeamon.StopQueue()
        Threading.Thread.Sleep(10000)
        mDeamon.StartQueue()

    End Sub
End Class
