added frameworks entities
This commit is contained in:
403
FRAMEWORKS/STPROC/NDW_WEB_ACCOUNTS_EVENTS.txt
Normal file
403
FRAMEWORKS/STPROC/NDW_WEB_ACCOUNTS_EVENTS.txt
Normal file
@ -0,0 +1,403 @@
|
||||
Function NDW_Web_Accounts_Events(CtrlEntId, Event, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from SRP Computer Solutions, Inc.
|
||||
|
||||
Name : NDW_Web_Accounts_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History (Date, Initials, Notes)
|
||||
10/24/18 dmb Initial development.
|
||||
11/21/18 dmb [SRPFW-257] Finish core functionality.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_WEB_ACCOUNTS
|
||||
|
||||
$insert LOGICAL
|
||||
$insert MSG_EQUATES
|
||||
$insert WEB_ACCOUNTS_EQUATES
|
||||
|
||||
Equ EVENT_CONTINUE$ to 1
|
||||
Equ EVENT_STOP$ to 0
|
||||
Equ SetupTable$ to 'SYSENV'
|
||||
|
||||
Declare subroutine WebAccounts_Services, Set_Property, PlaceDialog, End_Dialog, Msg, Send_Event, Send_Message
|
||||
Declare subroutine Error_Services, HTTP_Authentication_Services
|
||||
Declare function WebAccounts_Services, Get_Property, Memory_Services, HTTP_Authentication_Services, Error_Services
|
||||
Declare function RTI_CreateGUID, Popup
|
||||
|
||||
// Get the design time name of the window in case this is a multi-instance window.
|
||||
Window = @Window[1, 'F*']
|
||||
|
||||
// Always get the CtrlClassID since we are not passing it through the event parameters.
|
||||
CtrlClassId = Get_Property(CtrlEntId, 'TYPE')
|
||||
|
||||
// Get the name of the control on the window based on the CtrlClassId.
|
||||
Begin Case
|
||||
Case CtrlClassId EQ 'WINDOW'
|
||||
Control = Window
|
||||
Case CtrlClassId EQ 'RADIOBUTTON'
|
||||
Debug
|
||||
* Control = Field(CtrlEntId, '.', 2, 2)
|
||||
Control = Field(CtrlEntId, '.', 2, 1)
|
||||
Case CtrlClassId EQ 'MENU'
|
||||
Control = CtrlEntId[-1, 'B.']
|
||||
Case 1
|
||||
Control = Field(CtrlEntId, '.', 2, 1)
|
||||
End Case
|
||||
|
||||
If Event EQ 'OLE' then GoSub TransferParams
|
||||
GoToEvent Event for CtrlEntID
|
||||
If Event EQ 'OLE' then GoSub RestoreParams
|
||||
|
||||
Return EventFlow OR EVENT_CONTINUE$
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Events
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
GoSub SetupOLEControls
|
||||
|
||||
PlaceDialog(-2, -2)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event EDL_ID.LOSTFOCUS(Flag, FocusID)
|
||||
|
||||
GotFocusID = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE')
|
||||
ID = Get_Property(CtrlEntId, 'TEXT')
|
||||
If GotFocusID NE ID then
|
||||
WebAccountRow = WebAccounts_Services('GetWebAccounts', ID)
|
||||
If Error_Services('NoError') then
|
||||
GoSub UpdateForm
|
||||
end
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event EDL_ID.OPTIONS()
|
||||
|
||||
ID = Popup(@Window, '', 'WEB_ACCOUNTS')
|
||||
If ID NE '' AND ID NE Char(27) then
|
||||
Set_Property(CtrlEntId, 'GOTFOCUS_VALUE', '')
|
||||
Set_Property(CtrlEntId, 'TEXT', ID)
|
||||
Send_Event(CtrlEntId, 'LOSTFOCUS')
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event OLE_ACTION_BAR.OnClick(Group, Item, Point, Button, Shift, Ctrl)
|
||||
|
||||
ResetAttempts = False$
|
||||
|
||||
Begin Case
|
||||
Case Group EQ 1
|
||||
Begin Case
|
||||
Case Item EQ 1
|
||||
// Clear Form
|
||||
ID = ''
|
||||
WebAccountRow = ''
|
||||
GoSub UpdateForm
|
||||
Set_Property('SYSTEM', 'FOCUS', @Window : '.EDL_ID')
|
||||
Set_Property(@Window : '.EDL_ID', 'GOTFOCUS_VALUE', '')
|
||||
|
||||
Case Item EQ 2
|
||||
// Close Form
|
||||
Set_Property(@Window, 'TIMER', 1 : @FM : 1)
|
||||
End Case
|
||||
Case Group EQ 2
|
||||
Begin Case
|
||||
Case Item EQ 1
|
||||
// New Account
|
||||
GoSub CreateNewWebAccount
|
||||
Case Item EQ 2
|
||||
// Save Account
|
||||
GoSub UpdateWebAccount
|
||||
End Case
|
||||
Case Group EQ 3
|
||||
Begin Case
|
||||
Case Item EQ 1
|
||||
// Reset Password
|
||||
ID = Get_Property(@Window : '.EDL_ID', 'TEXT')
|
||||
If ID NE '' then
|
||||
CurrentPassword = HTTP_Authentication_Services('GetWebAccountPassword', ID, False$)
|
||||
Password = HTTP_Authentication_Services('ResetWebAccountPassword', ID, CurrentPassword)
|
||||
If Error_Services('NoError') then
|
||||
WebAccountRow = WebAccounts_Services('GetWebAccounts', ID)
|
||||
If Error_Services('NoError') then
|
||||
GoSub UpdateForm
|
||||
end
|
||||
end else
|
||||
MsgStruct = ''
|
||||
MsgStruct<MTEXT$> = Error_Services('GetMessage')
|
||||
MsgStruct<MTYPE$> = 'BO'
|
||||
MsgStruct<MICON$> = 'H'
|
||||
MsgStruct<MCAPTION$> = 'SRP HTTP Framework'
|
||||
Msg(@Window, MsgStruct)
|
||||
end
|
||||
end
|
||||
Case Item EQ 2
|
||||
// Reset Attempts
|
||||
ResetAttempts = True$
|
||||
GoSub UpdateWebAccount
|
||||
If Error_Services('NoError') then
|
||||
Set_Property(@Window : '.EDL_INVALID_PASSWORD_ATTEMPTS', 'INVALUE', 0)
|
||||
end
|
||||
Case Item EQ 3
|
||||
// Copy to Clipboard
|
||||
AccountID = Get_Property(@Window : '.EDL_ID', 'INVALUE')
|
||||
Name = Get_Property(@Window : '.EDL_NAME', 'INVALUE')
|
||||
Password = Get_Property(@Window : '.EDL_CURRENT_PASSWORD', 'INVALUE')
|
||||
Clipboard = 'Account ID: ' : AccountID : \0D0A\ : 'Name: ' : Name : \0D0A\ : 'Password: ' : Password
|
||||
Set_Property('CLIPBOARD', 'TEXT', Clipboard)
|
||||
End Case
|
||||
End Case
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event OLE_SUBCLASS.OnOptionClick(CtrlId)
|
||||
|
||||
Send_Event(CtrlId, 'OPTIONS')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal Gosubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
SetupOLEControls:
|
||||
|
||||
// All OLE controls can use this qualify configuration.
|
||||
Qualify = ''
|
||||
Qualify<1> = 1
|
||||
Qualify<3> = ''
|
||||
Qualify<4> = 0
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// SRP ShortcutBar Control
|
||||
//
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
Ctrl = @Window : '.OLE_ACTION_BAR'
|
||||
Set_Property(Ctrl, 'OLE.Border', 'XP Flat')
|
||||
Set_Property(Ctrl, 'OLE.Animation', 'Never')
|
||||
Set_Property(Ctrl, 'OLE.Theme', 'Office2007Blue')
|
||||
Set_Property(Ctrl, 'OLE.GroupFont', 'Segoe UI' : @SVM : 11 : @SVM : 400)
|
||||
Set_Property(Ctrl, 'OLE.ItemFont', 'Segoe UI' : @SVM : 9 : @SVM : 400)
|
||||
Set_Property(Ctrl, 'OLE.GroupCount', 3)
|
||||
Set_Property(Ctrl, 'OLE.GroupCaption[1]', 'Form Actions')
|
||||
Set_Property(Ctrl, 'OLE.GroupCaption[2]', 'Account Actions')
|
||||
Set_Property(Ctrl, 'OLE.GroupCaption[3]', 'Password Actions')
|
||||
Set_Property(Ctrl, 'OLE.GroupExpandable[All]', False$)
|
||||
Set_Property(Ctrl, 'OLE.GroupSpecial[All]', True$)
|
||||
Set_Property(Ctrl, 'OLE.GroupItemCount[1]', 2)
|
||||
Set_Property(Ctrl, 'OLE.ItemCaption[1;1]', 'Clear Form')
|
||||
Set_Property(Ctrl, 'OLE.ItemCaption[1;2]', 'Close Form')
|
||||
Set_Property(Ctrl, 'OLE.GroupItemCount[2]', 2)
|
||||
Set_Property(Ctrl, 'OLE.ItemCaption[2;1]', 'New Account')
|
||||
Set_Property(Ctrl, 'OLE.ItemCaption[2;2]', 'Save Account')
|
||||
Set_Property(Ctrl, 'OLE.GroupItemCount[3]', 3)
|
||||
Set_Property(Ctrl, 'OLE.ItemCaption[3;1]', 'Reset Password')
|
||||
Set_Property(Ctrl, 'OLE.ItemCaption[3;2]', 'Reset Attempts')
|
||||
Set_Property(Ctrl, 'OLE.ItemCaption[3;3]', 'Copy to Clipboard')
|
||||
Margins = 0 : @FM : 0 : @FM : 0 : @FM : 0 : @FM : 0
|
||||
Set_Property(Ctrl, 'OLE.HotTrackStyle', 'Item')
|
||||
Set_Property(Ctrl, 'OLE.ItemBold[All; All]', True$)
|
||||
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', Qualify)
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// SRP Subclass Control
|
||||
//
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
Ctrl = @Window : '.OLE_SUBCLASS'
|
||||
EditCtrls = 'EDL_ID'
|
||||
NumCtrls = DCount(EditCtrls, ',')
|
||||
For EditCnt = 1 to NumCtrls
|
||||
EditCtrl = Field(EditCtrls, ',', EditCnt, 1)
|
||||
Handle = Get_Property(@Window : '.' : EditCtrl, 'HANDLE')
|
||||
Send_Message(Ctrl, 'OLE.Subclass', Handle, @Window : '.' : EditCtrl)
|
||||
Set_Property(Ctrl, 'OLE.OptionButton[' : @Window : ';' : EditCtrl : ']', True$)
|
||||
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnOptionClick', Qualify)
|
||||
Next EditCnt
|
||||
|
||||
return
|
||||
|
||||
|
||||
TransferParams:
|
||||
|
||||
// ActiveX controls pass their own event names through Param1. Modify the parameter values so they conform to
|
||||
// OpenInsight event parameter values. This will allow commuter modules to be structured the same for OpenInsight
|
||||
// event and ActiveX (OLE) events.
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
Transfer Param9 to Param8
|
||||
Transfer Param10 to Param9
|
||||
Transfer Param11 to Param10
|
||||
Transfer Param12 to Param11
|
||||
Transfer Param13 to Param12
|
||||
Transfer Param14 to Param13
|
||||
Transfer Param15 to Param14
|
||||
|
||||
return
|
||||
|
||||
|
||||
RestoreParams:
|
||||
|
||||
// Restore the event parameters so the rest of the event chain will see the parameter values as they were originally
|
||||
// created by OpenInsight. This will also prevent the parameter values from being transferred multiple times in case
|
||||
// there are multiple OLE promoted event handlers (e.g. APPNAME*..OIWIN* and APPNAME*OLE..OIWIN*).
|
||||
Transfer Param14 to Param15
|
||||
Transfer Param13 to Param14
|
||||
Transfer Param12 to Param13
|
||||
Transfer Param11 to Param12
|
||||
Transfer Param10 to Param11
|
||||
Transfer Param9 to Param10
|
||||
Transfer Param8 to Param9
|
||||
Transfer Param7 to Param8
|
||||
Transfer Param6 to Param7
|
||||
Transfer Param5 to Param6
|
||||
Transfer Param4 to Param5
|
||||
Transfer Param3 to Param4
|
||||
Transfer Param2 to Param3
|
||||
Transfer Param1 to Param2
|
||||
Transfer Event to Param1
|
||||
Event = 'OLE'
|
||||
|
||||
return
|
||||
|
||||
|
||||
UpdateForm:
|
||||
|
||||
Set_Property(@Window : '.EDL_ID', 'INVALUE', ID)
|
||||
Set_Property(@Window : '.EDL_NAME', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.NAME$>)
|
||||
Set_Property(@Window : '.COB_ACCOUNT_ENABLED', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.ACCOUNT_ENABLED$>)
|
||||
Set_Property(@Window : '.EDL_CURRENT_PASSWORD', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.CURRENT_PASSWORD$>)
|
||||
Set_Property(@Window : '.EDL_CURRENT_PASSWORD_CREATE_DATE', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.CURRENT_PASSWORD_CREATE_DATE$>)
|
||||
Set_Property(@Window : '.EDL_CURRENT_PASSWORD_CREATE_TIME', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.CURRENT_PASSWORD_CREATE_TIME$>)
|
||||
Set_Property(@Window : '.EDL_CURRENT_PASSWORD_EXPIRE_DATE', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.CURRENT_PASSWORD_EXPIRE_DATE$>)
|
||||
Set_Property(@Window : '.EDL_CURRENT_PASSWORD_EXPIRE_TIME', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.CURRENT_PASSWORD_EXPIRE_TIME$>)
|
||||
Set_Property(@Window : '.EDL_OLD_PASSWORD', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.OLD_PASSWORD$>)
|
||||
Set_Property(@Window : '.EDL_OLD_PASSWORD_CREATE_DATE', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.OLD_PASSWORD_CREATE_DATE$>)
|
||||
Set_Property(@Window : '.EDL_OLD_PASSWORD_CREATE_TIME', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.OLD_PASSWORD_CREATE_TIME$>)
|
||||
Set_Property(@Window : '.EDL_OLD_PASSWORD_EXPIRE_DATE', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.OLD_PASSWORD_EXPIRE_DATE$>)
|
||||
Set_Property(@Window : '.EDL_OLD_PASSWORD_EXPIRE_TIME', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.OLD_PASSWORD_EXPIRE_TIME$>)
|
||||
Set_Property(@Window : '.EDL_INVALID_PASSWORD_ATTEMPTS', 'INVALUE', WebAccountRow<WEB_ACCOUNTS.INVALID_PASSWORD_ATTEMPTS$>)
|
||||
|
||||
return
|
||||
|
||||
|
||||
CreateNewWebAccount:
|
||||
|
||||
Send_Event(@Window : '.OLE_ACTION_BAR', 'OLE', 'OnClick', 1, 1)
|
||||
ID = RTI_CreateGUID('B')
|
||||
Convert '.,' to '' in ID
|
||||
ID = ID[1, 6]
|
||||
WebAccountRow = ''
|
||||
WebAccountRow<WEB_ACCOUNTS.ACCOUNT_ENABLED$> = True$
|
||||
WebAccountRow<WEB_ACCOUNTS.INVALID_PASSWORD_ATTEMPTS$> = 0
|
||||
WebAccounts_Services('SetWebAccounts', ID, WebAccountRow)
|
||||
If Error_Services('NoError') then
|
||||
HTTP_Authentication_Services('ResetWebAccountPassword', ID)
|
||||
If Error_Services('NoError') then
|
||||
Set_Property(@Window : '.EDL_ID', 'INVALUE', ID)
|
||||
WebAccountRow = WebAccounts_Services('GetWebAccounts', ID)
|
||||
If Error_Services('NoError') then
|
||||
GoSub UpdateForm
|
||||
Set_Property(@Window : '.EDL_NAME', 'FOCUS', True$)
|
||||
end else
|
||||
MsgStruct = ''
|
||||
MsgStruct<MTEXT$> = Error_Services('GetMessage')
|
||||
MsgStruct<MTYPE$> = 'BO'
|
||||
MsgStruct<MICON$> = 'H'
|
||||
MsgStruct<MCAPTION$> = 'SRP HTTP Framework'
|
||||
Msg(@Window, MsgStruct)
|
||||
end
|
||||
end else
|
||||
MsgStruct = ''
|
||||
MsgStruct<MTEXT$> = Error_Services('GetMessage')
|
||||
MsgStruct<MTYPE$> = 'BO'
|
||||
MsgStruct<MICON$> = 'H'
|
||||
MsgStruct<MCAPTION$> = 'SRP HTTP Framework'
|
||||
Msg(@Window, MsgStruct)
|
||||
end
|
||||
end else
|
||||
MsgStruct = ''
|
||||
MsgStruct<MTEXT$> = Error_Services('GetMessage')
|
||||
MsgStruct<MTYPE$> = 'BO'
|
||||
MsgStruct<MICON$> = 'H'
|
||||
MsgStruct<MCAPTION$> = 'SRP HTTP Framework'
|
||||
Msg(@Window, MsgStruct)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
UpdateWebAccount:
|
||||
|
||||
ID = Get_Property(@Window : '.EDL_ID', 'INVALUE')
|
||||
WebAccountRow = ''
|
||||
WebAccountRow<WEB_ACCOUNTS.NAME$> = Get_Property(@Window : '.EDL_NAME', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.ACCOUNT_ENABLED$> = Get_Property(@Window : '.COB_ACCOUNT_ENABLED', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.CURRENT_PASSWORD$> = Get_Property(@Window : '.EDL_CURRENT_PASSWORD', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.CURRENT_PASSWORD_CREATE_DATE$> = Get_Property(@Window : '.EDL_CURRENT_PASSWORD_CREATE_DATE', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.CURRENT_PASSWORD_CREATE_TIME$> = Get_Property(@Window : '.EDL_CURRENT_PASSWORD_CREATE_TIME', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.CURRENT_PASSWORD_EXPIRE_DATE$> = Get_Property(@Window : '.EDL_CURRENT_PASSWORD_EXPIRE_DATE', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.CURRENT_PASSWORD_EXPIRE_TIME$> = Get_Property(@Window : '.EDL_CURRENT_PASSWORD_EXPIRE_TIME', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.OLD_PASSWORD$> = Get_Property(@Window : '.EDL_OLD_PASSWORD', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.OLD_PASSWORD_CREATE_DATE$> = Get_Property(@Window : '.EDL_OLD_PASSWORD_CREATE_DATE', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.OLD_PASSWORD_CREATE_TIME$> = Get_Property(@Window : '.EDL_OLD_PASSWORD_CREATE_TIME', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.OLD_PASSWORD_EXPIRE_DATE$> = Get_Property(@Window : '.EDL_OLD_PASSWORD_EXPIRE_DATE', 'INVALUE')
|
||||
WebAccountRow<WEB_ACCOUNTS.OLD_PASSWORD_EXPIRE_TIME$> = Get_Property(@Window : '.EDL_OLD_PASSWORD_EXPIRE_TIME', 'INVALUE')
|
||||
If ResetAttempts EQ True$ then
|
||||
Attempts = 0
|
||||
end else
|
||||
Attempts = Get_Property(@Window : '.EDL_INVALID_PASSWORD_ATTEMPTS', 'INVALUE')
|
||||
end
|
||||
WebAccountRow<WEB_ACCOUNTS.INVALID_PASSWORD_ATTEMPTS$> = Attempts
|
||||
WebAccounts_Services('SetWebAccounts', ID, WebAccountRow)
|
||||
If Error_Services('HasError') then
|
||||
MsgStruct = ''
|
||||
MsgStruct<MTEXT$> = Error_Services('GetMessage')
|
||||
MsgStruct<MTYPE$> = 'BO'
|
||||
MsgStruct<MICON$> = 'H'
|
||||
MsgStruct<MCAPTION$> = 'SRP HTTP Framework'
|
||||
Msg(@Window, MsgStruct)
|
||||
end
|
||||
|
||||
return
|
Reference in New Issue
Block a user