mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			241 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			241 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
VERSION 1.0 CLASS
 | 
						|
BEGIN
 | 
						|
  MultiUse = -1  'True
 | 
						|
  Persistable = 0  'NotPersistable
 | 
						|
  DataBindingBehavior = 0  'vbNone
 | 
						|
  DataSourceBehavior  = 0  'vbNone
 | 
						|
  MTSTransactionMode  = 0  'NotAnMTSObject
 | 
						|
END
 | 
						|
Attribute VB_Name = "cApplication"
 | 
						|
Attribute VB_GlobalNameSpace = False
 | 
						|
Attribute VB_Creatable = True
 | 
						|
Attribute VB_PredeclaredId = False
 | 
						|
Attribute VB_Exposed = False
 | 
						|
'*************************************************************************************************************************************************************************************************************************************************
 | 
						|
'
 | 
						|
' Copyright (c) David Briant 2009-2012 - All rights reserved
 | 
						|
'
 | 
						|
'*************************************************************************************************************************************************************************************************************************************************
 | 
						|
 | 
						|
Option Explicit
 | 
						|
 | 
						|
Private Declare Function apiSetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
 | 
						|
Private Declare Function apiGlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" (ByVal lpString As String) As Long
 | 
						|
Private Declare Function apiSetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long
 | 
						|
 | 
						|
Private myMouseEventsForm As fMouseEventsForm
 | 
						|
Private WithEvents myAST As cTP_AdvSysTray
 | 
						|
Attribute myAST.VB_VarHelpID = -1
 | 
						|
 | 
						|
Private myClassName As String
 | 
						|
Private myWindowName As String
 | 
						|
Private Const TEN_MILLION As Single = 10000000
 | 
						|
 | 
						|
Private WithEvents myListener As VLMessaging.VLMMMFileListener
 | 
						|
Attribute myListener.VB_VarHelpID = -1
 | 
						|
Private WithEvents myMMFileTransports As VLMessaging.VLMMMFileTransports
 | 
						|
Attribute myMMFileTransports.VB_VarHelpID = -1
 | 
						|
 | 
						|
Private myMachineID As Long
 | 
						|
 | 
						|
Private myRouterSeed As Long
 | 
						|
Private myRouterIDsByMMTransportID As New Dictionary
 | 
						|
Private myMMTransportIDsByRouterID As New Dictionary
 | 
						|
 | 
						|
Private myDirectoryEntriesByIDString As New Dictionary
 | 
						|
 | 
						|
Private Const GET_ROUTER_ID As String = "GET_ROUTER_ID"
 | 
						|
Private Const GET_ROUTER_ID_REPLY As String = "GET_ROUTER_ID_REPLY"
 | 
						|
Private Const REGISTER_SERVICE As String = "REGISTER_SERVICE"
 | 
						|
Private Const REGISTER_SERVICE_REPLY As String = "REGISTER_SERVICE_REPLY"
 | 
						|
Private Const UNREGISTER_SERVICE As String = "UNREGISTER_SERVICE"
 | 
						|
Private Const UNREGISTER_SERVICE_REPLY As String = "UNREGISTER_SERVICE_REPLY"
 | 
						|
Private Const GET_SERVICES As String = "GET_SERVICES"
 | 
						|
Private Const GET_SERVICES_REPLY As String = "GET_SERVICES_REPLY"
 | 
						|
 | 
						|
 | 
						|
'*************************************************************************************************************************************************************************************************************************************************
 | 
						|
' Initialize / Release
 | 
						|
'*************************************************************************************************************************************************************************************************************************************************
 | 
						|
 | 
						|
Private Sub class_Initialize()
 | 
						|
    Dim atomID As Long
 | 
						|
    Randomize
 | 
						|
    ' hide us from the Applications list in the Windows Task Manager
 | 
						|
    App.TaskVisible = False
 | 
						|
    
 | 
						|
    ' listen for connections
 | 
						|
    myClassName = "VLMMachineRouter" & CStr(Int(Rnd() * TEN_MILLION) + 1)
 | 
						|
    Randomize
 | 
						|
    myWindowName = "VLMMachineRouter" & CStr(Int(Rnd() * TEN_MILLION) + 1)
 | 
						|
    Set myListener = New VLMMMFileListener
 | 
						|
    myListener.listenViaNamedWindow myClassName, myWindowName, 1024 * 8
 | 
						|
    Set myMMFileTransports = New VLMMMFileTransports
 | 
						|
    myRouterSeed = 1
 | 
						|
    
 | 
						|
    ' create tray icon
 | 
						|
    Set myMouseEventsForm = New fMouseEventsForm
 | 
						|
    Set myAST = New cTP_AdvSysTray
 | 
						|
    myAST.create myMouseEventsForm, myMouseEventsForm.icon, "VLM Directory"
 | 
						|
    'myAST.showBalloon "Current Shell32.dll version is " & myAST.shellVersion & ".x", "AdvSysTray VB Class", NIIF_INFO
 | 
						|
    
 | 
						|
    ' make myself easily found
 | 
						|
    apiSetProp myMouseEventsForm.hwnd, "IsVLMachineRouter", 1
 | 
						|
    apiSetProp myMouseEventsForm.hwnd, "WindowNameAtom", apiGlobalAddAtom(myWindowName)
 | 
						|
    apiSetProp myMouseEventsForm.hwnd, "ClassNameAtom", apiGlobalAddAtom(myClassName)
 | 
						|
    
 | 
						|
End Sub
 | 
						|
 | 
						|
Sub shutdown()
 | 
						|
    myAST.destroy
 | 
						|
    Set myAST = Nothing
 | 
						|
    Unload myMouseEventsForm
 | 
						|
    Set myMouseEventsForm = Nothing
 | 
						|
End Sub
 | 
						|
 | 
						|
Private Sub myAST_RButtonUp()
 | 
						|
    Dim epm As New cTP_EasyPopupMenu, menuItemSelected As Long
 | 
						|
    'SetForegroundWindow myMouseEventsForm.hwnd
 | 
						|
'    epm.addMenuItem "Main form...", MF_STRING, 1
 | 
						|
'    epm.createSubmenu "Radio items"
 | 
						|
'    epm.addSubmenuItem "Radio item 1", MF_STRING, 2
 | 
						|
'    epm.addSubmenuItem "Radio item 2", MF_STRING, 3
 | 
						|
'    epm.addSubmenuItem "Radio item 3", MF_STRING, 4
 | 
						|
'    epm.checkRadioItem 0, 2, 1
 | 
						|
'    epm.addMenuItem "", MF_SEPARATOR, 0
 | 
						|
'    epm.addMenuItem "Disabled item", MF_GRAYED, 5
 | 
						|
'    epm.addMenuItem "Checked item", MF_CHECKED, 6
 | 
						|
'    epm.addMenuItem "", MF_SEPARATOR, 0
 | 
						|
    epm.addMenuItem "Exit", MF_STRING, 12
 | 
						|
    apiSetForegroundWindow myMouseEventsForm.hwnd
 | 
						|
    menuItemSelected = epm.trackMenu(myMouseEventsForm.hwnd)
 | 
						|
    Select Case menuItemSelected
 | 
						|
        Case 12
 | 
						|
            Set epm = Nothing
 | 
						|
            globalShutdown
 | 
						|
    End Select
 | 
						|
End Sub
 | 
						|
 | 
						|
Private Sub myListener_newConnection(ByVal newTransport As VLMessaging.VLMMMFileTransport, oReceived As Boolean)
 | 
						|
    Dim id As Long
 | 
						|
    oReceived = True
 | 
						|
    id = myMMFileTransports.addTransport(newTransport)
 | 
						|
End Sub
 | 
						|
 | 
						|
Private Function messageFromBytes(buffer() As Byte) As VLMMessage
 | 
						|
    Dim i1 As Long, i2 As Long, messageArray As Variant, message As New VLMMessage
 | 
						|
    DBGetArrayBounds buffer, 1, i1, i2
 | 
						|
    messageArray = g_VLMUtils.BytesAsVariant(buffer, i2 + 1, 1)
 | 
						|
    message.fromMessageArray messageArray
 | 
						|
    Set messageFromBytes = message
 | 
						|
End Function
 | 
						|
 | 
						|
Private Function messageToBytes(message As VLMMessage) As Byte()
 | 
						|
    Dim messageArray As Variant, length As Long, buffer() As Byte
 | 
						|
    message.toMessageArray messageArray
 | 
						|
    length = g_VLMUtils.LengthOfVariantAsBytes(messageArray)
 | 
						|
    DBCreateNewArrayOfBytes buffer, 1, length
 | 
						|
    g_VLMUtils.VariantAsBytes messageArray, buffer, length + 1, 1
 | 
						|
    messageToBytes = buffer
 | 
						|
End Function
 | 
						|
 | 
						|
Private Sub myMMFileTransports_bytesArrived(ByVal id As Long, buffer() As Byte, oReceived As Boolean)
 | 
						|
    Dim message As VLMMessage, toAddress As VLMAddress
 | 
						|
    oReceived = True
 | 
						|
    Set message = messageFromBytes(buffer)
 | 
						|
    Set toAddress = message.toAddress
 | 
						|
    On Error GoTo errorHandler
 | 
						|
    If (toAddress.MachineID = myMachineID Or toAddress.MachineID = 0) And toAddress.RouterID = 1 And toAddress.AgentID = 1 Then
 | 
						|
        handleMessageToRouter id, message
 | 
						|
    Else
 | 
						|
        routeMessage message
 | 
						|
    End If
 | 
						|
Exit Sub
 | 
						|
errorHandler:
 | 
						|
    MsgBox Err.Description & ", " & Erl
 | 
						|
End Sub
 | 
						|
 | 
						|
Sub handleMessageToRouter(MMFileTransportID As Long, message As VLMMessage)
 | 
						|
    Dim reply As VLMMessage, transport As VLMMMFileTransport, RouterID As Long, address As New VLMAddress
 | 
						|
    Dim IDString As String, vs As Variant, i As Long, entries As New Collection, answer1D As Variant
 | 
						|
    
 | 
						|
    Select Case True
 | 
						|
    
 | 
						|
        Case message.subject = GET_ROUTER_ID
 | 
						|
            If myRouterIDsByMMTransportID.Exists(MMFileTransportID) Then
 | 
						|
                RouterID = myRouterIDsByMMTransportID(MMFileTransportID)
 | 
						|
            Else
 | 
						|
                myRouterSeed = myRouterSeed + 1
 | 
						|
                RouterID = myRouterSeed
 | 
						|
                myRouterIDsByMMTransportID(MMFileTransportID) = RouterID
 | 
						|
                myMMTransportIDsByRouterID(RouterID) = MMFileTransportID
 | 
						|
            End If
 | 
						|
            Set reply = message.reply
 | 
						|
            reply.subject = GET_ROUTER_ID_REPLY
 | 
						|
            reply.Contents = RouterID
 | 
						|
            Set transport = myMMFileTransports.transport(MMFileTransportID)
 | 
						|
            transport.send messageToBytes(reply)
 | 
						|
            
 | 
						|
        Case message.subject = REGISTER_SERVICE
 | 
						|
            address.initialise CLng(message.Contents(1)(1)), CLng(message.Contents(1)(2)), CLng(message.Contents(1)(3))
 | 
						|
            myDirectoryEntriesByIDString(directoryEntryIDString(CStr(message.Contents(2)), address)) = message.Contents
 | 
						|
            Set reply = message.reply
 | 
						|
            reply.subject = REGISTER_SERVICE_REPLY
 | 
						|
            Set transport = myMMFileTransports.transport(MMFileTransportID)
 | 
						|
            transport.send messageToBytes(reply)
 | 
						|
        
 | 
						|
        Case message.subject = UNREGISTER_SERVICE
 | 
						|
            address.initialise CLng(message.Contents(1)(1)), CLng(message.Contents(1)(2)), CLng(message.Contents(1)(3))
 | 
						|
            IDString = directoryEntryIDString(CStr(message.Contents(2)), address)
 | 
						|
            If myDirectoryEntriesByIDString.Exists(IDString) Then myDirectoryEntriesByIDString.Remove IDString
 | 
						|
            Set reply = message.reply
 | 
						|
            reply.subject = UNREGISTER_SERVICE_REPLY
 | 
						|
            Set transport = myMMFileTransports.transport(MMFileTransportID)
 | 
						|
            transport.send messageToBytes(reply)
 | 
						|
        
 | 
						|
        Case message.subject = GET_SERVICES
 | 
						|
            vs = myDirectoryEntriesByIDString.Items
 | 
						|
            For i = 0 To UBound(vs)
 | 
						|
                If IsEmpty(message.Contents) Then
 | 
						|
                    entries.Add vs(i)
 | 
						|
                Else
 | 
						|
                    If vs(i)(2) = message.Contents Then entries.Add vs(i)
 | 
						|
                End If
 | 
						|
            Next
 | 
						|
            If entries.Count > 0 Then
 | 
						|
                ReDim answer1D(1 To entries.Count)
 | 
						|
                For i = 1 To entries.Count
 | 
						|
                    answer1D(i) = entries(i)
 | 
						|
                Next
 | 
						|
            End If
 | 
						|
            Set reply = message.reply
 | 
						|
            reply.subject = GET_SERVICES_REPLY
 | 
						|
            reply.Contents = answer1D
 | 
						|
            Set transport = myMMFileTransports.transport(MMFileTransportID)
 | 
						|
            transport.send messageToBytes(reply)
 | 
						|
            
 | 
						|
    End Select
 | 
						|
 | 
						|
End Sub
 | 
						|
 | 
						|
Sub routeMessage(message As VLMMessage)
 | 
						|
    Dim buffer() As Byte, transport As VLMMMFileTransport
 | 
						|
    If message.toAddress.MachineID <> 0 And message.toAddress.MachineID <> myMachineID Then
 | 
						|
        ' route to a remote machine
 | 
						|
    Else
 | 
						|
        ' for the moment just route between MMFileTransports
 | 
						|
        If myMMTransportIDsByRouterID.Exists(message.toAddress.RouterID) Then
 | 
						|
            Set transport = myMMFileTransports(myMMTransportIDsByRouterID(message.toAddress.RouterID))
 | 
						|
            transport.send messageToBytes(message)
 | 
						|
        End If
 | 
						|
    End If
 | 
						|
End Sub
 | 
						|
 | 
						|
Function directoryEntryIDString(serviceType As String, address As VLMAddress)
 | 
						|
    directoryEntryIDString = serviceType & "<" & address.MachineID & "," & address.RouterID & "," & address.AgentID & ">"
 | 
						|
End Function
 | 
						|
 | 
						|
Private Sub myMMFileTransports_disconnecting(ByVal id As Long, oReceived As Boolean)
 | 
						|
    oReceived = True
 | 
						|
End Sub
 |