Compare commits
178 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7f9a74f57b | ||
|
|
0385aa8ee5 | ||
|
|
6423f6534c | ||
|
|
ddd72adea3 | ||
|
|
a6e809a3b1 | ||
|
|
c01d5da10f | ||
|
|
087dbe84af | ||
|
|
078ba09cc7 | ||
|
|
14c5a8896f | ||
|
|
57f90954d3 | ||
|
|
a341d06dc8 | ||
|
|
75f1e0d316 | ||
|
|
4bd536f556 | ||
|
|
fcdf6ed0be | ||
|
|
6d64f7f6e0 | ||
|
|
5b0ee02e11 | ||
|
|
55fe32f0fd | ||
|
|
ec1d6b3a5e | ||
|
|
9a807834d2 | ||
|
|
e1cfdba2cc | ||
|
|
9770c26b93 | ||
|
|
a0c9a249f6 | ||
|
|
53aade262e | ||
|
|
a78ad87312 | ||
|
|
ab86b3bcec | ||
|
|
b8087f6333 | ||
|
|
83ce2bd490 | ||
|
|
1f110321b4 | ||
|
|
efc215f58a | ||
|
|
4e1456e432 | ||
|
|
5908f8f332 | ||
|
|
5889bc6ddf | ||
|
|
2084d88117 | ||
|
|
49495ba9c4 | ||
|
|
1a73404c4c | ||
|
|
c66daec294 | ||
|
|
38853937be | ||
|
|
488d4dfcac | ||
|
|
fb96745ede | ||
|
|
9d06065d70 | ||
|
|
464261f09f | ||
|
|
9123619ad1 | ||
|
|
cabd8d28bb | ||
|
|
67eda5d79b | ||
|
|
afb935da72 | ||
|
|
61e201b261 | ||
|
|
fc009892f2 | ||
|
|
732f8b5fce | ||
|
|
ceec3a7616 | ||
|
|
763e6e3314 | ||
|
|
2ad1a531b8 | ||
|
|
c35c216c78 | ||
|
|
0a17fcf0b2 | ||
|
|
b36127c272 | ||
|
|
bd0769c997 | ||
|
|
27c2163784 | ||
|
|
624347b1a0 | ||
|
|
8bbac989cd | ||
|
|
fcb007bc98 | ||
|
|
2f7d2d07bb | ||
|
|
48f60abbfa | ||
|
|
20d19b2670 | ||
|
|
49e35bcd5e | ||
|
|
7a8a36e91b | ||
|
|
a0742c8c43 | ||
|
|
666c3a859f | ||
|
|
fb0620d178 | ||
|
|
1d6b32872b | ||
|
|
af4bc135da | ||
|
|
57483ad4c8 | ||
|
|
fcb2f62646 | ||
|
|
255eb35e7f | ||
|
|
22168d281f | ||
|
|
1438e55686 | ||
|
|
fd92b1c287 | ||
|
|
548281a3d7 | ||
|
|
e8d3338d9b | ||
|
|
40302fed4b | ||
|
|
edc1133023 | ||
|
|
bdb89a4bf9 | ||
|
|
0bb396eae4 | ||
|
|
f58c24be74 | ||
|
|
a58eced7bf | ||
|
|
22d87b8a62 | ||
|
|
ff9ae98887 | ||
|
|
44da46083e | ||
|
|
5916ccedb3 | ||
|
|
35d63d072c | ||
|
|
09d379d611 | ||
|
|
fcb189a4cd | ||
|
|
9d42ccc1d4 | ||
|
|
238f6e29ae | ||
|
|
ddb2527eb8 | ||
|
|
97a4c0aa45 | ||
|
|
4b975b1892 | ||
|
|
74e227ae27 | ||
|
|
69501b4623 | ||
|
|
36c713ba3f | ||
|
|
17a2905b14 | ||
|
|
df7155f061 | ||
|
|
52ecfda6c5 | ||
|
|
4900ef4888 | ||
|
|
150a9ab502 | ||
|
|
d3ba6c008a | ||
|
|
f1eb4b64d1 | ||
|
|
976feec650 | ||
|
|
073b9a72e2 | ||
|
|
ad299b227b | ||
|
|
7d3b99c1fd | ||
|
|
57771d94b7 | ||
|
|
d1bedf3e1c | ||
|
|
c4eb824c32 | ||
|
|
ab1e19b340 | ||
|
|
ba646a6c22 | ||
|
|
7e8b01c2aa | ||
|
|
7b907190f9 | ||
|
|
7f484bc1a1 | ||
|
|
c053d5d461 | ||
|
|
5b3d19e134 | ||
|
|
d885d2cd90 | ||
|
|
9f50bb1397 | ||
|
|
f7f688d1a5 | ||
|
|
81ff34014a | ||
|
|
9e0c515af0 | ||
|
|
9391d8778f | ||
|
|
1cfe5a1ea9 | ||
|
|
8d1835f6f5 | ||
|
|
3be5a8765f | ||
|
|
0f01624380 | ||
|
|
3ff2fff728 | ||
|
|
f383f3c056 | ||
|
|
69f995bd6d | ||
|
|
64a550e8e8 | ||
|
|
31ed9ee875 | ||
|
|
0722a9ca26 | ||
|
|
a21bbd4459 | ||
|
|
4ff546b105 | ||
|
|
2463d4267d | ||
|
|
6b37b05dbf | ||
|
|
d34fdf00b3 | ||
|
|
37543ec167 | ||
|
|
7dda6a224d | ||
|
|
993ae2a755 | ||
|
|
c79dc039e6 | ||
|
|
a26c9d8f08 | ||
|
|
f55a117051 | ||
|
|
e05cee514c | ||
|
|
d63c0fbfdf | ||
|
|
f49734560e | ||
|
|
5d3f7148bb | ||
|
|
2629295f93 | ||
|
|
a6ad17dbe1 | ||
|
|
b7022c22c1 | ||
|
|
907d8d01d6 | ||
|
|
fc82c43072 | ||
|
|
37b6f3419e | ||
|
|
b96affd4fd | ||
|
|
8d733f83ab | ||
|
|
58cc8a7b39 | ||
|
|
e09926aa80 | ||
|
|
13969a95cc | ||
|
|
5c9fa4e284 | ||
|
|
3512f7f5cf | ||
|
|
6847a1e262 | ||
|
|
c917d0ef04 | ||
|
|
784ad9947f | ||
|
|
91c629ed81 | ||
|
|
5d415812fa | ||
|
|
f127b4c06b | ||
|
|
cc30d305d5 | ||
|
|
02eebc5f1e | ||
|
|
a2da2e39fc | ||
|
|
f646eb4057 | ||
|
|
3b4127ba91 | ||
|
|
a538213ed0 | ||
|
|
86be1e5140 | ||
|
|
b15ea79c93 | ||
|
|
b67529c596 |
891
01_DCS/Hooks/Perun.lua
Normal file
@@ -0,0 +1,891 @@
|
|||||||
|
-- Perun for DCS World https://github.com/szporwolik/perun -> DCS Hook component
|
||||||
|
|
||||||
|
-- Initial init
|
||||||
|
local Perun = {}
|
||||||
|
package.path = package.path..";"..lfs.currentdir().."/LuaSocket/?.lua"
|
||||||
|
package.cpath = package.cpath..";"..lfs.currentdir().."/LuaSocket/?.dll"
|
||||||
|
|
||||||
|
-- ###################### SETTINGS - DO NOT MODIFY OUTSIDE THIS SECTION #############################
|
||||||
|
|
||||||
|
Perun.RefreshStatus = 15 -- (int) [default: 60] Base refresh rate in seconds to send status update
|
||||||
|
Perun.RefreshMission = 60 -- (int) [default: 120] Refresh rate in seconds to send mission information
|
||||||
|
Perun.TCPTargetPort = 48622 -- (int) [default: 48621] TCP port to send data to
|
||||||
|
Perun.TCPPerunHost = "localhost" -- (string) [default: "localhost"] IP adress of the Perun instance or "localhost"
|
||||||
|
Perun.Instance = 2 -- (int) [default: 1] Id number of instance (if multiple DCS instances are to run at the same PC)
|
||||||
|
Perun.JsonStatusLocation = "Scripts\\Json\\" -- (string) [default: "Scripts\\Json\\"] Folder relative do user's SaveGames DCS folder -> status file updated each RefreshMission
|
||||||
|
Perun.MissionStartNoDeathWindow = 300 -- (int) [default: 300] Number of secounds after mission start when death of the pilot will not go to statistics, shall avoid death penalty during spawning DCS bugs
|
||||||
|
Perun.DebugMode = 2 -- (int) [0 (default),1,2] Value greater than 0 will display Perun information in DCS log file, values: 1 - minimal verbose, 2 - all log information will be logged
|
||||||
|
Perun.LogServerMessages = 1 -- (int) [0,1 (default)] Set to 1 if you want to log also the chat messages send by server
|
||||||
|
Perun.MOTD_L1 = "Witamy na serwerze Gildia.org !" -- (string) Message send to players connecting the server - Line 1
|
||||||
|
Perun.MOTD_L2 = "Wymagamy obecnosci DCS SRS oraz TeamSpeak - szczegoly na forum" -- (string) Message send to players connecting the server - Line 2
|
||||||
|
|
||||||
|
-- ###################### END OF SETTINGS - DO NOT MODIFY OUTSIDE THIS SECTION ######################
|
||||||
|
|
||||||
|
-- Variable init
|
||||||
|
Perun.Version = "v0.9.0"
|
||||||
|
Perun.StatusData = {}
|
||||||
|
Perun.SlotsData = {}
|
||||||
|
Perun.MissionData = {}
|
||||||
|
Perun.ServerData = {}
|
||||||
|
Perun.StatData = {}
|
||||||
|
Perun.StatDataLastType = {}
|
||||||
|
Perun.MissionHash=""
|
||||||
|
Perun.lastSentStatus = 0
|
||||||
|
Perun.lastSentMission = 0
|
||||||
|
Perun.lastSentKeepAlive = 0
|
||||||
|
Perun.lastConnectionError = 0
|
||||||
|
Perun.lastReconnect = 0
|
||||||
|
Perun.SendRetries = 3
|
||||||
|
Perun.RefreshKeepAlive = 3
|
||||||
|
Perun.JsonStatusLocation = lfs.writedir() .. Perun.JsonStatusLocation
|
||||||
|
Perun.socket = require("socket")
|
||||||
|
Perun.IsServer = true --DCS.isServer( ) -- TBD looks like DCS API error, always returning True
|
||||||
|
Perun.ConnectionError = "[Perun] ERROR: Connection broken - contact server admin!"
|
||||||
|
|
||||||
|
-- ################################ Helper function definitions ################################
|
||||||
|
function stripChars(str)
|
||||||
|
-- Hellper functions removes accents characters from string
|
||||||
|
-- via https://stackoverflow.com/questions/50459102/replace-accented-characters-in-string-to-standard-with-lua
|
||||||
|
local _tableAccents = {}
|
||||||
|
_tableAccents["à"] = "a"
|
||||||
|
_tableAccents["á"] = "a"
|
||||||
|
_tableAccents["â"] = "a"
|
||||||
|
_tableAccents["ã"] = "a"
|
||||||
|
_tableAccents["ä"] = "a"
|
||||||
|
_tableAccents["ç"] = "c"
|
||||||
|
_tableAccents["è"] = "e"
|
||||||
|
_tableAccents["é"] = "e"
|
||||||
|
_tableAccents["ê"] = "e"
|
||||||
|
_tableAccents["ë"] = "e"
|
||||||
|
_tableAccents["ì"] = "i"
|
||||||
|
_tableAccents["í"] = "i"
|
||||||
|
_tableAccents["î"] = "i"
|
||||||
|
_tableAccents["ï"] = "i"
|
||||||
|
_tableAccents["ñ"] = "n"
|
||||||
|
_tableAccents["ò"] = "o"
|
||||||
|
_tableAccents["ó"] = "o"
|
||||||
|
_tableAccents["ô"] = "o"
|
||||||
|
_tableAccents["õ"] = "o"
|
||||||
|
_tableAccents["ö"] = "o"
|
||||||
|
_tableAccents["ù"] = "u"
|
||||||
|
_tableAccents["ú"] = "u"
|
||||||
|
_tableAccents["û"] = "u"
|
||||||
|
_tableAccents["ü"] = "u"
|
||||||
|
_tableAccents["ý"] = "y"
|
||||||
|
_tableAccents["ÿ"] = "y"
|
||||||
|
_tableAccents["À"] = "A"
|
||||||
|
_tableAccents["Á"] = "A"
|
||||||
|
_tableAccents["Â"] = "A"
|
||||||
|
_tableAccents["Ã"] = "A"
|
||||||
|
_tableAccents["Ä"] = "A"
|
||||||
|
_tableAccents["Ç"] = "C"
|
||||||
|
_tableAccents["È"] = "E"
|
||||||
|
_tableAccents["É"] = "E"
|
||||||
|
_tableAccents["Ê"] = "E"
|
||||||
|
_tableAccents["Ë"] = "E"
|
||||||
|
_tableAccents["Ì"] = "I"
|
||||||
|
_tableAccents["Í"] = "I"
|
||||||
|
_tableAccents["Î"] = "I"
|
||||||
|
_tableAccents["Ï"] = "I"
|
||||||
|
_tableAccents["Ñ"] = "N"
|
||||||
|
_tableAccents["Ò"] = "O"
|
||||||
|
_tableAccents["Ó"] = "O"
|
||||||
|
_tableAccents["Ô"] = "O"
|
||||||
|
_tableAccents["Õ"] = "O"
|
||||||
|
_tableAccents["Ö"] = "O"
|
||||||
|
_tableAccents["Ù"] = "U"
|
||||||
|
_tableAccents["Ú"] = "U"
|
||||||
|
_tableAccents["Û"] = "U"
|
||||||
|
_tableAccents["Ü"] = "U"
|
||||||
|
_tableAccents["Ý"] = "Y"
|
||||||
|
|
||||||
|
-- Polish accents
|
||||||
|
_tableAccents["ę"] = "e"
|
||||||
|
_tableAccents["Ę"] = "Ę"
|
||||||
|
_tableAccents["ó"] = "o"
|
||||||
|
_tableAccents["Ó"] = "O"
|
||||||
|
_tableAccents["ą"] = "a"
|
||||||
|
_tableAccents["Ą"] = "A"
|
||||||
|
_tableAccents["ś"] = "s"
|
||||||
|
_tableAccents["Ś"] = "S"
|
||||||
|
_tableAccents["ć"] = "c"
|
||||||
|
_tableAccents["Ć"] = "C"
|
||||||
|
_tableAccents["ż"] = "z"
|
||||||
|
_tableAccents["Ż"] = "Z"
|
||||||
|
_tableAccents["ź"] = "z"
|
||||||
|
_tableAccents["Ź"] = "Z"
|
||||||
|
_tableAccents["ł"] = "l"
|
||||||
|
_tableAccents["Ł"] = "L"
|
||||||
|
|
||||||
|
-- TBD additonal characters for other languages
|
||||||
|
|
||||||
|
-- Check string and replace special chars via replacement table
|
||||||
|
local _normalizedString = ''
|
||||||
|
for _strChar in string.gmatch(str, "([%z\1-\127\194-\244][\128-\191]*)") do
|
||||||
|
if _tableAccents[_strChar] ~= nil then
|
||||||
|
-- Replace char
|
||||||
|
_normalizedString = _normalizedString.._tableAccents[_strChar]
|
||||||
|
else
|
||||||
|
-- No need to replace
|
||||||
|
_normalizedString = _normalizedString.._strChar
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return _normalizedString
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.GetCategory = function(id)
|
||||||
|
-- Helper function returns object category basing on I via https://pastebin.com/GUAXrd2U TBD: rewrite
|
||||||
|
local _killed_target_category = DCS.getUnitTypeAttribute(id, "category")
|
||||||
|
|
||||||
|
-- Below, simple hack to get the propper category when DCS API is not returning correct value
|
||||||
|
if _killed_target_category == nil then
|
||||||
|
local _killed_target_cat_check_ship = DCS.getUnitTypeAttribute(id, "DeckLevel")
|
||||||
|
local _killed_target_cat_check_plane = DCS.getUnitTypeAttribute(id, "WingSpan")
|
||||||
|
if _killed_target_cat_check_ship ~= nil and _killed_target_cat_check_plane == nil then
|
||||||
|
_killed_target_category = "Ships"
|
||||||
|
elseif _killed_target_cat_check_ship == nil and _killed_target_cat_check_plane ~= nil then
|
||||||
|
_killed_target_category = "Planes"
|
||||||
|
else
|
||||||
|
_killed_target_category = "Helicopters"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return _killed_target_category
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.SideID2Name = function(id)
|
||||||
|
-- Helper function returns side name per side (coalition) id
|
||||||
|
local _sides = {
|
||||||
|
[0] = 'SPECTATOR',
|
||||||
|
[1] = 'RED',
|
||||||
|
[2] = 'BLUE',
|
||||||
|
[3] = 'NEUTRAL', -- TBD check once this is released in DCS
|
||||||
|
}
|
||||||
|
return _sides[id]
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.AddLog = function(text,LogLevel)
|
||||||
|
-- Adds logs to DCS.log file
|
||||||
|
LogLevel = LogLevel or 1
|
||||||
|
if Perun.DebugMode >= LogLevel then
|
||||||
|
net.log("[Perun] ".. text)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.GenerateMissionHash = function()
|
||||||
|
-- Generates unique simulation mission hash
|
||||||
|
return DCS.getMissionName( ).."@".. Perun.Instance .. "@" .. Perun.Version .. "@".. os.date('%Y%m%d_%H%M%S')
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.GetMulticrewAllParameters = function (PlayerId)
|
||||||
|
-- Gets all multicrew parameters
|
||||||
|
local _result = ""
|
||||||
|
local _player_slot=net.get_player_info(PlayerId, 'slot')
|
||||||
|
local _master_type= "?"
|
||||||
|
local _master_slot = nil
|
||||||
|
local _sub_slot = nil
|
||||||
|
|
||||||
|
if _player_slot and _player_slot ~= '' and not (string.find(_player_slot, 'red') or string.find(_player_slot, 'blue')) then
|
||||||
|
-- Player took model
|
||||||
|
_master_slot = _player_slot
|
||||||
|
_sub_slot =0
|
||||||
|
|
||||||
|
if (not tonumber(_player_slot)) then
|
||||||
|
-- If this is multiseat slot parse master slot and look for seat number
|
||||||
|
_t_start, _t_end = string.find(_player_slot, '_%d+')
|
||||||
|
|
||||||
|
if _t_start then
|
||||||
|
-- This is co-player
|
||||||
|
_master_slot = string.sub(_player_slot, 0 , _t_start -1 )
|
||||||
|
_sub_slot = string.sub(_player_slot, _t_start + 1, _t_end )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
_master_type = DCS.getUnitType(_master_slot)
|
||||||
|
|
||||||
|
elseif string.find(_player_slot, 'red') or string.find(_player_slot, 'blue') then
|
||||||
|
-- Deal with the special slots addded by Combined Arms and Spectators
|
||||||
|
if string.find(_player_slot, 'artillery_commander') then
|
||||||
|
_master_type = "artillery_commander"
|
||||||
|
elseif string.find(_player_slot, 'instructor') then
|
||||||
|
_master_type = "instructor"
|
||||||
|
elseif string.find(_player_slot, 'forward_observer') then
|
||||||
|
_master_type = "forward_observer"
|
||||||
|
elseif string.find(_player_slot, 'observer') then
|
||||||
|
_master_type = "observer"
|
||||||
|
end
|
||||||
|
_master_slot = -1
|
||||||
|
_sub_slot = 0
|
||||||
|
end
|
||||||
|
return _master_type,_master_slot,_sub_slot
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.GetMulticrewParameter = function (PlayerId,Parameter)
|
||||||
|
-- Get specific multicrew Parameter
|
||||||
|
_master_type,_master_slot,_sub_slot = Perun.GetMulticrewAllParameters(PlayerId)
|
||||||
|
|
||||||
|
if Parameter == "mastertype" then
|
||||||
|
return _master_type
|
||||||
|
elseif Parameter == "masterslot" then
|
||||||
|
return _master_slot
|
||||||
|
elseif Parameter == "subslot" then
|
||||||
|
return _sub_slot
|
||||||
|
elseif Parameter == "subtype" then
|
||||||
|
if _sub_slot == 0 then
|
||||||
|
return _master_type
|
||||||
|
else
|
||||||
|
return _master_type .. "_" .. _sub_slot
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.GetMulticrewCrew = function (owner_playerID)
|
||||||
|
-- Get all multicrew crew
|
||||||
|
_master_type,_master_slot,_sub_slot = Perun.GetMulticrewAllParameters(owner_playerID)
|
||||||
|
|
||||||
|
local _crew = {}
|
||||||
|
table.insert(_crew, owner_playerID)
|
||||||
|
if _master_type == "F-14B" or _master_type == "Yak-52" or _master_type == "L-39C" or _master_type == "SA342M" or _master_type =="SA342Minigun" or _master_type == "SA342Mistral" or _master_type == "SA342L" then -- TBD add additional multicrew model types
|
||||||
|
local _owner_side=net.get_player_info(owner_playerID, 'side')
|
||||||
|
|
||||||
|
if _master_slot and _master_slot ~= "" then
|
||||||
|
-- Search for all players from crew
|
||||||
|
local _all_players = net.get_player_list()
|
||||||
|
for PlayerIDIndex, _playerID in ipairs(_all_players) do
|
||||||
|
local _playerDetails = net.get_player_info( _playerID )
|
||||||
|
|
||||||
|
if _playerDetails.side == _owner_side and (_playerDetails.slot == _master_slot or _playerDetails.slot == _master_slot .. "_1" or _playerDetails.slot == _master_slot .. "_2" or _playerDetails.slot == _master_slot .. "_3" or _playerDetails.slot == _master_slot .. "_4") and _playerID ~= owner_playerID then
|
||||||
|
-- Add to crew list
|
||||||
|
table.insert(_crew, _playerID)
|
||||||
|
else
|
||||||
|
-- Do nothing
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.AddLog("Multicrew check completed: " .. net.lua2json(_crew),2)
|
||||||
|
return _crew
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.GetMulticrewCrewNames = function (owner_playerID)
|
||||||
|
-- Get all crew names and return as string (needed for logging purposes)
|
||||||
|
local _pilots_accounted = Perun.GetMulticrewCrew(owner_playerID)
|
||||||
|
local _result_text = ""
|
||||||
|
for _, pilotID in ipairs(_pilots_accounted) do
|
||||||
|
_result_text= _result_text .. net.get_player_info(pilotID, "name") .. ", "
|
||||||
|
end
|
||||||
|
return _result_text
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ################################ TCP Connection ################################
|
||||||
|
|
||||||
|
Perun.ConnectToPerun = function ()
|
||||||
|
-- Connects to Perun server
|
||||||
|
Perun.AddLog("Connecting to TCP server",2)
|
||||||
|
Perun.TCP = assert(Perun.socket.tcp())
|
||||||
|
Perun.TCP:settimeout(5000)
|
||||||
|
|
||||||
|
_, _err = Perun.TCP:connect(Perun.TCPPerunHost, Perun.TCPTargetPort)
|
||||||
|
if _err then
|
||||||
|
-- Could not connect
|
||||||
|
Perun.AddLog("ERROR - TCP connection error : " .. _err , 1)
|
||||||
|
else
|
||||||
|
-- Connected
|
||||||
|
Perun.AddLog("Success - connected to TCP server",2)
|
||||||
|
Perun.lastReconnect = _now
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.SendToPerun = function(data_id, data_package)
|
||||||
|
-- Prepares and sends data package
|
||||||
|
local _TempData={}
|
||||||
|
_TempData["type"]=data_id
|
||||||
|
_TempData["payload"]=data_package
|
||||||
|
_TempData["timestamp"]=os.date('%Y-%m-%d %H:%M:%S')
|
||||||
|
_TempData["instance"]=Perun.Instance
|
||||||
|
|
||||||
|
-- Build TCP frame
|
||||||
|
local _TCPFrame="<SOT>" .. stripChars(net.lua2json(_TempData)) .. "<EOT>"
|
||||||
|
|
||||||
|
-- TCP Part - sending
|
||||||
|
local _intStatus = nil
|
||||||
|
local _intTries =0
|
||||||
|
local _err=nil
|
||||||
|
local _dropped = true
|
||||||
|
|
||||||
|
-- Try to send a few times (defind in settings section)
|
||||||
|
while _intStatus == nil and _intTries < Perun.SendRetries do
|
||||||
|
_intStatus, _err = Perun.TCP:send(_TCPFrame)
|
||||||
|
if _err then
|
||||||
|
-- Failure, packet was not send
|
||||||
|
Perun.AddLog("Packed not send : " .. data_id .. " , error: " .. _err .. ", tries: " .. _intTries,2)
|
||||||
|
Perun.ConnectToPerun()
|
||||||
|
else
|
||||||
|
-- Succes, packet was send
|
||||||
|
Perun.AddLog("Packet send : " .. data_id .. " , tries:" .. _intTries,2)
|
||||||
|
_dropped = false
|
||||||
|
end
|
||||||
|
_intTries=_intTries+1
|
||||||
|
end
|
||||||
|
|
||||||
|
if _dropped == true then
|
||||||
|
-- Add information to log file and send chat message to all that Perun connection is broken
|
||||||
|
Perun.AddLog("ERROR - packed dropped : " .. data_id,1)
|
||||||
|
local _now = DCS.getRealTime()
|
||||||
|
if _now > Perun.lastConnectionError + 60 then
|
||||||
|
-- Informs all players that there is Peron error; below hack for DCS net.send_chat not working
|
||||||
|
local _all_players = net.get_player_list()
|
||||||
|
for PlayerIDIndex, _playerID in ipairs(_all_players) do
|
||||||
|
net.send_chat_to(Perun.ConnectionError , _playerID)
|
||||||
|
end
|
||||||
|
-- Reset last error send counter
|
||||||
|
Perun.lastConnectionError = _now
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ################################ Log functions ################################
|
||||||
|
|
||||||
|
Perun.LogChat = function(playerID,msg,all)
|
||||||
|
-- Logs chat messages
|
||||||
|
local _TempData={}
|
||||||
|
_TempData['player']= net.get_player_info(playerID, "name")
|
||||||
|
_TempData['msg']=stripChars(msg)
|
||||||
|
_TempData['all']=all
|
||||||
|
_TempData['ucid']=net.get_player_info(playerID, 'ucid')
|
||||||
|
_TempData['datetime']=os.date('%Y-%m-%d %H:%M:%S')
|
||||||
|
_TempData['missionhash']=Perun.MissionHash
|
||||||
|
|
||||||
|
Perun.AddLog("Sending chat message",2)
|
||||||
|
Perun.SendToPerun(50,_TempData)
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.LogEvent = function(log_type,log_content,log_arg_1,log_arg_2)
|
||||||
|
-- Logs events messages
|
||||||
|
local _TempData={}
|
||||||
|
_TempData['log_type']= log_type
|
||||||
|
_TempData['log_arg_1']= log_arg_1
|
||||||
|
_TempData['log_arg_2']= log_arg_2
|
||||||
|
_TempData['log_content']=log_content
|
||||||
|
_TempData['log_datetime']=os.date('%Y-%m-%d %H:%M:%S')
|
||||||
|
_TempData['log_missionhash']=Perun.MissionHash
|
||||||
|
|
||||||
|
if log_arg_1 == nil then
|
||||||
|
log_arg_1 = "null"
|
||||||
|
end
|
||||||
|
if log_arg_2 == nil then
|
||||||
|
log_arg_2 = "null"
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.AddLog("Sending event data, event: " .. log_type .. ", arg1:" .. log_arg_1 .. ", arg2:" .. log_arg_2 .. ", content: " .. log_content,2)
|
||||||
|
Perun.SendToPerun(51,_TempData)
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.LogStats = function(playerID)
|
||||||
|
-- Log player status
|
||||||
|
local _PlayerStatsTable=Perun.LogStatsGet(playerID)
|
||||||
|
local _TempData={}
|
||||||
|
_TempData['stat_data_perun']=_PlayerStatsTable
|
||||||
|
_TempData['stat_data_type']= _PlayerStatsTable['ps_type'];
|
||||||
|
_TempData['stat_data_masterslot'] = _PlayerStatsTable['ps_masterslot'];
|
||||||
|
_TempData['stat_data_subslot'] = _PlayerStatsTable['ps_subslot'];
|
||||||
|
_TempData['stat_ucid']=net.get_player_info(playerID, 'ucid')
|
||||||
|
_TempData['stat_name']=net.get_player_info(playerID, 'name')
|
||||||
|
_TempData['stat_datetime']=os.date('%Y-%m-%d %H:%M:%S')
|
||||||
|
_TempData['stat_missionhash']=Perun.MissionHash
|
||||||
|
|
||||||
|
Perun.AddLog("Sending stats data",2)
|
||||||
|
Perun.SendToPerun(52,_TempData)
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.LogLogin = function(playerID)
|
||||||
|
-- Player logged in
|
||||||
|
local _TempData={}
|
||||||
|
_TempData['login_ucid']=net.get_player_info(playerID, 'ucid')
|
||||||
|
_TempData['login_ipaddr']=net.get_player_info(playerID, 'ipaddr')
|
||||||
|
_TempData['login_name']=net.get_player_info(playerID, 'name')
|
||||||
|
_TempData['login_datetime']=os.date('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
|
Perun.AddLog("Sending login event",2)
|
||||||
|
Perun.SendToPerun(53,_TempData)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- ################################ Calculate stats ################################
|
||||||
|
|
||||||
|
Perun.LogStatsCount = function(argPlayerID,argAction)
|
||||||
|
-- Creates or updates Perun statistics array
|
||||||
|
local _player_hash=net.get_player_info(argPlayerID, 'ucid')..Perun.GetMulticrewParameter(argPlayerID,"subtype")
|
||||||
|
|
||||||
|
if Perun.StatData[_player_hash] == nil then
|
||||||
|
-- Create empty element
|
||||||
|
local _TempData={}
|
||||||
|
_TempData['ps_type'] = Perun.GetMulticrewParameter(argPlayerID,"subtype")
|
||||||
|
_TempData['ps_masterslot'] = Perun.GetMulticrewParameter(argPlayerID,"masterslot")
|
||||||
|
_TempData['ps_subslot'] = Perun.GetMulticrewParameter(argPlayerID,"subslot")
|
||||||
|
_TempData['ps_pvp'] = 0
|
||||||
|
_TempData['ps_deaths'] = 0
|
||||||
|
_TempData['ps_ejections'] = 0
|
||||||
|
_TempData['ps_crashes'] = 0
|
||||||
|
_TempData['ps_teamkills'] = 0
|
||||||
|
_TempData['ps_kills_planes'] = 0
|
||||||
|
_TempData['ps_kills_helicopters'] = 0
|
||||||
|
_TempData['ps_kills_air_defense'] = 0
|
||||||
|
_TempData['ps_kills_armor'] = 0
|
||||||
|
_TempData['ps_kills_unarmed'] = 0
|
||||||
|
_TempData['ps_kills_infantry'] = 0
|
||||||
|
_TempData['ps_kills_ships'] = 0
|
||||||
|
_TempData['ps_kills_fortification'] = 0
|
||||||
|
_TempData['ps_kills_other'] = 0
|
||||||
|
_TempData['ps_airfield_takeoffs'] = 0
|
||||||
|
_TempData['ps_airfield_landings'] = 0
|
||||||
|
_TempData['ps_ship_takeoffs'] = 0
|
||||||
|
_TempData['ps_ship_landings'] = 0
|
||||||
|
_TempData['ps_farp_takeoffs'] = 0
|
||||||
|
_TempData['ps_farp_landings'] = 0
|
||||||
|
_TempData['ps_other_takeoffs'] = 0
|
||||||
|
_TempData['ps_other_landings'] = 0
|
||||||
|
|
||||||
|
Perun.StatData[_player_hash]=_TempData
|
||||||
|
end
|
||||||
|
|
||||||
|
-- TBD BELLOW SEEMS TO BE OBSOLETE, CHECK AND DELETE
|
||||||
|
if argType ~= nil then
|
||||||
|
Perun.StatData[_player_hash]['ps_type']=Perun.GetMulticrewParameter(argPlayerID,"subtype");
|
||||||
|
Perun.StatDataLastType[net.get_player_info(argPlayerID, 'ucid')]=_player_hash
|
||||||
|
else
|
||||||
|
-- Do nothing
|
||||||
|
end
|
||||||
|
-- TBD ABOVE SEEMS TO BE OBSOLETE, CHECK AND DELETE
|
||||||
|
|
||||||
|
if argAction == "eject" then
|
||||||
|
Perun.StatData[_player_hash]['ps_ejections']=Perun.StatData[_player_hash]['ps_ejections']+1
|
||||||
|
elseif argAction == "pilot_death" then
|
||||||
|
if DCS.getModelTime() > Perun.MissionStartNoDeathWindow then
|
||||||
|
-- we do not track deaths during mission startup due to spawning issues
|
||||||
|
Perun.StatData[_player_hash]['ps_deaths']=Perun.StatData[_player_hash]['ps_deaths']+1
|
||||||
|
end
|
||||||
|
elseif argAction == "friendly_fire" then
|
||||||
|
Perun.StatData[_player_hash]['ps_teamkills']=Perun.StatData[_player_hash]['ps_teamkills']+1
|
||||||
|
elseif argAction == "crash" then
|
||||||
|
Perun.StatData[_player_hash]['ps_crashes']=Perun.StatData[_player_hash]['ps_crashes']+1
|
||||||
|
elseif argAction == "landing_FARP" then
|
||||||
|
Perun.StatData[_player_hash]['ps_farp_landings']=Perun.StatData[_player_hash]['ps_farp_landings']+1
|
||||||
|
elseif argAction == "landing_SHIP" then
|
||||||
|
Perun.StatData[_player_hash]['ps_ship_landings']=Perun.StatData[_player_hash]['ps_ship_landings']+1
|
||||||
|
elseif argAction == "landing_AIRFIELD" then
|
||||||
|
Perun.StatData[_player_hash]['ps_airfield_landings']=Perun.StatData[_player_hash]['ps_airfield_landings']+1
|
||||||
|
elseif argAction == "tookoff_FARP" then
|
||||||
|
Perun.StatData[_player_hash]['ps_farp_takeoffs']=Perun.StatData[_player_hash]['ps_farp_takeoffs']+1
|
||||||
|
elseif argAction == "tookoff_SHIP" then
|
||||||
|
Perun.StatData[_player_hash]['ps_ship_takeoffs']=Perun.StatData[_player_hash]['ps_ship_takeoffs']+1
|
||||||
|
elseif argAction == "tookoff_AIRFIELD" then
|
||||||
|
Perun.StatData[_player_hash]['ps_airfield_takeoffs']=Perun.StatData[_player_hash]['ps_airfield_takeoffs']+1
|
||||||
|
elseif argAction == "kill_Planes" then
|
||||||
|
Perun.StatData[_player_hash]['ps_kills_planes']=Perun.StatData[_player_hash]['ps_kills_planes']+1
|
||||||
|
elseif argAction == "kill_Helicopters" then
|
||||||
|
Perun.StatData[_player_hash]['ps_kills_helicopters']=Perun.StatData[_player_hash]['ps_kills_helicopters']+1
|
||||||
|
elseif argAction == "kill_Ships" then
|
||||||
|
Perun.StatData[_player_hash]['ps_kills_ships']=Perun.StatData[_player_hash]['ps_kills_ships']+1
|
||||||
|
elseif argAction == "kill_Air_Defence" then
|
||||||
|
Perun.StatData[_player_hash]['ps_kills_air_defense']=Perun.StatData[_player_hash]['ps_kills_air_defense']+1
|
||||||
|
elseif argAction == "kill_Unarmed" then
|
||||||
|
Perun.StatData[_player_hash]['ps_kills_unarmed']=Perun.StatData[_player_hash]['ps_kills_unarmed']+1
|
||||||
|
elseif argAction == "kill_Armor" then
|
||||||
|
Perun.StatData[_player_hash]['ps_kills_armor']=Perun.StatData[_player_hash]['ps_kills_armor']+1
|
||||||
|
elseif argAction == "kill_Infantry" then
|
||||||
|
Perun.StatData[_player_hash]['ps_kills_infantry']=Perun.StatData[_player_hash]['ps_kills_infantry']+1
|
||||||
|
elseif argAction == "kill_Fortification" then
|
||||||
|
Perun.StatData[_player_hash]['ps_kills_fortification']=Perun.StatData[_player_hash]['ps_kills_fortification']+1
|
||||||
|
elseif argAction == "kill_Other" then
|
||||||
|
Perun.StatData[_player_hash]['ps_kills_other']=Perun.StatData[_player_hash]['ps_kills_other']+1
|
||||||
|
elseif argAction == "kill_PvP" then
|
||||||
|
Perun.StatData[_player_hash]['ps_pvp']=Perun.StatData[_player_hash]['ps_pvp']+1
|
||||||
|
elseif argAction == "landing_OTHER" then
|
||||||
|
Perun.StatData[_player_hash]['ps_other_landings']=Perun.StatData[_player_hash]['ps_other_landings']+1
|
||||||
|
elseif argAction == "tookoff_OTHER" then
|
||||||
|
Perun.StatData[_player_hash]['ps_other_takeoffs']=Perun.StatData[_player_hash]['ps_other_takeoffs']+1
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Always update slots
|
||||||
|
Perun.StatData[_player_hash]['ps_masterslot'] = Perun.GetMulticrewParameter(argPlayerID,"masterslot")
|
||||||
|
Perun.StatData[_player_hash]['ps_subslot'] = Perun.GetMulticrewParameter(argPlayerID,"subslot")
|
||||||
|
|
||||||
|
Perun.AddLog("Stats data prepared",2)
|
||||||
|
Perun.LogStats(argPlayerID);
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.LogStatsCountCrew = function (MasterPilotID,ActionType)
|
||||||
|
-- Change stats for the whole crew
|
||||||
|
local _pilots_accounted = Perun.GetMulticrewCrew(MasterPilotID)
|
||||||
|
for _, pilotID in ipairs(_pilots_accounted) do
|
||||||
|
Perun.LogStatsCount(pilotID,ActionType)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- ################################ Data preparation ################################
|
||||||
|
|
||||||
|
Perun.LogStatsGet = function(playerID)
|
||||||
|
-- Gets Perun statistics array per player TBD rewrite
|
||||||
|
local next = next -- Make next function local - this improves performance TBD
|
||||||
|
local _player_hash = nil
|
||||||
|
|
||||||
|
if next(Perun.StatDataLastType) == nil then
|
||||||
|
-- Array is empty
|
||||||
|
_player_hash=net.get_player_info(playerID, 'ucid')..Perun.GetMulticrewParameter(playerID,"subtype")
|
||||||
|
elseif Perun.StatDataLastType[net.get_player_info(playerID, 'ucid')]== nil then
|
||||||
|
-- Last type entry is empty
|
||||||
|
_player_hash=net.get_player_info(playerID, 'ucid')..Perun.GetMulticrewParameter(playerID,"subtype")
|
||||||
|
else
|
||||||
|
-- Return last type entry
|
||||||
|
_player_hash=Perun.StatDataLastType[net.get_player_info(playerID, 'ucid')]
|
||||||
|
end
|
||||||
|
|
||||||
|
local next = next -- Make next function local - this improves performance TBD
|
||||||
|
if next(Perun.StatData) == nil then
|
||||||
|
-- Array is empty
|
||||||
|
Perun.LogStatsCount(playerID,'init') -- Init statistics
|
||||||
|
end
|
||||||
|
if Perun.StatData[_player_hash]== nil then
|
||||||
|
-- Stats for player are empty
|
||||||
|
Perun.LogStatsCount(playerID,'init') -- Init statistics
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.AddLog("Getting stats data",2)
|
||||||
|
return Perun.StatData[_player_hash];
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.UpdateJsonStatus = function()
|
||||||
|
-- Updates status json file
|
||||||
|
local _TempData={}
|
||||||
|
_TempData["1"]=Perun.ServerData
|
||||||
|
_TempData["2"]=Perun.StatusData
|
||||||
|
_TempData["3"]=Perun.SlotsData
|
||||||
|
-- _TempData["4"]=Perun.MissionData -- TBD: hangs for some large missions
|
||||||
|
|
||||||
|
-- Export data to JSON file
|
||||||
|
local _perun_export = io.open(Perun.JsonStatusLocation .. "perun_status_data.json", "w")
|
||||||
|
_perun_export:write(net.lua2json(_TempData) .. "\n")
|
||||||
|
_perun_export:close()
|
||||||
|
Perun.AddLog("Updated JSON",2)
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.UpdateStatus = function()
|
||||||
|
-- Main function for status updates
|
||||||
|
|
||||||
|
-- Diagnostic data
|
||||||
|
-- Update version data
|
||||||
|
Perun.ServerData['v_dcs_hook']=Perun.Version
|
||||||
|
|
||||||
|
-- Update clients data - count connected players
|
||||||
|
_playerlist=net.get_player_list()
|
||||||
|
_count = 0
|
||||||
|
for _ in pairs(_playerlist) do _count = _count + 1 end
|
||||||
|
Perun.ServerData['c_players']=_count
|
||||||
|
|
||||||
|
-- Send
|
||||||
|
Perun.AddLog("Sending server data",2)
|
||||||
|
Perun.SendToPerun(1,Perun.ServerData)
|
||||||
|
|
||||||
|
-- Status data - update all subsections
|
||||||
|
-- 1 - Mission data
|
||||||
|
local _TempData={}
|
||||||
|
_TempData['name']=DCS.getMissionName()
|
||||||
|
_TempData['modeltime']=DCS.getModelTime()
|
||||||
|
_TempData['realtime']=DCS.getRealTime()
|
||||||
|
_TempData['pause']=DCS.getPause()
|
||||||
|
_TempData['multiplayer']=DCS.isMultiplayer()
|
||||||
|
_TempData['theatre'] = Perun.MissionData['mission']['theatre']
|
||||||
|
_TempData['weather'] = Perun.MissionData['mission']['weather']
|
||||||
|
Perun.StatusData["mission"] = _TempData
|
||||||
|
|
||||||
|
-- 2 - Players data
|
||||||
|
_PlayersTable={}
|
||||||
|
for _k, _i in ipairs(_playerlist) do
|
||||||
|
_PlayersTable[_k]=net.get_player_info(_i)
|
||||||
|
end
|
||||||
|
Perun.StatusData["players"] = _PlayersTable
|
||||||
|
|
||||||
|
-- Send
|
||||||
|
Perun.AddLog("Sending status data",2)
|
||||||
|
Perun.SendToPerun(2,Perun.StatusData)
|
||||||
|
|
||||||
|
-- Update slots data
|
||||||
|
Perun.SlotsData['coalitions']=DCS.getAvailableCoalitions()
|
||||||
|
Perun.SlotsData['slots']={}
|
||||||
|
|
||||||
|
-- Build up slot table
|
||||||
|
for _j, _i in pairs(Perun.SlotsData['coalitions']) do
|
||||||
|
Perun.SlotsData['slots'][_j]=DCS.getAvailableSlots(_j)
|
||||||
|
|
||||||
|
for _sj, _si in pairs(Perun.SlotsData['slots'][_j]) do
|
||||||
|
Perun.SlotsData['slots'][_j][_sj]['countryName']= nil
|
||||||
|
Perun.SlotsData['slots'][_j][_sj]['onboard_num']= nil
|
||||||
|
Perun.SlotsData['slots'][_j][_sj]['groupSize']= nil
|
||||||
|
Perun.SlotsData['slots'][_j][_sj]['groupName']= nil
|
||||||
|
Perun.SlotsData['slots'][_j][_sj]['callsign']= nil
|
||||||
|
Perun.SlotsData['slots'][_j][_sj]['task']= nil
|
||||||
|
Perun.SlotsData['slots'][_j][_sj]['airdromeId']= nil
|
||||||
|
Perun.SlotsData['slots'][_j][_sj]['helipadName']= nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Send
|
||||||
|
Perun.AddLog("Sending slots data",2)
|
||||||
|
Perun.SendToPerun(3,Perun.SlotsData)
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.UpdateMission = function()
|
||||||
|
-- Main function for mission information updates
|
||||||
|
Perun.AddLog("Updating mission data",2)
|
||||||
|
Perun.MissionData=DCS.getCurrentMission()
|
||||||
|
-- Perun.SendToPerun(4,Perun.MissionData) -- TBD can cause data transmission troubles
|
||||||
|
Perun.AddLog("Mission data updated",2)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- ################################ Event callbacks ################################
|
||||||
|
|
||||||
|
Perun.onSimulationStart = function()
|
||||||
|
-- Simulation was started
|
||||||
|
Perun.MissionHash=Perun.GenerateMissionHash()
|
||||||
|
Perun.LogEvent("SimStart","Mission " .. Perun.MissionHash .. " started",nil,nil);
|
||||||
|
Perun.StatData = {}
|
||||||
|
Perun.StatDataLastType = {}
|
||||||
|
-- TBD send this to Perun
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.onSimulationStop = function()
|
||||||
|
-- Simulation was stopped
|
||||||
|
Perun.LogEvent("SimStop","Mission " .. Perun.MissionHash .. " finished",nil,nil);
|
||||||
|
Perun.MissionHash=Perun.GenerateMissionHash();
|
||||||
|
Perun.StatData = {}
|
||||||
|
Perun.StatDataLastType = {}
|
||||||
|
-- TBD send this to Perun
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.onPlayerDisconnect = function(id, err_code)
|
||||||
|
-- Player disconnected - TBD DCS Bug, this is not triggered at this point of time
|
||||||
|
Perun.LogEvent("disconnect", "Player " .. net.get_player_info(id, "name") .. " disconnected; " .. err_code,net.get_player_info(id, "name"),err_code);
|
||||||
|
-- TBD send this to Perun
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.onSimulationFrame = function()
|
||||||
|
-- Repeat for each simulator frame
|
||||||
|
local _now = DCS.getRealTime()
|
||||||
|
|
||||||
|
-- First run
|
||||||
|
if Perun.lastSentMission ==0 and Perun.lastSentStatus ==0 then
|
||||||
|
Perun.UpdateMission()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Send mission update and update JSON
|
||||||
|
if _now > Perun.lastSentMission + Perun.RefreshMission then
|
||||||
|
Perun.lastSentMission = _now
|
||||||
|
|
||||||
|
Perun.UpdateMission()
|
||||||
|
Perun.UpdateJsonStatus()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Send status update
|
||||||
|
if _now > Perun.lastSentStatus + Perun.RefreshStatus then
|
||||||
|
Perun.lastSentStatus = _now
|
||||||
|
|
||||||
|
Perun.UpdateStatus()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Send keepalive
|
||||||
|
if _now > Perun.lastSentKeepAlive + Perun.SendRetries then
|
||||||
|
Perun.lastSentKeepAlive = _now
|
||||||
|
Perun.SendToPerun(0,nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.onPlayerStart = function (id)
|
||||||
|
-- Player entered cocpit
|
||||||
|
net.send_chat_to(Perun.MOTD_L1, id);
|
||||||
|
net.send_chat_to(Perun.MOTD_L2, id);
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.onPlayerTrySendChat = function (playerID, msg, all)
|
||||||
|
-- Somebody tries to send chat message
|
||||||
|
if msg~=Perun.MOTD_L1 and msg~=Perun.MOTD_L2 and msg~=Perun.ConnectionError then
|
||||||
|
Perun.LogChat(playerID,msg,all)
|
||||||
|
end
|
||||||
|
|
||||||
|
return msg
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.onGameEvent = function (eventName,arg1,arg2,arg3,arg4,arg5,arg6,arg7)
|
||||||
|
-- Game event has occured
|
||||||
|
Perun.AddLog("Event handler for ".. eventName .. " started",2)
|
||||||
|
if eventName == "friendly_fire" then
|
||||||
|
--"friendly_fire", playerID, weaponName, victimPlayerID
|
||||||
|
if arg2 == "" then
|
||||||
|
arg2 = "Cannon"
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.LogEvent(eventName,Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player(s) " .. Perun.GetMulticrewCrewNames(arg1) .." killed friendly " .. Perun.GetMulticrewCrewNames(arg3) .. " using " .. arg2,nil,nil);
|
||||||
|
|
||||||
|
elseif eventName == "mission_end" then
|
||||||
|
--"mission_end", winner, msg
|
||||||
|
Perun.LogEvent(eventName,"Mission finished, winner " .. arg1 .. " message: " .. arg2,nil,nil);
|
||||||
|
|
||||||
|
elseif eventName == "kill" then
|
||||||
|
--"kill", killerPlayerID, killerUnitType, killerSide, victimPlayerID, victimUnitType, victimSide, weaponName
|
||||||
|
local _temp_victims=""
|
||||||
|
if net.get_player_info(arg4, "name") ~= nil then
|
||||||
|
_temp_victims = " player(s) ".. Perun.GetMulticrewCrewNames(arg4) .. " ";
|
||||||
|
|
||||||
|
Perun.LogStats(arg4);
|
||||||
|
else
|
||||||
|
_temp_victims = " AI ";
|
||||||
|
end
|
||||||
|
|
||||||
|
if net.get_player_info(arg1, "name") ~= nil then
|
||||||
|
_temp_killers = " player(s) ".. Perun.GetMulticrewCrewNames(arg1) .." ";
|
||||||
|
|
||||||
|
_temp_event_type=""
|
||||||
|
if arg3 ~= arg6 then
|
||||||
|
_temp_category=Perun.GetCategory(arg5)
|
||||||
|
|
||||||
|
if _temp_category == "Planes" then
|
||||||
|
_temp_event_type="kill_Planes"
|
||||||
|
elseif _temp_category == "Helicopters" then
|
||||||
|
_temp_event_type="kill_Helicopters"
|
||||||
|
elseif _temp_category == "Ships" then
|
||||||
|
_temp_event_type="kill_Ships"
|
||||||
|
elseif _temp_category == "Air Defence" then
|
||||||
|
_temp_event_type="kill_Air_Defence"
|
||||||
|
elseif _temp_category == "Unarmed" then
|
||||||
|
_temp_event_type="kill_Unarmed"
|
||||||
|
elseif _temp_category == "Armor" then
|
||||||
|
_temp_event_type="kill_Armor"
|
||||||
|
elseif _temp_category == "Infantry" then
|
||||||
|
_temp_event_type="kill_Infantry"
|
||||||
|
elseif _temp_category == "Fortification" then
|
||||||
|
_temp_event_type="kill_Fortification"
|
||||||
|
else
|
||||||
|
_temp_event_type="kill_Other"
|
||||||
|
end
|
||||||
|
if net.get_player_info(arg4, "name") ~= nil and arg3 ~= arg6 then
|
||||||
|
Perun.LogStatsCountCrew (arg1,"kill_PvP")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
_temp_event_type="friendly_fire"
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.LogStatsCountCrew (arg1,_temp_event_type)
|
||||||
|
|
||||||
|
else
|
||||||
|
_temp_killers = " AI ";
|
||||||
|
end
|
||||||
|
|
||||||
|
if arg7 == "" then
|
||||||
|
arg7 = "Cannon"
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.LogEvent(eventName,Perun.SideID2Name(arg3) .. _temp_killers .. " in " .. arg2 .. " killed " .. Perun.SideID2Name(arg6) .. _temp_victims .. " in " .. arg5 .. " using " .. arg7 .. " [".. Perun.GetCategory(arg5).."]",arg7,Perun.GetCategory(arg5));
|
||||||
|
|
||||||
|
elseif eventName == "self_kill" then
|
||||||
|
--"self_kill", playerID
|
||||||
|
Perun.LogStats(arg1);
|
||||||
|
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. " killed himself",nil,nil);
|
||||||
|
|
||||||
|
elseif eventName == "change_slot" then
|
||||||
|
--"change_slot", playerID, slotID, prevSide
|
||||||
|
|
||||||
|
Perun.LogStatsCount(arg1,"init")
|
||||||
|
_master_type,_master_slot,_sub_slot = Perun.GetMulticrewAllParameters(arg1)
|
||||||
|
if _sub_slot == nil then
|
||||||
|
_sub_slot =""
|
||||||
|
else
|
||||||
|
_sub_slot =" (" .. _sub_slot .. ") "
|
||||||
|
end
|
||||||
|
Perun.LogEvent(eventName,Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player " .. net.get_player_info(arg1, "name") .. " changed slot to " .. _master_type .. " " .. _sub_slot,nil,nil);
|
||||||
|
|
||||||
|
|
||||||
|
elseif eventName == "connect" then
|
||||||
|
--"connect", playerID, name
|
||||||
|
Perun.LogLogin(arg1);
|
||||||
|
Perun.LogEvent(eventName,"Player "..net.get_player_info(arg1, "name") .. " connected",nil,nil);
|
||||||
|
|
||||||
|
elseif eventName == "disconnect" then
|
||||||
|
--"disconnect", playerID, name, playerSide, reason_code
|
||||||
|
Perun.LogStats(arg1);
|
||||||
|
Perun.LogEvent(eventName, Perun.SideID2Name(arg3) .. " player " ..net.get_player_info(arg1, "name") .. " disconnected",nil,nil);
|
||||||
|
|
||||||
|
elseif eventName == "crash" then
|
||||||
|
--"crash", playerID, unit_missionID
|
||||||
|
Perun.LogStatsCountCrew (arg1,"crash")
|
||||||
|
Perun.LogEvent(eventName, Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player(s) " .. Perun.GetMulticrewCrewNames(arg1) .. " crashed in " .. DCS.getUnitType(arg2),nil,nil);
|
||||||
|
|
||||||
|
elseif eventName == "eject" then
|
||||||
|
--"eject", playerID, unit_missionID
|
||||||
|
Perun.LogStatsCountCrew (arg1,"eject") -- TBD crew or initiator only?
|
||||||
|
Perun.LogEvent(eventName, Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player(s) " .. Perun.GetMulticrewCrewNames(arg1) .. " ejected " .. DCS.getUnitType(arg2),nil,nil);
|
||||||
|
|
||||||
|
elseif eventName == "takeoff" then
|
||||||
|
--"takeoff", playerID, unit_missionID, airdromeName
|
||||||
|
if arg3 ~= "" then
|
||||||
|
_temp_airfield = " from " .. arg3;
|
||||||
|
else
|
||||||
|
_temp_airfield = "";
|
||||||
|
end
|
||||||
|
|
||||||
|
-- TBD below shall be moved to function and arrays of strings - see landings
|
||||||
|
_temp_type = ""
|
||||||
|
if string.find(arg3, "FARP",1,true) then
|
||||||
|
_temp_type="tookoff_FARP"
|
||||||
|
elseif string.find(arg3, "CVN-74 John C. Stennis",1,true) or string.find(arg3, "LHA-1 Tarawa",1,true) or string.find(arg3, "SHIP",1,true) then
|
||||||
|
_temp_type="tookoff_SHIP"
|
||||||
|
elseif arg3 ~= "" then
|
||||||
|
_temp_type="tookoff_AIRFIELD"
|
||||||
|
else
|
||||||
|
_temp_type="tookoff_OTHER"
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.LogStatsCountCrew (arg1,_temp_type)
|
||||||
|
Perun.LogEvent(eventName, Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player(s) " .. Perun.GetMulticrewCrewNames(arg1) .. " took off in ".. DCS.getUnitType(arg2) .. _temp_airfield,arg3,nil);
|
||||||
|
|
||||||
|
elseif eventName == "landing" then
|
||||||
|
--"landing", playerID, unit_missionID, airdromeName
|
||||||
|
if arg3 ~= "" then
|
||||||
|
_temp_airfield = " at " .. arg3;
|
||||||
|
else
|
||||||
|
_temp_airfield ="";
|
||||||
|
end
|
||||||
|
|
||||||
|
-- TBD below shall be moved to function and arrays of strings - see takeoffs
|
||||||
|
_temp_type = ""
|
||||||
|
if string.find(arg3, "FARP",1,true) then
|
||||||
|
_temp_type = "landing_FARP"
|
||||||
|
elseif string.find(arg3, "CVN-74 John C. Stennis",1,true) or string.find(arg3, "LHA-1 Tarawa",1,true) or string.find(arg3, "SHIP",1,true) then
|
||||||
|
_temp_type = "landing_SHIP"
|
||||||
|
elseif arg3 ~= "" then
|
||||||
|
_temp_type = "landing_AIRFIELD"
|
||||||
|
else
|
||||||
|
_temp_type = "landing_OTHER"
|
||||||
|
end
|
||||||
|
|
||||||
|
Perun.LogStatsCountCrew (arg1,_temp_type)
|
||||||
|
Perun.LogEvent(eventName, Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player(s) " .. Perun.GetMulticrewCrewNames(arg1) .. " landed in " .. DCS.getUnitType(arg2).. _temp_airfield,arg3,nil);
|
||||||
|
|
||||||
|
elseif eventName == "pilot_death" then
|
||||||
|
--"pilot_death", playerID, unit_missionID
|
||||||
|
Perun.LogStatsCountCrew (arg1,"pilot_death") -- TBD crew or initiator only?
|
||||||
|
Perun.LogEvent(eventName, Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player(s) " .. Perun.GetMulticrewCrewNames(arg1) .. " in " .. DCS.getUnitType(arg2) .. " died",nil,nil);
|
||||||
|
|
||||||
|
else
|
||||||
|
Perun.LogEvent(eventName,"Unknown event type",nil,nil);
|
||||||
|
|
||||||
|
end
|
||||||
|
Perun.AddLog("Event handler for " .. eventName .. " finished",2)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ########### Finalize and set callbacks ###########
|
||||||
|
if Perun.IsServer then
|
||||||
|
-- If this game instance is hosting multiplayer game, start Perun
|
||||||
|
Perun.MissionHash=Perun.GenerateMissionHash() -- Generate initial missionhash
|
||||||
|
DCS.setUserCallbacks(Perun) -- Set user callbacs, map DCS event handlers with functions defined above
|
||||||
|
net.log("Perun by VladMordock was loaded: " .. Perun.Version ) -- Display perun information in log
|
||||||
|
Perun.ConnectToPerun() -- Connect to Perun server
|
||||||
|
end
|
||||||
1
01_DCS/Json/perun_status_data.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 15.0.28307.421
|
VisualStudioVersion = 16.0.29306.81
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perun_v1", "Perun_v1\Perun_v1.csproj", "{5A710507-92E9-4664-9B91-918B8B82F107}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perun_v1", "Perun_v1\Perun_v1.csproj", "{5A710507-92E9-4664-9B91-918B8B82F107}"
|
||||||
EndProject
|
EndProject
|
||||||
69
02_Windows_App/Perun_v1/00_Config/App.config
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<configuration>
|
||||||
|
<configSections>
|
||||||
|
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||||
|
<section name="Perun_v1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||||
|
<section name="Perun.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||||
|
</sectionGroup>
|
||||||
|
</configSections>
|
||||||
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
|
||||||
|
</startup>
|
||||||
|
<userSettings>
|
||||||
|
<Perun_v1.Properties.Settings>
|
||||||
|
<setting name="MYSQL_Server" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_User" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_Password" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_DB" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_LOTATC_FILE" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_SRS_FILE" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_LOTATC_USE" serializeAs="String">
|
||||||
|
<value>False</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_SRS_USE" serializeAs="String">
|
||||||
|
<value>False</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_Port" serializeAs="String">
|
||||||
|
<value>3306</value>
|
||||||
|
</setting>
|
||||||
|
</Perun_v1.Properties.Settings>
|
||||||
|
<Perun.Properties.Settings>
|
||||||
|
<setting name="MYSQL_Server" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_User" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_Password" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_DB" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_LOTATC_FILE" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_SRS_FILE" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_LOTATC_USE" serializeAs="String">
|
||||||
|
<value>False</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_SRS_USE" serializeAs="String">
|
||||||
|
<value>False</value>
|
||||||
|
</setting>
|
||||||
|
</Perun.Properties.Settings>
|
||||||
|
</userSettings>
|
||||||
|
</configuration>
|
||||||
6
02_Windows_App/Perun_v1/00_Config/packages.config
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="Google.Protobuf" version="3.5.1" targetFramework="net461" />
|
||||||
|
<package id="MySql.Data" version="8.0.15" targetFramework="net461" />
|
||||||
|
<package id="Newtonsoft.Json" version="12.0.1" targetFramework="net461" />
|
||||||
|
</packages>
|
||||||
216
02_Windows_App/Perun_v1/01_Classes/DatabaseController.cs
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
// This class handles MySQL communication
|
||||||
|
using MySql.Data.MySqlClient;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public class DatabaseController
|
||||||
|
{
|
||||||
|
public string DatabaseConnectionString; // MySQL connection string
|
||||||
|
public MySqlConnection DatabaseConnection;
|
||||||
|
public bool DatabaseStatus;
|
||||||
|
|
||||||
|
public int SendToMySql(string RawTCPFrame, bool CheckConnection = false)
|
||||||
|
{
|
||||||
|
// Main function to send data to mysql
|
||||||
|
if (CheckConnection)
|
||||||
|
{
|
||||||
|
RawTCPFrame = "{\"type\": \"-1\"}";
|
||||||
|
}
|
||||||
|
dynamic TCPFrame = JsonConvert.DeserializeObject(RawTCPFrame); // Deserialize raw data
|
||||||
|
string TCPFrameType = TCPFrame.type;
|
||||||
|
string TCPFrameTimestamp = TCPFrame.timestamp;
|
||||||
|
string TCPFrameInstance = TCPFrame.instance;
|
||||||
|
string TCPFramePayload;
|
||||||
|
string SQLQueryTxt;
|
||||||
|
int ReturnValue = 1;
|
||||||
|
|
||||||
|
// Some frames may come without timestamp, use database currrent timestampe then
|
||||||
|
if (TCPFrameTimestamp != null)
|
||||||
|
{
|
||||||
|
TCPFrameTimestamp = "'" + TCPFrameTimestamp + "'";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TCPFrameTimestamp = "CURRENT_TIMESTAMP()";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modify specific types
|
||||||
|
if (TCPFrameType == "1")
|
||||||
|
{
|
||||||
|
TCPFrame.payload["v_win"] = "v" + Globals.VersionPerun; // Inject app version information
|
||||||
|
|
||||||
|
// Pull DCS hook version
|
||||||
|
Globals.VersionDCSHook = TCPFrame.payload.v_dcs_hook;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specific SQL per each frame type
|
||||||
|
if (TCPFrameType == "50")
|
||||||
|
{
|
||||||
|
// Add entry to chat log
|
||||||
|
SQLQueryTxt = "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) SELECT '" + TCPFrame.payload.ucid + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataPlayers` where `pe_DataPlayers_ucid` = '" + TCPFrame.payload.ucid + "' );";
|
||||||
|
SQLQueryTxt += "UPDATE `pe_DataPlayers` SET `pe_DataPlayers_updated` = " + TCPFrameTimestamp + ",`pe_DataPlayers_lastname`='" + TCPFrame.payload.player + "' WHERE `pe_DataPlayers_ucid`='" + TCPFrame.payload.ucid + "' ;";
|
||||||
|
SQLQueryTxt += "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`,`pe_DataMissionHashes_instance`) SELECT '" + TCPFrame.payload.missionhash + "','" + TCPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataMissionHashes` where `pe_DataMissionHashes_hash` ='" + TCPFrame.payload.missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + ");";
|
||||||
|
SQLQueryTxt += "UPDATE `pe_DataMissionHashes` SET `pe_DataMissionHashes_datetime` = " + TCPFrameTimestamp + " WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + " ;";
|
||||||
|
SQLQueryTxt += "INSERT INTO `pe_LogChat` (`pe_LogChat_id`,`pe_LogChat_datetime`, `pe_LogChat_playerid`, `pe_LogChat_msg`, `pe_LogChat_all`,`pe_LogChat_missionhash_id`) VALUES (NULL,'" + TCPFrame.payload.datetime + "', (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + TCPFrame.payload.ucid + "'), '" + TCPFrame.payload.msg + "', '" + TCPFrame.payload.all + "',(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.missionhash + "'));";
|
||||||
|
}
|
||||||
|
else if (TCPFrameType == "51")
|
||||||
|
{
|
||||||
|
// Add entry to event log
|
||||||
|
SQLQueryTxt = "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`,`pe_DataMissionHashes_instance`) SELECT '" + TCPFrame.payload.log_missionhash + "','" + TCPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataMissionHashes` where `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.log_missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + ");";
|
||||||
|
SQLQueryTxt += "UPDATE `pe_DataMissionHashes` SET `pe_DataMissionHashes_datetime` = " + TCPFrameTimestamp + " WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.log_missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + ";";
|
||||||
|
SQLQueryTxt += "INSERT INTO `pe_LogEvent` (`pe_LogEvent_arg1`,`pe_LogEvent_arg2`,`pe_LogEvent_id`, `pe_LogEvent_datetime`, `pe_LogEvent_type`, `pe_LogEvent_content`,`pe_LogEvent_missionhash_id`) VALUES ('" + TCPFrame.payload.log_arg_1 + "','" + TCPFrame.payload.log_arg_2 + "', NULL, '" + TCPFrame.payload.log_datetime + "', '" + TCPFrame.payload.log_type + "', '" + TCPFrame.payload.log_content + "', (SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.log_missionhash + "'));";
|
||||||
|
}
|
||||||
|
else if (TCPFrameType == "52")
|
||||||
|
{
|
||||||
|
// Update user stats
|
||||||
|
SQLQueryTxt = "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`,`pe_DataMissionHashes_instance`) SELECT '" + TCPFrame.payload.stat_missionhash + "','" + TCPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataMissionHashes` where `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + ");";
|
||||||
|
SQLQueryTxt += "UPDATE `pe_DataMissionHashes` SET `pe_DataMissionHashes_datetime` = " + TCPFrameTimestamp + " WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + " ;";
|
||||||
|
SQLQueryTxt += "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) SELECT '" + TCPFrame.payload.stat_ucid + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataPlayers` where `pe_DataPlayers_ucid` = '" + TCPFrame.payload.stat_ucid + "');";
|
||||||
|
SQLQueryTxt += "UPDATE `pe_DataPlayers` SET `pe_DataPlayers_updated`=" + TCPFrameTimestamp + " WHERE `pe_DataPlayers_ucid`='" + TCPFrame.payload.stat_ucid + "';";
|
||||||
|
SQLQueryTxt += "INSERT INTO `pe_DataTypes` (`pe_DataTypes_name`) SELECT '" + TCPFrame.payload.stat_data_type + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + TCPFrame.payload.stat_data_type + "');";
|
||||||
|
SQLQueryTxt += "INSERT INTO `pe_LogStats` (`pe_LogStats_playerid`,`pe_LogStats_missionhash_id`,`pe_LogStats_typeid`) SELECT (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + TCPFrame.payload.stat_ucid + "'), (SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "'), (SELECT pe_DataTypes_id FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + TCPFrame.payload.stat_data_type + "') FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_LogStats` WHERE `pe_LogStats_missionhash_id`=(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "') AND `pe_LogStats_playerid` = (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + TCPFrame.payload.stat_ucid + "') AND `pe_LogStats_typeid`= (SELECT pe_DataTypes_id FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + TCPFrame.payload.stat_data_type + "'));";
|
||||||
|
SQLQueryTxt += "UPDATE `pe_LogStats` SET `pe_LogStats_seat`=" + TCPFrame.payload.stat_data_subslot + ",`pe_LogStats_masterslot`=" + TCPFrame.payload.stat_data_masterslot + ",`ps_kills_fortification`=" + TCPFrame.payload.stat_data_perun.ps_kills_fortification + ",`ps_other_landings`=" + TCPFrame.payload.stat_data_perun.ps_other_landings + ",`ps_other_takeoffs`=" + TCPFrame.payload.stat_data_perun.ps_other_takeoffs + ",`ps_pvp`=" + TCPFrame.payload.stat_data_perun.ps_pvp + ",`ps_deaths`=" + TCPFrame.payload.stat_data_perun.ps_deaths + ",`ps_ejections`=" + TCPFrame.payload.stat_data_perun.ps_ejections + ",`ps_crashes`=" + TCPFrame.payload.stat_data_perun.ps_crashes + ",`ps_teamkills`=" + TCPFrame.payload.stat_data_perun.ps_teamkills + ",`ps_kills_planes`=" + TCPFrame.payload.stat_data_perun.ps_kills_planes + ",`ps_kills_helicopters`=" + TCPFrame.payload.stat_data_perun.ps_kills_helicopters + ",`ps_kills_air_defense`=" + TCPFrame.payload.stat_data_perun.ps_kills_air_defense + ",`ps_kills_armor`=" + TCPFrame.payload.stat_data_perun.ps_kills_armor + ",`ps_kills_unarmed`=" + TCPFrame.payload.stat_data_perun.ps_kills_unarmed + ",`ps_kills_infantry`=" + TCPFrame.payload.stat_data_perun.ps_kills_infantry + ",`ps_kills_ships`=" + TCPFrame.payload.stat_data_perun.ps_kills_ships + ",`ps_kills_other`=" + TCPFrame.payload.stat_data_perun.ps_kills_other + ",`ps_airfield_takeoffs`=" + TCPFrame.payload.stat_data_perun.ps_airfield_takeoffs + ",`ps_airfield_landings`=" + TCPFrame.payload.stat_data_perun.ps_airfield_landings + ",`ps_ship_takeoffs`=" + TCPFrame.payload.stat_data_perun.ps_ship_takeoffs + ",`ps_ship_landings`=" + TCPFrame.payload.stat_data_perun.ps_ship_landings + ",`ps_farp_takeoffs`=" + TCPFrame.payload.stat_data_perun.ps_farp_takeoffs + ",`ps_farp_landings`=" + TCPFrame.payload.stat_data_perun.ps_farp_landings + ", `pe_LogStats_datetime`='" + TCPFrame.payload.stat_datetime + "',`pe_LogStats_playerid` = (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + TCPFrame.payload.stat_ucid + "'),`pe_LogStats_missionhash_id`=(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "') WHERE `pe_LogStats_missionhash_id`=(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "') AND `pe_LogStats_playerid` = (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + TCPFrame.payload.stat_ucid + "') AND `pe_LogStats_typeid`=(SELECT pe_DataTypes_id FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + TCPFrame.payload.stat_data_type + "');";
|
||||||
|
}
|
||||||
|
else if (TCPFrameType == "53")
|
||||||
|
{
|
||||||
|
// User logged in to DCS server
|
||||||
|
|
||||||
|
SQLQueryTxt = "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) SELECT '" + TCPFrame.payload.login_ucid + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataPlayers` where pe_DataPlayers_ucid='" + TCPFrame.payload.login_ucid + "');";
|
||||||
|
SQLQueryTxt += "UPDATE `pe_DataPlayers` SET pe_DataPlayers_lastip='" + TCPFrame.payload.login_ipaddr + "', pe_DataPlayers_lastname='" + TCPFrame.payload.login_name + "',pe_DataPlayers_updated='" + TCPFrame.payload.login_datetime + "' WHERE `pe_DataPlayers_ucid`= '" + TCPFrame.payload.login_ucid + "';";
|
||||||
|
SQLQueryTxt += "INSERT INTO `pe_LogLogins` (`pe_LogLogins_datetime`, `pe_LogLogins_playerid`, `pe_LogLogins_name`, `pe_LogLogins_ip`,`pe_LogLogins_instance`) VALUES ('" + TCPFrame.payload.login_datetime + "', (SELECT pe_DataPlayers_id from pe_DataPlayers WHERE pe_DataPlayers_ucid = '" + TCPFrame.payload.login_ucid + "'), '" + TCPFrame.payload.login_name + "', '" + TCPFrame.payload.login_ipaddr + "','" + TCPFrameInstance + "');";
|
||||||
|
}
|
||||||
|
else if (TCPFrameType == "-1")
|
||||||
|
{
|
||||||
|
// Keep alive message
|
||||||
|
SQLQueryTxt = "SELECT `pe_Config_payload` FROM `pe_Config` WHERE `pe_Config_id` = 1;";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// General definition used for 1-10 type packets
|
||||||
|
TCPFramePayload = JsonConvert.SerializeObject(TCPFrame.payload); // Deserialize payload
|
||||||
|
|
||||||
|
SQLQueryTxt = "INSERT INTO `pe_DataRaw` (`pe_dataraw_type`,`pe_dataraw_instance`) SELECT '" + TCPFrameType + "','" + TCPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataRaw` WHERE `pe_dataraw_type` = '" + TCPFrameType + "' AND `pe_dataraw_instance` = " + TCPFrameInstance + ");";
|
||||||
|
SQLQueryTxt += "UPDATE `pe_DataRaw` SET `pe_dataraw_payload` = JSON_QUOTE('" + TCPFramePayload + "'), `pe_dataraw_updated`=" + TCPFrameTimestamp + " WHERE `pe_dataraw_type`=" + TCPFrameType + " AND `pe_dataraw_instance` = " + TCPFrameInstance + ";";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect to mysql and execute sql
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DatabaseConnection = new MySqlConnection(DatabaseConnectionString);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Console.WriteLine("Sending data to MySQL - Begin");
|
||||||
|
DatabaseConnection.Open();
|
||||||
|
DatabaseStatus = true;
|
||||||
|
MySqlCommand DatabaseCommand = new MySqlCommand(SQLQueryTxt, DatabaseConnection);
|
||||||
|
MySqlDataReader DatabaseReader = DatabaseCommand.ExecuteReader();
|
||||||
|
|
||||||
|
if (DatabaseReader.HasRows)
|
||||||
|
{
|
||||||
|
while (DatabaseReader.Read())
|
||||||
|
{
|
||||||
|
if (TCPFrameType == "-1")
|
||||||
|
{
|
||||||
|
Globals.VersionDatabase= DatabaseReader.GetString(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
DatabaseReader.Close();
|
||||||
|
|
||||||
|
switch (Int32.Parse(TCPFrameType))
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Connected players: " + TCPFrame.payload["c_players"], 1,0,"1");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Mission: \"" + TCPFrame.payload["mission"]["name"]+"\""+ ", time:" + TCPFrame.payload["mission"]["modeltime"], 1, 0, "2");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Slots data updated", 1, 0, "3");
|
||||||
|
break;
|
||||||
|
case 50:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Player's \""+ TCPFrame.payload.player + "\" chat message saved", 1, 0, "50");
|
||||||
|
break;
|
||||||
|
case 51:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Game event: \""+ TCPFrame.payload.log_content +"\"", 1, 0, "51");
|
||||||
|
break;
|
||||||
|
case 52:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Player's \""+ TCPFrame.payload.stat_name + "\" stats saved", 1, 0, "52");
|
||||||
|
break;
|
||||||
|
case 53:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Player \""+ TCPFrame.payload.login_name + "\" logged in", 1, 0, "53");
|
||||||
|
break;
|
||||||
|
case 100:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "SRS data send", 1,0,"100");
|
||||||
|
break;
|
||||||
|
case 101:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "LotATC data send", 1,0,"101");
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Data send", 1,0, TCPFrameType);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (ArgumentException a_ex)
|
||||||
|
{
|
||||||
|
// General exception found
|
||||||
|
Console.WriteLine(a_ex.ToString());
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - error: " + a_ex.Message,1,1, TCPFrameType);
|
||||||
|
Globals.ErrorsGame++;
|
||||||
|
DatabaseStatus = false;
|
||||||
|
ReturnValue = 0;
|
||||||
|
}
|
||||||
|
catch (MySqlException m_ex)
|
||||||
|
{
|
||||||
|
// MySQL exception found
|
||||||
|
switch (m_ex.Number)
|
||||||
|
{
|
||||||
|
case 1042: // Unable to connect to any of the specified MySQL hosts (Check Server,Port)
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - unable to connect, error: " + m_ex.Message,1,1, TCPFrameType);
|
||||||
|
DatabaseStatus = false;
|
||||||
|
ReturnValue = 0;
|
||||||
|
break;
|
||||||
|
case 0: // Access denied (Check DB name,username,password)
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - access denied, error: " + m_ex.Message,1,1, TCPFrameType);
|
||||||
|
DatabaseStatus = false;
|
||||||
|
ReturnValue = 0;
|
||||||
|
break;
|
||||||
|
case 1064: // Incorrect query
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - query: " + SQLQueryTxt, 1, 1, TCPFrameType);
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - error: " + m_ex.Message, 1, 1, TCPFrameType);
|
||||||
|
DatabaseStatus = true; // True as connection is not broken
|
||||||
|
ReturnValue = 1; // Return a value to remove this query from quae
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - error id: " + m_ex.Number,1,1, TCPFrameType);
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - query: " + SQLQueryTxt, 1, 1, TCPFrameType);
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - error: " + m_ex.Message,1,1, TCPFrameType);
|
||||||
|
DatabaseStatus = false;
|
||||||
|
ReturnValue = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Globals.ErrorsGame++;
|
||||||
|
|
||||||
|
}
|
||||||
|
DatabaseConnection.Close();
|
||||||
|
Console.WriteLine("Sending data to MySQL - Done");
|
||||||
|
}
|
||||||
|
catch (ArgumentException x_ex)
|
||||||
|
{
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - unable to connect, error: " + x_ex.Message,1,1, TCPFrameType);
|
||||||
|
ReturnValue = 0;
|
||||||
|
Globals.ErrorsGame++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ReturnValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
26
02_Windows_App/Perun_v1/01_Classes/Globals.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
// This class gathers all global variable
|
||||||
|
|
||||||
|
internal class Globals
|
||||||
|
{
|
||||||
|
public static string[] AppLogHistory = new string[10]; // Log history for GUI
|
||||||
|
public static bool AppUpdateGUI = true; // Flag if log control requires update
|
||||||
|
public static string AppTitle = ""; // Helper to update title
|
||||||
|
public static int AppInstanceID = 0; // Kepp the instance ID
|
||||||
|
public static bool AppForceIconReload = true; // Force main window icons reload
|
||||||
|
|
||||||
|
public static bool StatusDatabase = false; // Historic db connection status
|
||||||
|
public static bool StatusSRS = false; // Historic srs connection status
|
||||||
|
public static bool StatusLotATC = false; // Historic lotatc connection status
|
||||||
|
public static bool StatusHistoryConnection = false; // Historic tcp connection status
|
||||||
|
public static bool StatusConnection = false; // Flag if is TCP connectionstill alive
|
||||||
|
public static int ErrorsDatabase = 0; // MySQL - Error counter
|
||||||
|
public static int ErrorsGame = 0; // TCP connection - Error counter
|
||||||
|
public static int ErrorsHistoryGame = 0; // TCP connection - historic value of Error counter
|
||||||
|
public static int ErrorsSRS = 0; // DCS SRS - error counter
|
||||||
|
public static int ErrorsLotATC = 0; // LotATC - error counter
|
||||||
|
|
||||||
|
public static string VersionDCSHook = ""; // Version - DCS hook
|
||||||
|
public static string VersionDatabase = ""; // Version - Database
|
||||||
|
public static string VersionPerun = "DEBUG"; // Version - Perun
|
||||||
|
}
|
||||||
|
|
||||||
45
02_Windows_App/Perun_v1/01_Classes/LogController.cs
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
class LogController
|
||||||
|
{
|
||||||
|
// TBD - done via https://stackoverflow.com/questions/20185015/how-to-write-log-file-in-c
|
||||||
|
public static void WriteLog(string strLog)
|
||||||
|
{
|
||||||
|
StreamWriter LogStreamWriter;
|
||||||
|
FileStream LogFileStream = null;
|
||||||
|
DirectoryInfo LogDirectoryInfo = null;
|
||||||
|
FileInfo LogFileInfo;
|
||||||
|
|
||||||
|
string LogFilePath = Path.Combine(Environment.ExpandEnvironmentVariables("%userprofile%"), "Documents") + "\\Perun\\";
|
||||||
|
LogFilePath = LogFilePath + "Perun_Log_" + System.DateTime.Today.ToString("yyyyddMM") + "." + "txt";
|
||||||
|
LogFileInfo = new FileInfo(LogFilePath);
|
||||||
|
LogDirectoryInfo = new DirectoryInfo(LogFileInfo.DirectoryName);
|
||||||
|
if (!LogDirectoryInfo.Exists) LogDirectoryInfo.Create();
|
||||||
|
if (!LogFileInfo.Exists)
|
||||||
|
{
|
||||||
|
LogFileStream = LogFileInfo.Create();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LogFileStream = new FileStream(LogFilePath, FileMode.Append);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LogStreamWriter = new StreamWriter(LogFileStream);
|
||||||
|
LogStreamWriter.WriteLine(strLog);
|
||||||
|
LogStreamWriter.Close();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
94
02_Windows_App/Perun_v1/01_Classes/PerunHelper.cs
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
// This class gathers all helper functions
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
internal class PerunHelper
|
||||||
|
{
|
||||||
|
public static void AddLog(ref string[] arrLogHistory, string strEntryToAdd, int intDirection = 0, int intMarker = 0, string strType = " ", bool bSkipGui = false)
|
||||||
|
{
|
||||||
|
// Declare values
|
||||||
|
string LogDirection;
|
||||||
|
string LogMarker;
|
||||||
|
// Set direction marker
|
||||||
|
switch (intDirection)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
LogDirection = ">";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
LogDirection = "<";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
LogDirection = "^";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LogDirection = " ";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set marker for user flags (markers)
|
||||||
|
LogMarker = (intMarker>0) ? "X" : " ";
|
||||||
|
|
||||||
|
// Set frame type
|
||||||
|
strType=strType.PadLeft(3, ' ');
|
||||||
|
|
||||||
|
if (!bSkipGui)
|
||||||
|
{
|
||||||
|
// Rotate log history
|
||||||
|
for (int i = 0; i < arrLogHistory.Length - 1; i++)
|
||||||
|
{
|
||||||
|
arrLogHistory[i] = arrLogHistory[i + 1]; // Shift one down
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add new entry
|
||||||
|
arrLogHistory[arrLogHistory.Length - 1] = DateTime.Now.ToString("HH:mm:ss") + " " + LogDirection + " " + strEntryToAdd; // Add entry at the last position
|
||||||
|
|
||||||
|
// Update control at my window
|
||||||
|
Globals.AppUpdateGUI = true;
|
||||||
|
}
|
||||||
|
// Add the entry to log file
|
||||||
|
LogController.WriteLog(DateTime.Now.ToString("yyyy-dd-MM ") + " " + DateTime.Now.ToString("HH:mm:ss") + " | Instance: "+ Globals.AppInstanceID + " | " + LogMarker + " | "+ LogDirection + " | "+ strType + " | " + strEntryToAdd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetAppVersion(string strBeginning)
|
||||||
|
{
|
||||||
|
// Gets build version
|
||||||
|
Globals.VersionPerun = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||||
|
return strBeginning + "v" + Globals.VersionPerun;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int CheckVersions()
|
||||||
|
{
|
||||||
|
// Checks the versions of APP, DCS Hook and MySQL database
|
||||||
|
Match match = Regex.Match(Globals.VersionPerun, @"^\d+.\d+.\d+", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||||
|
string VersionApp = "v" + match.Groups[0].Value;
|
||||||
|
|
||||||
|
int ReturnValue = 1;
|
||||||
|
if (!String.IsNullOrEmpty(Globals.VersionDatabase))
|
||||||
|
{
|
||||||
|
// Check database
|
||||||
|
if(VersionApp != Globals.VersionDatabase)
|
||||||
|
{
|
||||||
|
// Incorrect database version
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR Incorrect database revision : "+ Globals.VersionDatabase, 1, 1, "?");
|
||||||
|
Globals.ErrorsDatabase++;
|
||||||
|
ReturnValue = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(Globals.VersionDCSHook))
|
||||||
|
{
|
||||||
|
// Check database
|
||||||
|
if (VersionApp != Globals.VersionDCSHook)
|
||||||
|
{
|
||||||
|
// Incorrect dcs script version
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR Incorrect DCS hook revision : " + Globals.VersionDCSHook, 2, 1, "?");
|
||||||
|
Globals.ErrorsGame++;
|
||||||
|
ReturnValue = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ReturnValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
28
02_Windows_App/Perun_v1/01_Classes/Program.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace Perun_v1
|
||||||
|
{
|
||||||
|
static class Program
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Main entry point to app
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
[STAThread]
|
||||||
|
|
||||||
|
static void Main()
|
||||||
|
{
|
||||||
|
// Main entry point to the app
|
||||||
|
Application.EnableVisualStyles();
|
||||||
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
|
||||||
|
|
||||||
|
void Application_ApplicationExit(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Properties.Settings.Default.Save(); // We will save settings on exit
|
||||||
|
}
|
||||||
|
Application.Run(new form_Main()); // Run main form
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
206
02_Windows_App/Perun_v1/01_Classes/TCPController.cs
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
// This class handles TCP communication
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
public class TCPController
|
||||||
|
{
|
||||||
|
// Main class for TCP listener
|
||||||
|
public int intListenPort; // Port to connect to
|
||||||
|
public bool bCloseConnection; // Helper to exit main loop without killing thread
|
||||||
|
public string[] arrGUILogHistory; // Log history for GUI
|
||||||
|
public string[] arrMySQLSendBuffer; // MySQL send buffer
|
||||||
|
public Thread thrTCPListener; // Seperate thread for TCP
|
||||||
|
|
||||||
|
public void Create(int par_intListenPort, ref string[] par_arrLogHistory, ref string[] par_arrSendBuffer)
|
||||||
|
{
|
||||||
|
// Create class and map creation arguments to class
|
||||||
|
intListenPort = par_intListenPort;
|
||||||
|
arrGUILogHistory = par_arrLogHistory;
|
||||||
|
arrMySQLSendBuffer = par_arrSendBuffer;
|
||||||
|
bCloseConnection = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StopListen()
|
||||||
|
{
|
||||||
|
// Stop listening
|
||||||
|
bCloseConnection = true;
|
||||||
|
|
||||||
|
// Clear send buffer
|
||||||
|
for (int i = 0; i < arrMySQLSendBuffer.Length - 1; i++)
|
||||||
|
{
|
||||||
|
arrMySQLSendBuffer[i] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StartListen()
|
||||||
|
{
|
||||||
|
// Start listening
|
||||||
|
NetworkStream nsReadStream = null;
|
||||||
|
TcpClient tcpClient = null;
|
||||||
|
bool bTCPConnectionOnline = false;
|
||||||
|
string strReceiveBuffer;
|
||||||
|
|
||||||
|
// Main loop - do until diconnect button is clicked
|
||||||
|
while (!bCloseConnection)
|
||||||
|
{
|
||||||
|
Console.WriteLine("TCP Listen start");
|
||||||
|
TcpListener tcpServer = new TcpListener(IPAddress.Any, intListenPort); ; // Create listener object
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Start listening to TCP
|
||||||
|
string strReceivedData;
|
||||||
|
|
||||||
|
// Start the main loop
|
||||||
|
tcpServer.Start();
|
||||||
|
|
||||||
|
// While user do not clicked Disconnect button
|
||||||
|
while (!bCloseConnection)
|
||||||
|
{
|
||||||
|
// Start listening
|
||||||
|
Console.WriteLine("TCP: Waiting for connection");
|
||||||
|
Globals.StatusConnection = false;
|
||||||
|
|
||||||
|
// Wait for pending connection
|
||||||
|
if (tcpServer.Pending())
|
||||||
|
{
|
||||||
|
Console.WriteLine("TCP: Connected");
|
||||||
|
bTCPConnectionOnline = true;
|
||||||
|
tcpClient = tcpServer.AcceptTcpClient(); //if a connection exists, the server will accept it
|
||||||
|
nsReadStream = tcpClient.GetStream(); //networkstream is used to send/receive messages
|
||||||
|
nsReadStream.ReadTimeout = 10000;
|
||||||
|
tcpClient.ReceiveTimeout = 10000;
|
||||||
|
|
||||||
|
|
||||||
|
while (tcpClient.Connected && !bCloseConnection && bTCPConnectionOnline) //while the client is connected, we look for incoming messages
|
||||||
|
{
|
||||||
|
StringBuilder CompleteMessage = new StringBuilder();
|
||||||
|
Globals.StatusConnection = true;
|
||||||
|
|
||||||
|
if (nsReadStream.CanRead)
|
||||||
|
{
|
||||||
|
Console.WriteLine("TCP: Can read");
|
||||||
|
byte[] ReadBuffer = new byte[1024];
|
||||||
|
CompleteMessage = new StringBuilder();
|
||||||
|
int numberOfBytesRead = 0;
|
||||||
|
|
||||||
|
// Incoming message may be larger than the buffer size.
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Console.WriteLine("TCP: Read");
|
||||||
|
numberOfBytesRead = nsReadStream.Read(ReadBuffer, 0, ReadBuffer.Length);
|
||||||
|
CompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(ReadBuffer, 0, numberOfBytesRead));
|
||||||
|
if (numberOfBytesRead == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (nsReadStream.DataAvailable && nsReadStream.CanRead && tcpClient.Connected);
|
||||||
|
}
|
||||||
|
strReceivedData = CompleteMessage.ToString();
|
||||||
|
Console.WriteLine("Sender: {0} Payload: {1}", null, strReceivedData);
|
||||||
|
|
||||||
|
string pattern = @"(\<SOT\>)+?.*?(\<EOT\>)+?";
|
||||||
|
|
||||||
|
foreach (Match match in Regex.Matches(strReceivedData, pattern))
|
||||||
|
{
|
||||||
|
strReceiveBuffer = match.Value;
|
||||||
|
|
||||||
|
Console.WriteLine("Found '{0}' at position {1} end {2}",match.Value, match.Index,match.Length);
|
||||||
|
Console.WriteLine("Prepared {0}", strReceiveBuffer.Substring(5, match.Length-10));
|
||||||
|
|
||||||
|
strReceivedData = strReceiveBuffer.Substring(5, match.Length - 10);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (strReceivedData != "")
|
||||||
|
{
|
||||||
|
dynamic dynamicRawTCPFrame = JsonConvert.DeserializeObject(strReceivedData); // Deserialize received frame
|
||||||
|
string strRawTCPFrameType = dynamicRawTCPFrame.type;
|
||||||
|
|
||||||
|
// Check if this is NOT keep alive
|
||||||
|
if (Int32.Parse(strRawTCPFrameType) != 0)
|
||||||
|
{
|
||||||
|
// Add to mySQL send buffer (find first empty slot)
|
||||||
|
PerunHelper.AddLog(ref arrGUILogHistory, "Packet received" , 2,0, strRawTCPFrameType,true);
|
||||||
|
bool AddedDataToBuffer = false;
|
||||||
|
for (int i = 0; i < arrMySQLSendBuffer.Length - 1; i++)
|
||||||
|
{
|
||||||
|
if (arrMySQLSendBuffer[i] == null)
|
||||||
|
{
|
||||||
|
arrMySQLSendBuffer[i] = strReceivedData;
|
||||||
|
AddedDataToBuffer = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!AddedDataToBuffer)
|
||||||
|
{
|
||||||
|
PerunHelper.AddLog(ref arrGUILogHistory, "ERROR package was dropped", 1, 1, strRawTCPFrameType);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
// Keep alive
|
||||||
|
PerunHelper.AddLog(ref arrGUILogHistory, "Keep-alive received", 2,0,"0",true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bTCPConnectionOnline = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Globals.ErrorsGame++;
|
||||||
|
Console.WriteLine(e.ToString());
|
||||||
|
PerunHelper.AddLog(ref arrGUILogHistory, "ERROR while message parsing , error: " + e.Message,2,1,"?");
|
||||||
|
bTCPConnectionOnline = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send empty byte to check if connection is still alive
|
||||||
|
try
|
||||||
|
{
|
||||||
|
tcpClient.Client.Send(new byte[] { 0 }, 1, 0);
|
||||||
|
}
|
||||||
|
catch (SocketException e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.ToString());
|
||||||
|
PerunHelper.AddLog(ref arrGUILogHistory, "TCP ERROR cannot check connection, error: " + e.Message,2,1,"?");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.Threading.Thread.Sleep(500);
|
||||||
|
}
|
||||||
|
tcpServer.Stop();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Globals.ErrorsGame++;
|
||||||
|
Console.WriteLine(e.ToString());
|
||||||
|
PerunHelper.AddLog(ref arrGUILogHistory, "TCP error - connection closed or port in use, error: " + e.Message,1,1,"?");
|
||||||
|
bTCPConnectionOnline = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up and prepare for next connection
|
||||||
|
if (!(nsReadStream is null))
|
||||||
|
{
|
||||||
|
nsReadStream.Flush();
|
||||||
|
nsReadStream.Close();
|
||||||
|
}
|
||||||
|
if (!(tcpClient is null))
|
||||||
|
{
|
||||||
|
tcpClient.Close();
|
||||||
|
}
|
||||||
|
if (!(tcpServer is null))
|
||||||
|
{
|
||||||
|
tcpServer.Stop();
|
||||||
|
}
|
||||||
|
Console.WriteLine("TCP listen stop");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
630
02_Windows_App/Perun_v1/02_Forms/form_Main.Designer.cs
generated
Normal file
@@ -0,0 +1,630 @@
|
|||||||
|
namespace Perun_v1
|
||||||
|
{
|
||||||
|
partial class form_Main
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Wymagana zmienna projektanta.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Wyczyść wszystkie używane zasoby.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">prawda, jeżeli zarządzane zasoby powinny zostać zlikwidowane; Fałsz w przeciwnym wypadku.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Kod generowany przez Projektanta formularzy systemu Windows
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Metoda wymagana do obsługi projektanta — nie należy modyfikować
|
||||||
|
/// jej zawartości w edytorze kodu.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(form_Main));
|
||||||
|
this.con_List_Received = new System.Windows.Forms.ListBox();
|
||||||
|
this.con_Button_Listen_ON = new System.Windows.Forms.Button();
|
||||||
|
this.con_Button_Listen_OFF = new System.Windows.Forms.Button();
|
||||||
|
this.con_GroupBox_1 = new System.Windows.Forms.GroupBox();
|
||||||
|
this.tim_GUI = new System.Windows.Forms.Timer(this.components);
|
||||||
|
this.con_GroupBox_2 = new System.Windows.Forms.GroupBox();
|
||||||
|
this.label6 = new System.Windows.Forms.Label();
|
||||||
|
this.con_txt_mysql_port = new System.Windows.Forms.TextBox();
|
||||||
|
this.label4 = new System.Windows.Forms.Label();
|
||||||
|
this.con_txt_mysql_username = new System.Windows.Forms.TextBox();
|
||||||
|
this.label3 = new System.Windows.Forms.Label();
|
||||||
|
this.label2 = new System.Windows.Forms.Label();
|
||||||
|
this.label1 = new System.Windows.Forms.Label();
|
||||||
|
this.con_txt_mysql_database = new System.Windows.Forms.TextBox();
|
||||||
|
this.con_txt_mysql_server = new System.Windows.Forms.TextBox();
|
||||||
|
this.con_txt_mysql_password = new System.Windows.Forms.MaskedTextBox();
|
||||||
|
this.con_GroupBox_3 = new System.Windows.Forms.GroupBox();
|
||||||
|
this.con_txt_3rd_lotatc = new System.Windows.Forms.MaskedTextBox();
|
||||||
|
this.con_txt_3rd_srs = new System.Windows.Forms.MaskedTextBox();
|
||||||
|
this.con_check_3rd_lotatc = new System.Windows.Forms.CheckBox();
|
||||||
|
this.con_check_3rd_srs = new System.Windows.Forms.CheckBox();
|
||||||
|
this.con_Button_Quit = new System.Windows.Forms.Button();
|
||||||
|
this.con_lab_github = new System.Windows.Forms.LinkLabel();
|
||||||
|
this.label5 = new System.Windows.Forms.Label();
|
||||||
|
this.trayIconMain = new System.Windows.Forms.NotifyIcon(this.components);
|
||||||
|
this.openFileDialog_SRS = new System.Windows.Forms.OpenFileDialog();
|
||||||
|
this.openFileDialog_LotATC = new System.Windows.Forms.OpenFileDialog();
|
||||||
|
this.tim_3rdparties = new System.Windows.Forms.Timer(this.components);
|
||||||
|
this.tim_MySQL = new System.Windows.Forms.Timer(this.components);
|
||||||
|
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||||
|
this.label8 = new System.Windows.Forms.Label();
|
||||||
|
this.con_txt_dcs_instance = new System.Windows.Forms.MaskedTextBox();
|
||||||
|
this.label7 = new System.Windows.Forms.Label();
|
||||||
|
this.con_txt_dcs_server_port = new System.Windows.Forms.MaskedTextBox();
|
||||||
|
this.label9 = new System.Windows.Forms.Label();
|
||||||
|
this.label10 = new System.Windows.Forms.Label();
|
||||||
|
this.label11 = new System.Windows.Forms.Label();
|
||||||
|
this.label12 = new System.Windows.Forms.Label();
|
||||||
|
this.con_Button_Reset_Flags = new System.Windows.Forms.Button();
|
||||||
|
this.label13 = new System.Windows.Forms.Label();
|
||||||
|
this.label14 = new System.Windows.Forms.Label();
|
||||||
|
this.con_img_logo = new System.Windows.Forms.PictureBox();
|
||||||
|
this.con_img_lotATC = new System.Windows.Forms.PictureBox();
|
||||||
|
this.con_img_srs = new System.Windows.Forms.PictureBox();
|
||||||
|
this.con_img_dcs = new System.Windows.Forms.PictureBox();
|
||||||
|
this.con_img_db = new System.Windows.Forms.PictureBox();
|
||||||
|
this.con_Button_Add_Marker = new System.Windows.Forms.Button();
|
||||||
|
this.con_GroupBox_1.SuspendLayout();
|
||||||
|
this.con_GroupBox_2.SuspendLayout();
|
||||||
|
this.con_GroupBox_3.SuspendLayout();
|
||||||
|
this.groupBox1.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.con_img_logo)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.con_img_lotATC)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.con_img_srs)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.con_img_dcs)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.con_img_db)).BeginInit();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// con_List_Received
|
||||||
|
//
|
||||||
|
this.con_List_Received.Enabled = false;
|
||||||
|
this.con_List_Received.FormattingEnabled = true;
|
||||||
|
this.con_List_Received.Items.AddRange(new object[] {
|
||||||
|
"Not connected"});
|
||||||
|
this.con_List_Received.Location = new System.Drawing.Point(11, 19);
|
||||||
|
this.con_List_Received.Name = "con_List_Received";
|
||||||
|
this.con_List_Received.Size = new System.Drawing.Size(307, 134);
|
||||||
|
this.con_List_Received.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// con_Button_Listen_ON
|
||||||
|
//
|
||||||
|
this.con_Button_Listen_ON.Location = new System.Drawing.Point(12, 602);
|
||||||
|
this.con_Button_Listen_ON.Name = "con_Button_Listen_ON";
|
||||||
|
this.con_Button_Listen_ON.Size = new System.Drawing.Size(86, 39);
|
||||||
|
this.con_Button_Listen_ON.TabIndex = 2;
|
||||||
|
this.con_Button_Listen_ON.Text = "Start";
|
||||||
|
this.con_Button_Listen_ON.UseVisualStyleBackColor = true;
|
||||||
|
this.con_Button_Listen_ON.Click += new System.EventHandler(this.con_Button_Listen_ON_Click);
|
||||||
|
//
|
||||||
|
// con_Button_Listen_OFF
|
||||||
|
//
|
||||||
|
this.con_Button_Listen_OFF.Enabled = false;
|
||||||
|
this.con_Button_Listen_OFF.Location = new System.Drawing.Point(104, 602);
|
||||||
|
this.con_Button_Listen_OFF.Name = "con_Button_Listen_OFF";
|
||||||
|
this.con_Button_Listen_OFF.Size = new System.Drawing.Size(86, 39);
|
||||||
|
this.con_Button_Listen_OFF.TabIndex = 3;
|
||||||
|
this.con_Button_Listen_OFF.Text = "Stop";
|
||||||
|
this.con_Button_Listen_OFF.UseVisualStyleBackColor = true;
|
||||||
|
this.con_Button_Listen_OFF.Click += new System.EventHandler(this.con_Button_Listen_OFF_Click);
|
||||||
|
//
|
||||||
|
// con_GroupBox_1
|
||||||
|
//
|
||||||
|
this.con_GroupBox_1.Controls.Add(this.con_List_Received);
|
||||||
|
this.con_GroupBox_1.Location = new System.Drawing.Point(12, 434);
|
||||||
|
this.con_GroupBox_1.Name = "con_GroupBox_1";
|
||||||
|
this.con_GroupBox_1.Size = new System.Drawing.Size(324, 162);
|
||||||
|
this.con_GroupBox_1.TabIndex = 4;
|
||||||
|
this.con_GroupBox_1.TabStop = false;
|
||||||
|
this.con_GroupBox_1.Text = "Data log";
|
||||||
|
//
|
||||||
|
// tim_GUI
|
||||||
|
//
|
||||||
|
this.tim_GUI.Interval = 200;
|
||||||
|
this.tim_GUI.Tick += new System.EventHandler(this.Tim_GUI_Tick);
|
||||||
|
//
|
||||||
|
// con_GroupBox_2
|
||||||
|
//
|
||||||
|
this.con_GroupBox_2.Controls.Add(this.label6);
|
||||||
|
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_port);
|
||||||
|
this.con_GroupBox_2.Controls.Add(this.label4);
|
||||||
|
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_username);
|
||||||
|
this.con_GroupBox_2.Controls.Add(this.label3);
|
||||||
|
this.con_GroupBox_2.Controls.Add(this.label2);
|
||||||
|
this.con_GroupBox_2.Controls.Add(this.label1);
|
||||||
|
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_database);
|
||||||
|
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_server);
|
||||||
|
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_password);
|
||||||
|
this.con_GroupBox_2.Location = new System.Drawing.Point(14, 54);
|
||||||
|
this.con_GroupBox_2.Name = "con_GroupBox_2";
|
||||||
|
this.con_GroupBox_2.Size = new System.Drawing.Size(324, 154);
|
||||||
|
this.con_GroupBox_2.TabIndex = 5;
|
||||||
|
this.con_GroupBox_2.TabStop = false;
|
||||||
|
this.con_GroupBox_2.Text = "MySQL";
|
||||||
|
//
|
||||||
|
// label6
|
||||||
|
//
|
||||||
|
this.label6.AutoSize = true;
|
||||||
|
this.label6.Location = new System.Drawing.Point(41, 48);
|
||||||
|
this.label6.Name = "label6";
|
||||||
|
this.label6.Size = new System.Drawing.Size(59, 13);
|
||||||
|
this.label6.TabIndex = 9;
|
||||||
|
this.label6.Text = "Server port";
|
||||||
|
//
|
||||||
|
// con_txt_mysql_port
|
||||||
|
//
|
||||||
|
this.con_txt_mysql_port.Location = new System.Drawing.Point(106, 45);
|
||||||
|
this.con_txt_mysql_port.Name = "con_txt_mysql_port";
|
||||||
|
this.con_txt_mysql_port.Size = new System.Drawing.Size(207, 20);
|
||||||
|
this.con_txt_mysql_port.TabIndex = 8;
|
||||||
|
//
|
||||||
|
// label4
|
||||||
|
//
|
||||||
|
this.label4.AutoSize = true;
|
||||||
|
this.label4.Location = new System.Drawing.Point(45, 100);
|
||||||
|
this.label4.Name = "label4";
|
||||||
|
this.label4.Size = new System.Drawing.Size(55, 13);
|
||||||
|
this.label4.TabIndex = 7;
|
||||||
|
this.label4.Text = "Username";
|
||||||
|
//
|
||||||
|
// con_txt_mysql_username
|
||||||
|
//
|
||||||
|
this.con_txt_mysql_username.Location = new System.Drawing.Point(106, 97);
|
||||||
|
this.con_txt_mysql_username.Name = "con_txt_mysql_username";
|
||||||
|
this.con_txt_mysql_username.Size = new System.Drawing.Size(207, 20);
|
||||||
|
this.con_txt_mysql_username.TabIndex = 6;
|
||||||
|
//
|
||||||
|
// label3
|
||||||
|
//
|
||||||
|
this.label3.AutoSize = true;
|
||||||
|
this.label3.Location = new System.Drawing.Point(47, 126);
|
||||||
|
this.label3.Name = "label3";
|
||||||
|
this.label3.Size = new System.Drawing.Size(53, 13);
|
||||||
|
this.label3.TabIndex = 5;
|
||||||
|
this.label3.Text = "Password";
|
||||||
|
//
|
||||||
|
// label2
|
||||||
|
//
|
||||||
|
this.label2.AutoSize = true;
|
||||||
|
this.label2.Location = new System.Drawing.Point(47, 74);
|
||||||
|
this.label2.Name = "label2";
|
||||||
|
this.label2.Size = new System.Drawing.Size(53, 13);
|
||||||
|
this.label2.TabIndex = 4;
|
||||||
|
this.label2.Text = "Database";
|
||||||
|
//
|
||||||
|
// label1
|
||||||
|
//
|
||||||
|
this.label1.AutoSize = true;
|
||||||
|
this.label1.Location = new System.Drawing.Point(22, 22);
|
||||||
|
this.label1.Name = "label1";
|
||||||
|
this.label1.Size = new System.Drawing.Size(78, 13);
|
||||||
|
this.label1.TabIndex = 3;
|
||||||
|
this.label1.Text = "Server address";
|
||||||
|
//
|
||||||
|
// con_txt_mysql_database
|
||||||
|
//
|
||||||
|
this.con_txt_mysql_database.Location = new System.Drawing.Point(106, 71);
|
||||||
|
this.con_txt_mysql_database.Name = "con_txt_mysql_database";
|
||||||
|
this.con_txt_mysql_database.Size = new System.Drawing.Size(207, 20);
|
||||||
|
this.con_txt_mysql_database.TabIndex = 2;
|
||||||
|
//
|
||||||
|
// con_txt_mysql_server
|
||||||
|
//
|
||||||
|
this.con_txt_mysql_server.Location = new System.Drawing.Point(106, 19);
|
||||||
|
this.con_txt_mysql_server.Name = "con_txt_mysql_server";
|
||||||
|
this.con_txt_mysql_server.Size = new System.Drawing.Size(207, 20);
|
||||||
|
this.con_txt_mysql_server.TabIndex = 1;
|
||||||
|
//
|
||||||
|
// con_txt_mysql_password
|
||||||
|
//
|
||||||
|
this.con_txt_mysql_password.Location = new System.Drawing.Point(106, 123);
|
||||||
|
this.con_txt_mysql_password.Name = "con_txt_mysql_password";
|
||||||
|
this.con_txt_mysql_password.PasswordChar = '*';
|
||||||
|
this.con_txt_mysql_password.Size = new System.Drawing.Size(207, 20);
|
||||||
|
this.con_txt_mysql_password.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// con_GroupBox_3
|
||||||
|
//
|
||||||
|
this.con_GroupBox_3.Controls.Add(this.con_txt_3rd_lotatc);
|
||||||
|
this.con_GroupBox_3.Controls.Add(this.con_txt_3rd_srs);
|
||||||
|
this.con_GroupBox_3.Controls.Add(this.con_check_3rd_lotatc);
|
||||||
|
this.con_GroupBox_3.Controls.Add(this.con_check_3rd_srs);
|
||||||
|
this.con_GroupBox_3.Location = new System.Drawing.Point(14, 288);
|
||||||
|
this.con_GroupBox_3.Name = "con_GroupBox_3";
|
||||||
|
this.con_GroupBox_3.Size = new System.Drawing.Size(324, 68);
|
||||||
|
this.con_GroupBox_3.TabIndex = 6;
|
||||||
|
this.con_GroupBox_3.TabStop = false;
|
||||||
|
this.con_GroupBox_3.Text = "3rd party";
|
||||||
|
//
|
||||||
|
// con_txt_3rd_lotatc
|
||||||
|
//
|
||||||
|
this.con_txt_3rd_lotatc.Location = new System.Drawing.Point(123, 39);
|
||||||
|
this.con_txt_3rd_lotatc.Name = "con_txt_3rd_lotatc";
|
||||||
|
this.con_txt_3rd_lotatc.Size = new System.Drawing.Size(190, 20);
|
||||||
|
this.con_txt_3rd_lotatc.TabIndex = 4;
|
||||||
|
this.con_txt_3rd_lotatc.MouseClick += new System.Windows.Forms.MouseEventHandler(this.con_txt_3rd_lotatc_Click);
|
||||||
|
//
|
||||||
|
// con_txt_3rd_srs
|
||||||
|
//
|
||||||
|
this.con_txt_3rd_srs.Location = new System.Drawing.Point(123, 16);
|
||||||
|
this.con_txt_3rd_srs.Name = "con_txt_3rd_srs";
|
||||||
|
this.con_txt_3rd_srs.Size = new System.Drawing.Size(190, 20);
|
||||||
|
this.con_txt_3rd_srs.TabIndex = 3;
|
||||||
|
this.con_txt_3rd_srs.MouseClick += new System.Windows.Forms.MouseEventHandler(this.con_txt_3rd_srs_Click);
|
||||||
|
//
|
||||||
|
// con_check_3rd_lotatc
|
||||||
|
//
|
||||||
|
this.con_check_3rd_lotatc.AutoSize = true;
|
||||||
|
this.con_check_3rd_lotatc.Location = new System.Drawing.Point(6, 42);
|
||||||
|
this.con_check_3rd_lotatc.Name = "con_check_3rd_lotatc";
|
||||||
|
this.con_check_3rd_lotatc.Size = new System.Drawing.Size(100, 17);
|
||||||
|
this.con_check_3rd_lotatc.TabIndex = 1;
|
||||||
|
this.con_check_3rd_lotatc.Text = "LotATC json file";
|
||||||
|
this.con_check_3rd_lotatc.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// con_check_3rd_srs
|
||||||
|
//
|
||||||
|
this.con_check_3rd_srs.AutoSize = true;
|
||||||
|
this.con_check_3rd_srs.Location = new System.Drawing.Point(6, 19);
|
||||||
|
this.con_check_3rd_srs.Name = "con_check_3rd_srs";
|
||||||
|
this.con_check_3rd_srs.Size = new System.Drawing.Size(111, 17);
|
||||||
|
this.con_check_3rd_srs.TabIndex = 0;
|
||||||
|
this.con_check_3rd_srs.Text = "DCS SRS json file";
|
||||||
|
this.con_check_3rd_srs.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// con_Button_Quit
|
||||||
|
//
|
||||||
|
this.con_Button_Quit.Location = new System.Drawing.Point(251, 602);
|
||||||
|
this.con_Button_Quit.Name = "con_Button_Quit";
|
||||||
|
this.con_Button_Quit.Size = new System.Drawing.Size(86, 39);
|
||||||
|
this.con_Button_Quit.TabIndex = 7;
|
||||||
|
this.con_Button_Quit.Text = "Quit";
|
||||||
|
this.con_Button_Quit.UseVisualStyleBackColor = true;
|
||||||
|
this.con_Button_Quit.Click += new System.EventHandler(this.con_Button_Quit_Click);
|
||||||
|
//
|
||||||
|
// con_lab_github
|
||||||
|
//
|
||||||
|
this.con_lab_github.AutoSize = true;
|
||||||
|
this.con_lab_github.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.con_lab_github.Location = new System.Drawing.Point(183, 39);
|
||||||
|
this.con_lab_github.Name = "con_lab_github";
|
||||||
|
this.con_lab_github.Size = new System.Drawing.Size(155, 12);
|
||||||
|
this.con_lab_github.TabIndex = 8;
|
||||||
|
this.con_lab_github.TabStop = true;
|
||||||
|
this.con_lab_github.Text = "https://github.com/szporwolik/perun";
|
||||||
|
this.con_lab_github.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.con_lab_github_LinkClicked);
|
||||||
|
//
|
||||||
|
// label5
|
||||||
|
//
|
||||||
|
this.label5.AutoSize = true;
|
||||||
|
this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.label5.Location = new System.Drawing.Point(183, 27);
|
||||||
|
this.label5.Name = "label5";
|
||||||
|
this.label5.Size = new System.Drawing.Size(102, 12);
|
||||||
|
this.label5.TabIndex = 9;
|
||||||
|
this.label5.Text = "Manual and bugtracker:";
|
||||||
|
//
|
||||||
|
// trayIconMain
|
||||||
|
//
|
||||||
|
this.trayIconMain.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
|
||||||
|
this.trayIconMain.BalloonTipText = "Perun";
|
||||||
|
this.trayIconMain.BalloonTipTitle = "Perun for DCS World";
|
||||||
|
this.trayIconMain.Icon = ((System.Drawing.Icon)(resources.GetObject("trayIconMain.Icon")));
|
||||||
|
this.trayIconMain.Text = "Perun for DCS World";
|
||||||
|
this.trayIconMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.trayIconMain_MouseDoubleClick);
|
||||||
|
this.trayIconMain.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.trayIconMain_MouseDoubleClick);
|
||||||
|
//
|
||||||
|
// openFileDialog_SRS
|
||||||
|
//
|
||||||
|
this.openFileDialog_SRS.FileName = "openFileDialog1";
|
||||||
|
//
|
||||||
|
// openFileDialog_LotATC
|
||||||
|
//
|
||||||
|
this.openFileDialog_LotATC.FileName = "openFileDialog1";
|
||||||
|
//
|
||||||
|
// tim_3rdparties
|
||||||
|
//
|
||||||
|
this.tim_3rdparties.Interval = 30000;
|
||||||
|
this.tim_3rdparties.Tick += new System.EventHandler(this.tim_3rdparties_Tick);
|
||||||
|
//
|
||||||
|
// tim_MySQL
|
||||||
|
//
|
||||||
|
this.tim_MySQL.Tick += new System.EventHandler(this.Tim_MySQL_Tick);
|
||||||
|
//
|
||||||
|
// groupBox1
|
||||||
|
//
|
||||||
|
this.groupBox1.Controls.Add(this.label8);
|
||||||
|
this.groupBox1.Controls.Add(this.con_txt_dcs_instance);
|
||||||
|
this.groupBox1.Controls.Add(this.label7);
|
||||||
|
this.groupBox1.Controls.Add(this.con_txt_dcs_server_port);
|
||||||
|
this.groupBox1.Location = new System.Drawing.Point(14, 214);
|
||||||
|
this.groupBox1.Name = "groupBox1";
|
||||||
|
this.groupBox1.Size = new System.Drawing.Size(324, 68);
|
||||||
|
this.groupBox1.TabIndex = 7;
|
||||||
|
this.groupBox1.TabStop = false;
|
||||||
|
this.groupBox1.Text = "DCS Connection";
|
||||||
|
//
|
||||||
|
// label8
|
||||||
|
//
|
||||||
|
this.label8.AutoSize = true;
|
||||||
|
this.label8.Location = new System.Drawing.Point(41, 45);
|
||||||
|
this.label8.Name = "label8";
|
||||||
|
this.label8.Size = new System.Drawing.Size(62, 13);
|
||||||
|
this.label8.TabIndex = 12;
|
||||||
|
this.label8.Text = "Instance ID";
|
||||||
|
//
|
||||||
|
// con_txt_dcs_instance
|
||||||
|
//
|
||||||
|
this.con_txt_dcs_instance.Location = new System.Drawing.Point(106, 42);
|
||||||
|
this.con_txt_dcs_instance.Name = "con_txt_dcs_instance";
|
||||||
|
this.con_txt_dcs_instance.Size = new System.Drawing.Size(207, 20);
|
||||||
|
this.con_txt_dcs_instance.TabIndex = 11;
|
||||||
|
//
|
||||||
|
// label7
|
||||||
|
//
|
||||||
|
this.label7.AutoSize = true;
|
||||||
|
this.label7.Location = new System.Drawing.Point(41, 19);
|
||||||
|
this.label7.Name = "label7";
|
||||||
|
this.label7.Size = new System.Drawing.Size(59, 13);
|
||||||
|
this.label7.TabIndex = 10;
|
||||||
|
this.label7.Text = "Server port";
|
||||||
|
//
|
||||||
|
// con_txt_dcs_server_port
|
||||||
|
//
|
||||||
|
this.con_txt_dcs_server_port.Location = new System.Drawing.Point(106, 16);
|
||||||
|
this.con_txt_dcs_server_port.Name = "con_txt_dcs_server_port";
|
||||||
|
this.con_txt_dcs_server_port.Size = new System.Drawing.Size(207, 20);
|
||||||
|
this.con_txt_dcs_server_port.TabIndex = 3;
|
||||||
|
//
|
||||||
|
// label9
|
||||||
|
//
|
||||||
|
this.label9.AutoSize = true;
|
||||||
|
this.label9.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.label9.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.label9.Location = new System.Drawing.Point(21, 396);
|
||||||
|
this.label9.Name = "label9";
|
||||||
|
this.label9.Size = new System.Drawing.Size(61, 13);
|
||||||
|
this.label9.TabIndex = 1;
|
||||||
|
this.label9.Text = "Database";
|
||||||
|
//
|
||||||
|
// label10
|
||||||
|
//
|
||||||
|
this.label10.AutoSize = true;
|
||||||
|
this.label10.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.label10.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.label10.Location = new System.Drawing.Point(117, 396);
|
||||||
|
this.label10.Name = "label10";
|
||||||
|
this.label10.Size = new System.Drawing.Size(39, 13);
|
||||||
|
this.label10.TabIndex = 14;
|
||||||
|
this.label10.Text = "Game";
|
||||||
|
//
|
||||||
|
// label11
|
||||||
|
//
|
||||||
|
this.label11.AutoSize = true;
|
||||||
|
this.label11.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.label11.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.label11.Location = new System.Drawing.Point(205, 396);
|
||||||
|
this.label11.Name = "label11";
|
||||||
|
this.label11.Size = new System.Drawing.Size(32, 13);
|
||||||
|
this.label11.TabIndex = 15;
|
||||||
|
this.label11.Text = "SRS";
|
||||||
|
//
|
||||||
|
// label12
|
||||||
|
//
|
||||||
|
this.label12.AutoSize = true;
|
||||||
|
this.label12.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.label12.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.label12.Location = new System.Drawing.Point(282, 396);
|
||||||
|
this.label12.Name = "label12";
|
||||||
|
this.label12.Size = new System.Drawing.Size(49, 13);
|
||||||
|
this.label12.TabIndex = 16;
|
||||||
|
this.label12.Text = "LotATC";
|
||||||
|
//
|
||||||
|
// con_Button_Reset_Flags
|
||||||
|
//
|
||||||
|
this.con_Button_Reset_Flags.Enabled = false;
|
||||||
|
this.con_Button_Reset_Flags.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.con_Button_Reset_Flags.Location = new System.Drawing.Point(224, 414);
|
||||||
|
this.con_Button_Reset_Flags.Name = "con_Button_Reset_Flags";
|
||||||
|
this.con_Button_Reset_Flags.Size = new System.Drawing.Size(114, 20);
|
||||||
|
this.con_Button_Reset_Flags.TabIndex = 17;
|
||||||
|
this.con_Button_Reset_Flags.Text = "Reset error flags";
|
||||||
|
this.con_Button_Reset_Flags.UseVisualStyleBackColor = true;
|
||||||
|
this.con_Button_Reset_Flags.Click += new System.EventHandler(this.con_Button_Reset_Flags_Click);
|
||||||
|
//
|
||||||
|
// label13
|
||||||
|
//
|
||||||
|
this.label13.AutoSize = true;
|
||||||
|
this.label13.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.label13.Location = new System.Drawing.Point(63, 7);
|
||||||
|
this.label13.Name = "label13";
|
||||||
|
this.label13.Size = new System.Drawing.Size(74, 25);
|
||||||
|
this.label13.TabIndex = 19;
|
||||||
|
this.label13.Text = "Perun";
|
||||||
|
//
|
||||||
|
// label14
|
||||||
|
//
|
||||||
|
this.label14.AutoSize = true;
|
||||||
|
this.label14.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.label14.Location = new System.Drawing.Point(65, 32);
|
||||||
|
this.label14.Name = "label14";
|
||||||
|
this.label14.Size = new System.Drawing.Size(88, 13);
|
||||||
|
this.label14.TabIndex = 20;
|
||||||
|
this.label14.Text = "for DCS World";
|
||||||
|
//
|
||||||
|
// con_img_logo
|
||||||
|
//
|
||||||
|
this.con_img_logo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
|
||||||
|
this.con_img_logo.Image = global::Perun_v1.Properties.Resources.perun_logo;
|
||||||
|
this.con_img_logo.Location = new System.Drawing.Point(12, 7);
|
||||||
|
this.con_img_logo.Name = "con_img_logo";
|
||||||
|
this.con_img_logo.Size = new System.Drawing.Size(45, 41);
|
||||||
|
this.con_img_logo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||||
|
this.con_img_logo.TabIndex = 18;
|
||||||
|
this.con_img_logo.TabStop = false;
|
||||||
|
//
|
||||||
|
// con_img_lotATC
|
||||||
|
//
|
||||||
|
this.con_img_lotATC.Location = new System.Drawing.Point(292, 362);
|
||||||
|
this.con_img_lotATC.Name = "con_img_lotATC";
|
||||||
|
this.con_img_lotATC.Size = new System.Drawing.Size(29, 28);
|
||||||
|
this.con_img_lotATC.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||||
|
this.con_img_lotATC.TabIndex = 13;
|
||||||
|
this.con_img_lotATC.TabStop = false;
|
||||||
|
//
|
||||||
|
// con_img_srs
|
||||||
|
//
|
||||||
|
this.con_img_srs.Location = new System.Drawing.Point(207, 362);
|
||||||
|
this.con_img_srs.Name = "con_img_srs";
|
||||||
|
this.con_img_srs.Size = new System.Drawing.Size(29, 28);
|
||||||
|
this.con_img_srs.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||||
|
this.con_img_srs.TabIndex = 12;
|
||||||
|
this.con_img_srs.TabStop = false;
|
||||||
|
//
|
||||||
|
// con_img_dcs
|
||||||
|
//
|
||||||
|
this.con_img_dcs.Location = new System.Drawing.Point(122, 362);
|
||||||
|
this.con_img_dcs.Name = "con_img_dcs";
|
||||||
|
this.con_img_dcs.Size = new System.Drawing.Size(29, 28);
|
||||||
|
this.con_img_dcs.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||||
|
this.con_img_dcs.TabIndex = 11;
|
||||||
|
this.con_img_dcs.TabStop = false;
|
||||||
|
//
|
||||||
|
// con_img_db
|
||||||
|
//
|
||||||
|
this.con_img_db.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
|
||||||
|
this.con_img_db.Location = new System.Drawing.Point(37, 362);
|
||||||
|
this.con_img_db.Name = "con_img_db";
|
||||||
|
this.con_img_db.Size = new System.Drawing.Size(29, 28);
|
||||||
|
this.con_img_db.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||||
|
this.con_img_db.TabIndex = 10;
|
||||||
|
this.con_img_db.TabStop = false;
|
||||||
|
//
|
||||||
|
// con_Button_Add_Marker
|
||||||
|
//
|
||||||
|
this.con_Button_Add_Marker.Enabled = false;
|
||||||
|
this.con_Button_Add_Marker.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.con_Button_Add_Marker.Location = new System.Drawing.Point(12, 414);
|
||||||
|
this.con_Button_Add_Marker.Name = "con_Button_Add_Marker";
|
||||||
|
this.con_Button_Add_Marker.Size = new System.Drawing.Size(114, 20);
|
||||||
|
this.con_Button_Add_Marker.TabIndex = 21;
|
||||||
|
this.con_Button_Add_Marker.Text = "Add log marker";
|
||||||
|
this.con_Button_Add_Marker.UseVisualStyleBackColor = true;
|
||||||
|
this.con_Button_Add_Marker.Click += new System.EventHandler(this.con_Button_Add_Marker_Click);
|
||||||
|
//
|
||||||
|
// form_Main
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(349, 653);
|
||||||
|
this.Controls.Add(this.con_Button_Add_Marker);
|
||||||
|
this.Controls.Add(this.label14);
|
||||||
|
this.Controls.Add(this.label13);
|
||||||
|
this.Controls.Add(this.con_img_logo);
|
||||||
|
this.Controls.Add(this.con_Button_Reset_Flags);
|
||||||
|
this.Controls.Add(this.label12);
|
||||||
|
this.Controls.Add(this.label11);
|
||||||
|
this.Controls.Add(this.label10);
|
||||||
|
this.Controls.Add(this.label9);
|
||||||
|
this.Controls.Add(this.con_img_lotATC);
|
||||||
|
this.Controls.Add(this.con_img_srs);
|
||||||
|
this.Controls.Add(this.con_img_dcs);
|
||||||
|
this.Controls.Add(this.con_img_db);
|
||||||
|
this.Controls.Add(this.groupBox1);
|
||||||
|
this.Controls.Add(this.con_GroupBox_3);
|
||||||
|
this.Controls.Add(this.label5);
|
||||||
|
this.Controls.Add(this.con_lab_github);
|
||||||
|
this.Controls.Add(this.con_Button_Quit);
|
||||||
|
this.Controls.Add(this.con_GroupBox_2);
|
||||||
|
this.Controls.Add(this.con_GroupBox_1);
|
||||||
|
this.Controls.Add(this.con_Button_Listen_OFF);
|
||||||
|
this.Controls.Add(this.con_Button_Listen_ON);
|
||||||
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||||
|
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||||
|
this.MaximizeBox = false;
|
||||||
|
this.Name = "form_Main";
|
||||||
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||||
|
this.Text = "Perun for DCS";
|
||||||
|
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.form_Main_FormClosing);
|
||||||
|
this.Load += new System.EventHandler(this.form_Main_Load);
|
||||||
|
this.con_GroupBox_1.ResumeLayout(false);
|
||||||
|
this.con_GroupBox_2.ResumeLayout(false);
|
||||||
|
this.con_GroupBox_2.PerformLayout();
|
||||||
|
this.con_GroupBox_3.ResumeLayout(false);
|
||||||
|
this.con_GroupBox_3.PerformLayout();
|
||||||
|
this.groupBox1.ResumeLayout(false);
|
||||||
|
this.groupBox1.PerformLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.con_img_logo)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.con_img_lotATC)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.con_img_srs)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.con_img_dcs)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.con_img_db)).EndInit();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.ListBox con_List_Received;
|
||||||
|
private System.Windows.Forms.Button con_Button_Listen_ON;
|
||||||
|
private System.Windows.Forms.Button con_Button_Listen_OFF;
|
||||||
|
private System.Windows.Forms.GroupBox con_GroupBox_1;
|
||||||
|
private System.Windows.Forms.Timer tim_GUI;
|
||||||
|
private System.Windows.Forms.GroupBox con_GroupBox_2;
|
||||||
|
private System.Windows.Forms.GroupBox con_GroupBox_3;
|
||||||
|
private System.Windows.Forms.TextBox con_txt_mysql_database;
|
||||||
|
private System.Windows.Forms.TextBox con_txt_mysql_server;
|
||||||
|
private System.Windows.Forms.MaskedTextBox con_txt_mysql_password;
|
||||||
|
private System.Windows.Forms.Button con_Button_Quit;
|
||||||
|
private System.Windows.Forms.MaskedTextBox con_txt_3rd_lotatc;
|
||||||
|
private System.Windows.Forms.MaskedTextBox con_txt_3rd_srs;
|
||||||
|
private System.Windows.Forms.CheckBox con_check_3rd_lotatc;
|
||||||
|
private System.Windows.Forms.CheckBox con_check_3rd_srs;
|
||||||
|
private System.Windows.Forms.Label label4;
|
||||||
|
private System.Windows.Forms.TextBox con_txt_mysql_username;
|
||||||
|
private System.Windows.Forms.Label label3;
|
||||||
|
private System.Windows.Forms.Label label2;
|
||||||
|
private System.Windows.Forms.Label label1;
|
||||||
|
private System.Windows.Forms.LinkLabel con_lab_github;
|
||||||
|
private System.Windows.Forms.Label label5;
|
||||||
|
private System.Windows.Forms.NotifyIcon trayIconMain;
|
||||||
|
private System.Windows.Forms.OpenFileDialog openFileDialog_SRS;
|
||||||
|
private System.Windows.Forms.OpenFileDialog openFileDialog_LotATC;
|
||||||
|
private System.Windows.Forms.Timer tim_3rdparties;
|
||||||
|
private System.Windows.Forms.Label label6;
|
||||||
|
private System.Windows.Forms.TextBox con_txt_mysql_port;
|
||||||
|
private System.Windows.Forms.Timer tim_MySQL;
|
||||||
|
private System.Windows.Forms.GroupBox groupBox1;
|
||||||
|
private System.Windows.Forms.MaskedTextBox con_txt_dcs_server_port;
|
||||||
|
private System.Windows.Forms.Label label7;
|
||||||
|
private System.Windows.Forms.Label label8;
|
||||||
|
private System.Windows.Forms.MaskedTextBox con_txt_dcs_instance;
|
||||||
|
private System.Windows.Forms.PictureBox con_img_db;
|
||||||
|
private System.Windows.Forms.PictureBox con_img_dcs;
|
||||||
|
private System.Windows.Forms.PictureBox con_img_srs;
|
||||||
|
private System.Windows.Forms.PictureBox con_img_lotATC;
|
||||||
|
private System.Windows.Forms.Label label9;
|
||||||
|
private System.Windows.Forms.Label label10;
|
||||||
|
private System.Windows.Forms.Label label11;
|
||||||
|
private System.Windows.Forms.Label label12;
|
||||||
|
private System.Windows.Forms.Button con_Button_Reset_Flags;
|
||||||
|
private System.Windows.Forms.PictureBox con_img_logo;
|
||||||
|
private System.Windows.Forms.Label label13;
|
||||||
|
private System.Windows.Forms.Label label14;
|
||||||
|
private System.Windows.Forms.Button con_Button_Add_Marker;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
640
02_Windows_App/Perun_v1/02_Forms/form_Main.cs
Normal file
@@ -0,0 +1,640 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace Perun_v1
|
||||||
|
{
|
||||||
|
public partial class form_Main : Form
|
||||||
|
{
|
||||||
|
// Variable definitions
|
||||||
|
public string[] DatabaseSendBuffer = new string[50]; // MySQL send buffer
|
||||||
|
public bool AppCanClose = false; // Helper to handle system tray - true needed to quit the app
|
||||||
|
|
||||||
|
public DatabaseController DatabaseConnection = new DatabaseController(); // Main MySQL controller
|
||||||
|
public TCPController TCPServer = new TCPController(); // Main TCP controller
|
||||||
|
|
||||||
|
public bool ExtSRSStatus; // True if to use empty/default SRS status
|
||||||
|
public bool ExtLotATCStatus; // True if to use empty/default LotATC status
|
||||||
|
|
||||||
|
// ################################ Main ################################
|
||||||
|
private void form_Main_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Form loaded
|
||||||
|
Globals.AppLogHistory[0] = DateTime.Now.ToString("HH:mm:ss") + " > " + "Perun started"; // Add information to the log control
|
||||||
|
form_Main_LoadSettings(); // Load settings from registry
|
||||||
|
|
||||||
|
// Display build version in title bar
|
||||||
|
Globals.AppTitle = PerunHelper.GetAppVersion(this.Text + " - ");
|
||||||
|
this.Text = Globals.AppTitle;
|
||||||
|
|
||||||
|
// Use command line parameters
|
||||||
|
string[] args = Environment.GetCommandLineArgs();
|
||||||
|
if (args.Length > 1)
|
||||||
|
{
|
||||||
|
// Get argument server port
|
||||||
|
if (args[1] != null)
|
||||||
|
{
|
||||||
|
con_txt_dcs_server_port.Text = args[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (args.Length > 2)
|
||||||
|
{
|
||||||
|
// Get argument instance id
|
||||||
|
if (args[2] != null)
|
||||||
|
{
|
||||||
|
con_txt_dcs_instance.Text = args[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (args.Length > 3)
|
||||||
|
{
|
||||||
|
// Get argument DCS SRS file path
|
||||||
|
if (args[3] != null)
|
||||||
|
{
|
||||||
|
con_txt_3rd_srs.Text = args[3];
|
||||||
|
con_check_3rd_srs.Checked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (args.Length > 4)
|
||||||
|
{
|
||||||
|
// Get argument lotATC file path
|
||||||
|
if (args[4] != null)
|
||||||
|
{
|
||||||
|
con_txt_3rd_lotatc.Text = args[4];
|
||||||
|
con_check_3rd_lotatc.Checked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize controls
|
||||||
|
con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
|
||||||
|
con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
|
||||||
|
con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
|
||||||
|
con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
|
||||||
|
}
|
||||||
|
|
||||||
|
public form_Main()
|
||||||
|
{
|
||||||
|
// Form init
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ################################ Helpers ################################
|
||||||
|
private void form_Main_LoadSettings()
|
||||||
|
{
|
||||||
|
// Loads registry settings
|
||||||
|
con_txt_mysql_database.Text = Properties.Settings.Default.MYSQL_DB;
|
||||||
|
con_txt_mysql_username.Text = Properties.Settings.Default.MYSQL_User;
|
||||||
|
con_txt_mysql_password.Text = Properties.Settings.Default.MYSQL_Password;
|
||||||
|
con_txt_mysql_server.Text = Properties.Settings.Default.MYSQL_Server;
|
||||||
|
con_txt_mysql_port.Text = Properties.Settings.Default.MYSQL_Port;
|
||||||
|
con_txt_3rd_lotatc.Text = Properties.Settings.Default.OTHER_LOTATC_FILE;
|
||||||
|
con_txt_3rd_srs.Text = Properties.Settings.Default.OTHER_SRS_FILE;
|
||||||
|
con_check_3rd_lotatc.Checked = Properties.Settings.Default.OTHER_LOTATC_USE;
|
||||||
|
con_check_3rd_srs.Checked = Properties.Settings.Default.OTHER_SRS_USE;
|
||||||
|
con_txt_dcs_server_port.Text = Properties.Settings.Default.DCS_Server_Port.ToString();
|
||||||
|
con_txt_dcs_instance.Text = Properties.Settings.Default.DCS_Instance.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void form_Main_SaveSettings()
|
||||||
|
{
|
||||||
|
// Saves registry settings
|
||||||
|
Properties.Settings.Default.MYSQL_Server = con_txt_mysql_database.Text;
|
||||||
|
Properties.Settings.Default.MYSQL_DB = con_txt_mysql_database.Text;
|
||||||
|
Properties.Settings.Default.MYSQL_User = con_txt_mysql_username.Text;
|
||||||
|
Properties.Settings.Default.MYSQL_Password = con_txt_mysql_password.Text;
|
||||||
|
Properties.Settings.Default.MYSQL_Port = con_txt_mysql_port.Text;
|
||||||
|
Properties.Settings.Default.MYSQL_Server = con_txt_mysql_server.Text;
|
||||||
|
Properties.Settings.Default.MYSQL_Port = con_txt_mysql_port.Text;
|
||||||
|
Properties.Settings.Default.OTHER_LOTATC_FILE = con_txt_3rd_lotatc.Text;
|
||||||
|
Properties.Settings.Default.OTHER_SRS_FILE = con_txt_3rd_srs.Text;
|
||||||
|
Properties.Settings.Default.OTHER_LOTATC_USE = con_check_3rd_lotatc.Checked;
|
||||||
|
Properties.Settings.Default.OTHER_SRS_USE = con_check_3rd_srs.Checked;
|
||||||
|
Properties.Settings.Default.DCS_Server_Port = Int32.Parse(con_txt_dcs_server_port.Text);
|
||||||
|
Properties.Settings.Default.DCS_Instance = Int32.Parse(con_txt_dcs_instance.Text);
|
||||||
|
|
||||||
|
Properties.Settings.Default.Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void form_Main_SetControlsToConnected()
|
||||||
|
{
|
||||||
|
// Disables controls
|
||||||
|
con_Button_Add_Marker.Enabled = true;
|
||||||
|
con_Button_Listen_OFF.Enabled = true;
|
||||||
|
con_Button_Listen_ON.Enabled = false;
|
||||||
|
con_Button_Quit.Enabled = false;
|
||||||
|
con_Button_Reset_Flags.Enabled = true;
|
||||||
|
con_txt_mysql_database.Enabled = false;
|
||||||
|
con_txt_mysql_username.Enabled = false;
|
||||||
|
con_txt_mysql_password.Enabled = false;
|
||||||
|
con_txt_mysql_server.Enabled = false;
|
||||||
|
con_txt_mysql_port.Enabled = false;
|
||||||
|
con_txt_3rd_lotatc.Enabled = false;
|
||||||
|
con_txt_3rd_srs.Enabled = false;
|
||||||
|
con_check_3rd_lotatc.Enabled = false;
|
||||||
|
con_check_3rd_srs.Enabled = false;
|
||||||
|
con_txt_dcs_server_port.Enabled = false;
|
||||||
|
con_txt_dcs_instance.Enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void form_Main_SetControlsToDisconnected()
|
||||||
|
{
|
||||||
|
// Enables controls
|
||||||
|
con_Button_Reset_Flags.Enabled = false;
|
||||||
|
con_Button_Listen_OFF.Enabled = false;
|
||||||
|
con_Button_Listen_ON.Enabled = true;
|
||||||
|
con_Button_Quit.Enabled = true;
|
||||||
|
con_Button_Add_Marker.Enabled = false;
|
||||||
|
con_txt_mysql_database.Enabled = true;
|
||||||
|
con_txt_mysql_username.Enabled = true;
|
||||||
|
con_txt_mysql_password.Enabled = true;
|
||||||
|
con_txt_mysql_port.Enabled = true;
|
||||||
|
con_txt_mysql_server.Enabled = true;
|
||||||
|
con_txt_3rd_lotatc.Enabled = true;
|
||||||
|
con_txt_3rd_srs.Enabled = true;
|
||||||
|
con_check_3rd_lotatc.Enabled = true;
|
||||||
|
con_check_3rd_srs.Enabled = true;
|
||||||
|
con_txt_dcs_server_port.Enabled = true;
|
||||||
|
con_txt_dcs_instance.Enabled = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ################################ User input ################################
|
||||||
|
private void con_Button_Listen_ON_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Start listening
|
||||||
|
// Set globals
|
||||||
|
Globals.AppInstanceID = Int32.Parse(con_txt_dcs_instance.Text);
|
||||||
|
Globals.AppForceIconReload = true;
|
||||||
|
Globals.ErrorsDatabase = 0; // Reset error counter
|
||||||
|
Globals.ErrorsGame = 0; // Reset error counter
|
||||||
|
Globals.ErrorsSRS = 0; // Reset error counter
|
||||||
|
Globals.ErrorsLotATC = 0; // Reset error counter
|
||||||
|
Globals.StatusConnection = false; // Reset connection status
|
||||||
|
|
||||||
|
// Prepare GUI
|
||||||
|
form_Main_SetControlsToConnected();
|
||||||
|
form_Main_SaveSettings();
|
||||||
|
this.Text = "[#" + con_txt_dcs_instance.Text + "] " + Globals.AppTitle; // Set title bar
|
||||||
|
trayIconMain.Text = this.Text; // Set notification icon text
|
||||||
|
|
||||||
|
// Prepare MySQL connection string
|
||||||
|
DatabaseConnection.DatabaseConnectionString = "server=" + con_txt_mysql_server.Text + ";user=" + con_txt_mysql_username.Text + ";database=" + con_txt_mysql_database.Text + ";port=" + con_txt_mysql_port.Text + ";password=" + con_txt_mysql_password.Text;
|
||||||
|
|
||||||
|
// Start listening
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Opening connections",0,1);
|
||||||
|
TCPServer.Create(Int32.Parse(con_txt_dcs_server_port.Text), ref Globals.AppLogHistory, ref DatabaseSendBuffer);
|
||||||
|
TCPServer.thrTCPListener = new Thread(TCPServer.StartListen);
|
||||||
|
TCPServer.thrTCPListener.Start();
|
||||||
|
TCPServer.thrTCPListener.Name = "TCPThread";
|
||||||
|
|
||||||
|
// Start timmers
|
||||||
|
tim_MySQL.Enabled = true;
|
||||||
|
tim_GUI.Enabled = true;
|
||||||
|
tim_3rdparties.Enabled = true;
|
||||||
|
|
||||||
|
// Send initial data
|
||||||
|
Tim_MySQL_Tick(null, null);
|
||||||
|
tim_3rdparties_Tick(null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void con_Button_Listen_OFF_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Stop listening
|
||||||
|
// Prepare GUI
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Closing connections",0,1);
|
||||||
|
con_Button_Listen_OFF.Enabled = false;
|
||||||
|
Tim_GUI_Tick(null, null);
|
||||||
|
this.Refresh();
|
||||||
|
Application.DoEvents();
|
||||||
|
|
||||||
|
// Stop timmers
|
||||||
|
tim_GUI.Enabled = false;
|
||||||
|
tim_3rdparties.Enabled = false;
|
||||||
|
tim_MySQL.Enabled = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Stop the server
|
||||||
|
TCPServer.StopListen();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "TCP ERROR, error: " + ex.Message, 2, 1, "?");
|
||||||
|
Console.WriteLine(ex.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
while (TCPServer.thrTCPListener.IsAlive)
|
||||||
|
{
|
||||||
|
// Wait untill TCP server closed connection
|
||||||
|
Thread.Sleep(200); //ms
|
||||||
|
}
|
||||||
|
form_Main_SetControlsToDisconnected(); // Enable controls
|
||||||
|
|
||||||
|
// Load status images
|
||||||
|
con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
|
||||||
|
con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
|
||||||
|
con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
|
||||||
|
con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
|
||||||
|
|
||||||
|
// Display information about closed connections
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Connections closed",0,1);
|
||||||
|
Tim_GUI_Tick(null, null);
|
||||||
|
|
||||||
|
// Set title bar
|
||||||
|
this.Text = Globals.AppTitle;
|
||||||
|
trayIconMain.Text = this.Text;
|
||||||
|
|
||||||
|
// Set globals
|
||||||
|
Globals.AppInstanceID = 0;
|
||||||
|
Globals.AppUpdateGUI = false;
|
||||||
|
Globals.StatusDatabase = false;
|
||||||
|
Globals.StatusHistoryConnection = false;
|
||||||
|
Globals.StatusSRS = false;
|
||||||
|
Globals.StatusLotATC = false;
|
||||||
|
Globals.StatusConnection = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void con_lab_github_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
||||||
|
{
|
||||||
|
// Open default browser with link to Perun repo
|
||||||
|
ProcessStartInfo sInfo = new ProcessStartInfo("https://github.com/szporwolik/perun");
|
||||||
|
Process.Start(sInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void con_txt_3rd_srs_Click(object sender, MouseEventArgs e)
|
||||||
|
{
|
||||||
|
// Chose SRS Json file
|
||||||
|
if (openFileDialog_SRS.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
con_txt_3rd_srs.Text = openFileDialog_SRS.FileName;
|
||||||
|
con_check_3rd_srs.Checked = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_txt_3rd_srs.Text = "";
|
||||||
|
con_check_3rd_srs.Checked = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void con_txt_3rd_lotatc_Click(object sender, MouseEventArgs e)
|
||||||
|
{
|
||||||
|
// Chose LotATC Json file
|
||||||
|
if (openFileDialog_LotATC.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
con_txt_3rd_lotatc.Text = openFileDialog_LotATC.FileName;
|
||||||
|
con_check_3rd_lotatc.Checked = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_txt_3rd_lotatc.Text = "";
|
||||||
|
con_check_3rd_lotatc.Checked = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ################################ Form state ################################
|
||||||
|
private void con_Button_Quit_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Try to close app
|
||||||
|
DialogResult dialogResult = MessageBox.Show("Are you sure to exit Perun?", "Question", MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question);
|
||||||
|
if (dialogResult == DialogResult.Yes)
|
||||||
|
{
|
||||||
|
form_Main_SaveSettings();
|
||||||
|
|
||||||
|
AppCanClose = true; // Save settings on exit
|
||||||
|
this.Close(); // Allow to exit application
|
||||||
|
}
|
||||||
|
else if (dialogResult == DialogResult.No)
|
||||||
|
{
|
||||||
|
//do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void form_Main_SendToTray()
|
||||||
|
{
|
||||||
|
// Sends app to system tray
|
||||||
|
trayIconMain.Visible = true;
|
||||||
|
this.WindowState = FormWindowState.Minimized;
|
||||||
|
this.ShowInTaskbar = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void form_Main_BringFromTray()
|
||||||
|
{
|
||||||
|
// Sends app from system tray
|
||||||
|
trayIconMain.Visible = false;
|
||||||
|
this.WindowState = FormWindowState.Normal;
|
||||||
|
this.ShowInTaskbar = true;
|
||||||
|
|
||||||
|
if (WindowState == FormWindowState.Minimized)
|
||||||
|
{
|
||||||
|
WindowState = FormWindowState.Normal;
|
||||||
|
}
|
||||||
|
// get our current "TopMost" value (ours will always be false though)
|
||||||
|
bool top = TopMost;
|
||||||
|
// make our form jump to the top of everything
|
||||||
|
TopMost = true;
|
||||||
|
// set it back to whatever it was
|
||||||
|
TopMost = top;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void form_Main_FormClosing(object sender, FormClosingEventArgs e)
|
||||||
|
{
|
||||||
|
// Minimize to try on clicking "X"
|
||||||
|
if (e.CloseReason == CloseReason.UserClosing && !AppCanClose)
|
||||||
|
{
|
||||||
|
e.Cancel = true;
|
||||||
|
form_Main_SendToTray(); // Send app to system tray
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void trayIconMain_MouseDoubleClick(object sender, MouseEventArgs e)
|
||||||
|
{
|
||||||
|
// Maximize from tray
|
||||||
|
form_Main_BringFromTray(); // Bring app from system tray
|
||||||
|
}
|
||||||
|
|
||||||
|
// ################################ Timers ################################
|
||||||
|
private void Tim_GUI_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Main timer to sync GUI with background tasks and flush buffers
|
||||||
|
|
||||||
|
// Refresh Log Window
|
||||||
|
if (Globals.AppUpdateGUI)
|
||||||
|
{
|
||||||
|
con_List_Received.Items.Clear();
|
||||||
|
foreach (string i in Globals.AppLogHistory)
|
||||||
|
{
|
||||||
|
if (i != null)
|
||||||
|
{
|
||||||
|
con_List_Received.Items.Add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Globals.AppUpdateGUI = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Do nothing , control does not require update
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update status icons at main form - MySQL
|
||||||
|
if ((DatabaseConnection.DatabaseStatus != Globals.StatusDatabase) || Globals.AppForceIconReload)
|
||||||
|
{
|
||||||
|
if (DatabaseConnection.DatabaseStatus)
|
||||||
|
{
|
||||||
|
if (Globals.ErrorsDatabase == 0)
|
||||||
|
{
|
||||||
|
con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected_error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected_error");
|
||||||
|
}
|
||||||
|
Globals.StatusDatabase = DatabaseConnection.DatabaseStatus;
|
||||||
|
}
|
||||||
|
// Update status icons at main form - DCS
|
||||||
|
if ((Globals.StatusConnection != Globals.StatusHistoryConnection) || Globals.AppForceIconReload || Globals.ErrorsGame != Globals.ErrorsHistoryGame)
|
||||||
|
{
|
||||||
|
if (Globals.StatusConnection)
|
||||||
|
{
|
||||||
|
if (Globals.ErrorsGame == 0)
|
||||||
|
{
|
||||||
|
con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected_error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected_error");
|
||||||
|
}
|
||||||
|
Globals.StatusHistoryConnection = Globals.StatusConnection;
|
||||||
|
Globals.ErrorsHistoryGame = Globals.ErrorsGame;
|
||||||
|
}
|
||||||
|
// Update status icons at main form - SRS
|
||||||
|
if ((ExtSRSStatus != Globals.StatusSRS) || Globals.AppForceIconReload)
|
||||||
|
{
|
||||||
|
if (ExtSRSStatus && con_check_3rd_srs.Checked)
|
||||||
|
{
|
||||||
|
if (Globals.ErrorsSRS == 0)
|
||||||
|
{
|
||||||
|
con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected_error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected_error");
|
||||||
|
}
|
||||||
|
Globals.StatusSRS = ExtSRSStatus;
|
||||||
|
}
|
||||||
|
// Update status icons at main form - LotATC
|
||||||
|
if ((ExtLotATCStatus != Globals.StatusLotATC) || Globals.AppForceIconReload)
|
||||||
|
{
|
||||||
|
if (ExtLotATCStatus && con_check_3rd_lotatc.Checked)
|
||||||
|
{
|
||||||
|
if (Globals.ErrorsLotATC == 0)
|
||||||
|
{
|
||||||
|
con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected_error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected_error");
|
||||||
|
}
|
||||||
|
Globals.StatusLotATC = ExtLotATCStatus;
|
||||||
|
}
|
||||||
|
Globals.AppForceIconReload = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Tim_MySQL_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Send buffer to MySQL
|
||||||
|
for (int i = 0; i < DatabaseSendBuffer.Length - 1; i++)
|
||||||
|
{
|
||||||
|
if (DatabaseSendBuffer[i] != null)
|
||||||
|
{
|
||||||
|
if (DatabaseConnection.SendToMySql(DatabaseSendBuffer[i]) > 0)
|
||||||
|
{
|
||||||
|
DatabaseSendBuffer[i] = null; // If packet was send then delete it from send buffer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tim_3rdparties_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Main timer to check MySQL connection and send JSON files to MySQL
|
||||||
|
|
||||||
|
// Send ping to check for possible connection issues
|
||||||
|
DatabaseConnection.SendToMySql("", true);
|
||||||
|
|
||||||
|
if (PerunHelper.CheckVersions()==0)
|
||||||
|
{
|
||||||
|
MessageBox.Show("Version mismatch detected - please check log files and update.\n\nPerun will now terminate.", "Perun ERROR!",MessageBoxButtons.OK,MessageBoxIcon.Error);
|
||||||
|
con_Button_Listen_OFF_Click(null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Take care of 3rd party stuff
|
||||||
|
string ExtSRSJson = "";
|
||||||
|
string ExtLotATCJson = "";
|
||||||
|
|
||||||
|
bool ExtSRSUseDefault = true;
|
||||||
|
bool ExtLotATCUseDefault = true;
|
||||||
|
|
||||||
|
// Handle SRS
|
||||||
|
if (Globals.StatusConnection)
|
||||||
|
{
|
||||||
|
if (con_check_3rd_srs.Checked)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ExtSRSJson = System.IO.File.ReadAllText(con_txt_3rd_srs.Text);
|
||||||
|
dynamic raw_lotatc = JsonConvert.DeserializeObject(ExtSRSJson);
|
||||||
|
|
||||||
|
for (int i = 0; i < raw_lotatc.Count; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (raw_lotatc[i].RadioInfo != null)
|
||||||
|
{
|
||||||
|
|
||||||
|
int temp = raw_lotatc[i].RadioInfo.radios.Count - 1;
|
||||||
|
for (int j = temp; j >= 0; j--)
|
||||||
|
{
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].enc.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].encKey.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].encMode.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].freqMax.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].freqMin.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].modulation.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].freqMode.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].volMode.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].expansion.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].channel.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].simul.Parent.Remove();
|
||||||
|
|
||||||
|
if (raw_lotatc[i].RadioInfo.radios[j].name == "No Radio")
|
||||||
|
{
|
||||||
|
raw_lotatc[i].RadioInfo.radios[j].Remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
raw_lotatc[i].ClientChannelId.Parent.Remove();
|
||||||
|
raw_lotatc[i].RadioInfo.simultaneousTransmission.Parent.Remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (raw_lotatc.Count > 0)
|
||||||
|
{
|
||||||
|
ExtSRSJson = JsonConvert.SerializeObject(raw_lotatc);
|
||||||
|
ExtSRSJson = "{'type':'100','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':'" + ExtSRSJson + "'}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ExtSRSJson = "{'type':'100','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':{'ignore':'false'}}"; // No SRS clients connected
|
||||||
|
}
|
||||||
|
ExtSRSUseDefault = false;
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "SRS data loaded", 3, 0, "100", true);
|
||||||
|
ExtSRSStatus = true;
|
||||||
|
}
|
||||||
|
catch (Exception exc_srs)
|
||||||
|
{
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "SRS data ERROR , error: " + exc_srs.Message, 3, 1, "100");
|
||||||
|
ExtSRSStatus = false;
|
||||||
|
Globals.ErrorsSRS++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
if (ExtSRSUseDefault)
|
||||||
|
{
|
||||||
|
ExtSRSJson = "{'type':'100','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':{'ignore':'true'}}";
|
||||||
|
}
|
||||||
|
DatabaseConnection.SendToMySql(ExtSRSJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle LotATC
|
||||||
|
if (Globals.StatusConnection)
|
||||||
|
{
|
||||||
|
if (con_check_3rd_lotatc.Checked)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ExtLotATCJson = System.IO.File.ReadAllText(con_txt_3rd_lotatc.Text);
|
||||||
|
dynamic raw_srs = JsonConvert.DeserializeObject(ExtLotATCJson);
|
||||||
|
|
||||||
|
ExtLotATCJson = "{'type':'101','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':'" + ExtLotATCJson + "'}";
|
||||||
|
ExtLotATCUseDefault = false;
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "LotATC data loaded", 3, 0, "101", true);
|
||||||
|
ExtLotATCStatus = true;
|
||||||
|
}
|
||||||
|
catch (Exception exc_lotatc)
|
||||||
|
{
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "LotATC data ERROR, error: " + exc_lotatc.Message, 3, 1, "101");
|
||||||
|
ExtLotATCStatus = false;
|
||||||
|
Globals.ErrorsLotATC++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
if (ExtLotATCUseDefault)
|
||||||
|
{
|
||||||
|
ExtLotATCJson = "{'type':'101','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':{'ignore':'true'}}"; // No LotATC controller connected
|
||||||
|
}
|
||||||
|
DatabaseConnection.SendToMySql(ExtLotATCJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let's do not risk int overload
|
||||||
|
Globals.ErrorsDatabase = (Globals.ErrorsDatabase > 999) ? 999 : Globals.ErrorsDatabase;
|
||||||
|
Globals.ErrorsGame = (Globals.ErrorsGame > 999) ? 999 : Globals.ErrorsGame;
|
||||||
|
Globals.ErrorsSRS = (Globals.ErrorsSRS > 999) ? 999 : Globals.ErrorsSRS;
|
||||||
|
Globals.ErrorsLotATC = (Globals.ErrorsLotATC > 999) ? 999 : Globals.ErrorsLotATC;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void con_Button_Reset_Flags_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Reset error flags
|
||||||
|
DialogResult dialogResult = MessageBox.Show("Are you sure to reset error flags?", "Question", MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question);
|
||||||
|
if (dialogResult == DialogResult.Yes)
|
||||||
|
{
|
||||||
|
// Reset errors counter
|
||||||
|
Globals.ErrorsDatabase = 0; // MySQL - Error counter
|
||||||
|
Globals.ErrorsGame = 0; // TCP connection - Error counter
|
||||||
|
Globals.ErrorsHistoryGame = 0; // TCP connection - historic value of Error counter
|
||||||
|
Globals.ErrorsSRS = 0; // DCS SRS - error counter
|
||||||
|
Globals.ErrorsLotATC = 0; // LotATC - error counter
|
||||||
|
|
||||||
|
// Force icons reload
|
||||||
|
Globals.AppForceIconReload = true;
|
||||||
|
|
||||||
|
// Add information
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "Resetted error counter",0,1);
|
||||||
|
}
|
||||||
|
else if (dialogResult == DialogResult.No)
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void con_Button_Add_Marker_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Added user marker
|
||||||
|
PerunHelper.AddLog(ref Globals.AppLogHistory, "User Marker",0,1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
708
02_Windows_App/Perun_v1/02_Forms/form_Main.resx
Normal file
@@ -0,0 +1,708 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<metadata name="tim_GUI.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="trayIconMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>134, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
|
<data name="trayIconMain.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAABAAEAQD8AAAEAIAAgQQAAFgAAACgAAABAAAAAfgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGB
|
||||||
|
gQGAgICFgICA7YCAgPaAgICfgICACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACAgIB6gICA/4CAgP+AgID/gICA/4CAgKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA14CAgP+AgID/gICA/4CAgP+AgID8hISEAgAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs
|
||||||
|
7A/s7Ozs7Ozs/+zs7P/s7Oz/7Ozs/+zs7IwAAAAAAAAAAAAAAAAAAAAAAAAAAICAgNSAgID/gICA/4CA
|
||||||
|
gP+AgID/gICA+4KCggEAAAAAAAAAAAAAAAAAAAAA7Ozse+zs7P/s7Oz/7Ozs/+zs7P/s7Ozv7OzsFAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAA7OzsZ+zs7P/s7Oz/7Ozs/+zs7P/s7OynAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AACAgIBygICA/4CAgP+AgID/gICA/4CAgKAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7J3s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7OzsbAAAAAAAAAAAAAAAAOrq6gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAADs7OwN7OzspQAAAAAAAAAAAAAAAOzs7AHs7OzQ7Ozs/+zs7P/s7Oz/7Ozs5/Pz
|
||||||
|
8wAAAAAAAAAAAAAAAAAAAAAARkZGAICAgHaAgIDfgICA6YCAgJKAgIAJAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AADs7Ozh7Ozs/+zs7P/s7Oz/7Ozs0+rq6gMAAAAAAAAAAAAAAADs7OyY7OzsHQAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsiOzs7P/s7OxOAAAAAAAAAAAAAAAA7OzsQOzs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7OxSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAADs7OxH7Ozs/+zs7P/s7Oz/7Ozs/+zs7EIAAAAAAAAAAAAAAADs7Ow47Ozs/+zs
|
||||||
|
7J4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsI+zs7Pfs7Oz/7Ozs2uzs
|
||||||
|
7AYAAAAAAAAAAAAAAADs7Oyr7Ozs/+zs7P/s7Oz/7Ozs2Ozs7AkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwG7Ozs0Ozs7P/s7Oz/7Ozs/+zs7KsAAAAAAAAAAAAA
|
||||||
|
AADs7OwB7Ozsy+zs7P/s7Oz/7OzsMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs
|
||||||
|
7LDs7Oz/7Ozs/+zs7P/s7Ox0AAAAAAAAAAAAAAAA7OzsIOzs7Pfs7Oz/7Ozs/+zs7P/s7Oyh6OjoAQAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx8fEA7Ozsmezs7P/s7Oz/7Ozs/+zs
|
||||||
|
7PXs7OweAAAAAAAAAAAAAAAA7OzsYuzs7P/s7Oz/7Ozs/+zs7LoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAOzs7EDs7Oz/7Ozs/+zs7P/s7Oz/7Ozs8ezs7BQAAAAAAAAAAAAAAADs7OyG7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7Kjs7OwLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwJ7OzsoOzs
|
||||||
|
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
|
||||||
|
7P/s7Oz/7Ozs/+zs7Pzs7Ow/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs
|
||||||
|
7Czs7Ozj7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7PTs7OwaAAAAAAAA
|
||||||
|
AAAAAAAA7OzscOzs7P/s7Oz/7Ozs/+zs7P/s7OxMAAAAAAAAAAAAAAAA7OzsLezs7Pzs7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs8ezs7D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7Brs7OwoAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAA7OzsCOzs7HPs7Oz17Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7OzsogAAAAAAAAAAAAAAAOzs7AXs7OzZ7Ozs/+zs7P/s7Oy2AAAAAAAAAAAAAAAAAAAAAOzs
|
||||||
|
7MHs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz77Ozshezs
|
||||||
|
7A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Owj7OzsDgAAAAAAAAAAAAAAAAAAAADs7Oyn7Ozs/uzs
|
||||||
|
7Lvs7Ox47OzsVuzs7Evs7Oxn7Ozsnezs7Ozs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ow2AAAAAAAAAAAAAAAA7OzsSuzs7P/s7Oz67OzsJwAA
|
||||||
|
AAAAAAAAAAAAAOzs7Fns7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Ozz7OzsqOzs7G7s7OxW7OzsW+zs7Hjs7Oy57Ozs/ezs7IwAAAAAAAAAAAAA
|
||||||
|
AADs7Ow87Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsxubm5gAAAAAAAAAAAAAA
|
||||||
|
AADs7Oy17OzsjAAAAAAAAAAAAAAAAOzs7Ars7Ozi7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz57OzsJQAAAADs7OwD7Ozs0ezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7OxcAAAAAAAAAAAAAAAA7OzsJ+zs7A0AAAAAAAAAAAAAAADs7OyC7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7LQAAAAA7OzsbOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs5Ozs7AoAAAAAgICATYCAgLOAgIC7gICAZGRkZADs7Owi7Ozs9+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsSezs7Gvs7Ox+7OzsgOzs
|
||||||
|
7ILs7OyE7Ozsh+zs7Ins7OyL7Ozsjuzs7I/s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7OzslOzs
|
||||||
|
7JTs7OyV7Ozsluzs7Jbs7OyX7Ozsl+zs7Jjs7OyZ7Ozsmezs7Jrs7Ow7gICAVoCAgP+AgID/gICA/4CA
|
||||||
|
gP+AgICA7OzsN+zs7G3s7Oxv7Ozscezs7HTs7Ox27Ozseezs7Hvs7Ox97Ozsf+zs7IHs7OyE7Ozshuzs
|
||||||
|
7Ins7OyL7Ozsjezs7I7s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7Ozsk+zs7JTs7OyV7Ozslezs
|
||||||
|
7G4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA
|
||||||
|
gMyAgID/gICA/4CAgP+AgID/gICA8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACAgIDegICA/4CAgP+AgID/gICA/4CAgP+RkZEAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAl4CAgP+AgID/gICA/4CAgP+AgIC9AAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Oxw7Ozsm+zs
|
||||||
|
7Jrs7Oya7Ozsmezs7Jns7OyY7Ozsl+zs7Jfs7OyW7Ozsluzs7JXs7OyU7OzslOzs7JPs7OyS7Ozskuzs
|
||||||
|
7JHs7OyR7OzskOzs7I/s7OyP7Ozsjuzs7Ivs7OyJ7Ozsh+zs7IXs7OyD7OzsQoCAgAuAgICzgICA/4CA
|
||||||
|
gP+AgIDLgICAHezs7Dns7Oye7Ozsnuzs7J3s7Oyd7OzsnOzs7Jzs7Oyb7Ozsm+zs7Jrs7Oya7Ozsmezs
|
||||||
|
7Jns7OyY7OzsmOzs7Jfs7OyW7Ozsluzs7JXs7OyV7OzslOzs7JPs7OyT7Ozskuzs7JHs7OyR7OzskOzs
|
||||||
|
7JDs7Ox67OzsRezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs9ezs
|
||||||
|
7B4AAAAAAAAAAICAgBuAgIAjfX19AAAAAADs7OwI7Ozs3+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsYAAAAADs7Oy07Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7H0AAAAAAAAAAAAAAADs7OwK7OzsHwAAAAAAAAAAAAAAAOzs7Ffs7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsw+rq6gAAAAAA7OzsJ+zs7Pvs7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7N7s7OwIAAAAAAAAAAAAAAAA7Ozsg+zs7K0AAAAAAAAAAAAA
|
||||||
|
AADKysoA7Ozswezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs++zs7CwAAAAAAAAAAAAA
|
||||||
|
AADs7OyS7Ozs+Ozs7Kns7Oxn7OzsPuzs7Drs7OxY7Ozsjuzs7Ofs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OxSAAAAAAAAAAAAAAAA7OzsIOzs
|
||||||
|
7Pbs7Oz/7OzsQwAAAAAAAAAAAAAAAOzs7DDs7Oz+7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ozx7Ozspuzs7Gzs7OxT7OzsWuzs7Hjs7Oy57Ozs/ezs
|
||||||
|
7IwAAAAAAAAAAAAAAAAAAAAA7OzsEOzs7BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwF7Ozsaezs
|
||||||
|
7PPs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oy8AAAAAAAA
|
||||||
|
AAAAAAAAAAAAAOzs7K3s7Oz/7Ozs/+zs7NLs7OwCAAAAAAAAAAAAAAAA7Ozsnuzs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7Pns7OyB7OzsDgAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAOzs7CTs7OwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
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
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AADs7Owz7Ozs/+zs7P/s7Oz/7Ozs/+zs7EsAAAAAAAAAAAAAAADs7Owl7Ozs+ezs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/uzs7DEAAAAAAAAAAAAA
|
||||||
|
AADs7OxN7Ozs/+zs7P/s7Oz/7Ozs/+zs7DEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAADs7OwD7Ozsxezs7P/s7Oz/7Ozs/+zs7LUAAAAAAAAAAAAAAAAAAAAA7OzstOzs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7OzB6urqAAAAAAAAAAAAAAAAAOzs7Lrs7Oz/7Ozs/+zs7P/s7OzB7OzsAgAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+sA7Ozsluzs7P/s7Oz/7Ozs/+zs7Pjs7OwlAAAAAAAA
|
||||||
|
AAAAAAAA7OzsTOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P3s7OzT7Ozstuzs7Ljs7OzU7Ozs/uzs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7FQAAAAAAAAAAAAAAADs7Owq7Ozs/Ozs7P/s7Oz/7Ozs/+zs
|
||||||
|
7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwO7Ozspuzs7P/s7Oz/7Ozs/+zs
|
||||||
|
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
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsD+zs
|
||||||
|
7Ovs7Oz/7Ozs/+zs7P/s7Oz/7OzsfQAAAAAAAAAAAAAAAAAAAAAAAAAAgICA84CAgP+AgID/gICA/4CA
|
||||||
|
gP+AgIDjAAAAAAAAAAAAAAAAAAAAAAAAAADs7OyN7Ozs/+zs7P/s7Oz/7Ozs/+zs7Obs7OwLAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAOzs7ALs7OwI7OzsCOzs7Ajs7OwI7OzsCOzs7AQAAAAAAAAAAAAAAAAAAAAAAAAAAICA
|
||||||
|
gPaAgID/gICA/4CAgP+AgID/gICA5gAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsBOzs7Ajs7OwI7OzsCOzs
|
||||||
|
7Ajs7OwI6+vrAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACAgICagICA/4CAgP+AgID/gICA/4CAgIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICACoCAgJeAgID0gICA8ICAgI6AgIAFAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4H///////
|
||||||
|
//gf////////+A///////4D4DwH/////wPgfA7////nA/B8Dn///+OB//gcf///wcD/8Dg////BwH/wO
|
||||||
|
D///4DgP8BwH///gOAPAHAf///gcAAA4H////BwAAHgf///8DgAAcD//+D4HAADgfB/wPgcAAOB8D/Ae
|
||||||
|
A4ABwHgP8B4DgAHAeA/wHgHAA4B4D/A+AeAHAHwP/HwA4AcAPj///ABwDgA////4AHAOAB////AAOBwA
|
||||||
|
D//PwAA4PAAD88AAABw4AAADgAAAHnAAAAEAAAAOcAAAAQAAAAQgAAAAAAAAAAAAAAD////4H///////
|
||||||
|
//gf////////+B////8AAAAAAAAAAAAAAAZgAAAAgAAADnAAAAGAAAAOeAAAAcAAABw4AAADz8AAPBwA
|
||||||
|
A/P/8AA4HAAP///4AHAOAB////wAcA4AP//4fADgBwA+P/A+AeAHgHwP8B4BwAOAeA/wHgPAAcB4D/Ae
|
||||||
|
A4ABwHgP8D4HAADgfA/4fgcAAOB8H//8DgAAcD////geAAB4H///+BwAADgf///gOAPAHAf//+A4D/Ac
|
||||||
|
B///4HAf+A4P///w8D/8Dg////jgf/4HH///+cD4Hgef////wPgfA/////+A+B8B/////4D4HwH/////
|
||||||
|
//gf////////+B////8=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="openFileDialog_SRS.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>257, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="openFileDialog_LotATC.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>397, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="tim_3rdparties.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>563, 19</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="tim_MySQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>687, 19</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>26</value>
|
||||||
|
</metadata>
|
||||||
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAABAAEAQD8AAAEAIAAgQQAAFgAAACgAAABAAAAAfgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGB
|
||||||
|
gQGAgICFgICA7YCAgPaAgICfgICACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACAgIB6gICA/4CAgP+AgID/gICA/4CAgKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA14CAgP+AgID/gICA/4CAgP+AgID8hISEAgAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs
|
||||||
|
7A/s7Ozs7Ozs/+zs7P/s7Oz/7Ozs/+zs7IwAAAAAAAAAAAAAAAAAAAAAAAAAAICAgNSAgID/gICA/4CA
|
||||||
|
gP+AgID/gICA+4KCggEAAAAAAAAAAAAAAAAAAAAA7Ozse+zs7P/s7Oz/7Ozs/+zs7P/s7Ozv7OzsFAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAA7OzsZ+zs7P/s7Oz/7Ozs/+zs7P/s7OynAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AACAgIBygICA/4CAgP+AgID/gICA/4CAgKAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7J3s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7OzsbAAAAAAAAAAAAAAAAOrq6gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAADs7OwN7OzspQAAAAAAAAAAAAAAAOzs7AHs7OzQ7Ozs/+zs7P/s7Oz/7Ozs5/Pz
|
||||||
|
8wAAAAAAAAAAAAAAAAAAAAAARkZGAICAgHaAgIDfgICA6YCAgJKAgIAJAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AADs7Ozh7Ozs/+zs7P/s7Oz/7Ozs0+rq6gMAAAAAAAAAAAAAAADs7OyY7OzsHQAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsiOzs7P/s7OxOAAAAAAAAAAAAAAAA7OzsQOzs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7OxSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAADs7OxH7Ozs/+zs7P/s7Oz/7Ozs/+zs7EIAAAAAAAAAAAAAAADs7Ow47Ozs/+zs
|
||||||
|
7J4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsI+zs7Pfs7Oz/7Ozs2uzs
|
||||||
|
7AYAAAAAAAAAAAAAAADs7Oyr7Ozs/+zs7P/s7Oz/7Ozs2Ozs7AkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwG7Ozs0Ozs7P/s7Oz/7Ozs/+zs7KsAAAAAAAAAAAAA
|
||||||
|
AADs7OwB7Ozsy+zs7P/s7Oz/7OzsMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs
|
||||||
|
7LDs7Oz/7Ozs/+zs7P/s7Ox0AAAAAAAAAAAAAAAA7OzsIOzs7Pfs7Oz/7Ozs/+zs7P/s7Oyh6OjoAQAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx8fEA7Ozsmezs7P/s7Oz/7Ozs/+zs
|
||||||
|
7PXs7OweAAAAAAAAAAAAAAAA7OzsYuzs7P/s7Oz/7Ozs/+zs7LoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAOzs7EDs7Oz/7Ozs/+zs7P/s7Oz/7Ozs8ezs7BQAAAAAAAAAAAAAAADs7OyG7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7Kjs7OwLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwJ7OzsoOzs
|
||||||
|
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
|
||||||
|
7P/s7Oz/7Ozs/+zs7Pzs7Ow/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs
|
||||||
|
7Czs7Ozj7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7PTs7OwaAAAAAAAA
|
||||||
|
AAAAAAAA7OzscOzs7P/s7Oz/7Ozs/+zs7P/s7OxMAAAAAAAAAAAAAAAA7OzsLezs7Pzs7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs8ezs7D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7Brs7OwoAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAA7OzsCOzs7HPs7Oz17Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7OzsogAAAAAAAAAAAAAAAOzs7AXs7OzZ7Ozs/+zs7P/s7Oy2AAAAAAAAAAAAAAAAAAAAAOzs
|
||||||
|
7MHs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz77Ozshezs
|
||||||
|
7A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Owj7OzsDgAAAAAAAAAAAAAAAAAAAADs7Oyn7Ozs/uzs
|
||||||
|
7Lvs7Ox47OzsVuzs7Evs7Oxn7Ozsnezs7Ozs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ow2AAAAAAAAAAAAAAAA7OzsSuzs7P/s7Oz67OzsJwAA
|
||||||
|
AAAAAAAAAAAAAOzs7Fns7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Ozz7OzsqOzs7G7s7OxW7OzsW+zs7Hjs7Oy57Ozs/ezs7IwAAAAAAAAAAAAA
|
||||||
|
AADs7Ow87Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsxubm5gAAAAAAAAAAAAAA
|
||||||
|
AADs7Oy17OzsjAAAAAAAAAAAAAAAAOzs7Ars7Ozi7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz57OzsJQAAAADs7OwD7Ozs0ezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7OxcAAAAAAAAAAAAAAAA7OzsJ+zs7A0AAAAAAAAAAAAAAADs7OyC7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7LQAAAAA7OzsbOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs5Ozs7AoAAAAAgICATYCAgLOAgIC7gICAZGRkZADs7Owi7Ozs9+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsSezs7Gvs7Ox+7OzsgOzs
|
||||||
|
7ILs7OyE7Ozsh+zs7Ins7OyL7Ozsjuzs7I/s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7OzslOzs
|
||||||
|
7JTs7OyV7Ozsluzs7Jbs7OyX7Ozsl+zs7Jjs7OyZ7Ozsmezs7Jrs7Ow7gICAVoCAgP+AgID/gICA/4CA
|
||||||
|
gP+AgICA7OzsN+zs7G3s7Oxv7Ozscezs7HTs7Ox27Ozseezs7Hvs7Ox97Ozsf+zs7IHs7OyE7Ozshuzs
|
||||||
|
7Ins7OyL7Ozsjezs7I7s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7Ozsk+zs7JTs7OyV7Ozslezs
|
||||||
|
7G4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA
|
||||||
|
gMyAgID/gICA/4CAgP+AgID/gICA8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACAgIDegICA/4CAgP+AgID/gICA/4CAgP+RkZEAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAl4CAgP+AgID/gICA/4CAgP+AgIC9AAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Oxw7Ozsm+zs
|
||||||
|
7Jrs7Oya7Ozsmezs7Jns7OyY7Ozsl+zs7Jfs7OyW7Ozsluzs7JXs7OyU7OzslOzs7JPs7OyS7Ozskuzs
|
||||||
|
7JHs7OyR7OzskOzs7I/s7OyP7Ozsjuzs7Ivs7OyJ7Ozsh+zs7IXs7OyD7OzsQoCAgAuAgICzgICA/4CA
|
||||||
|
gP+AgIDLgICAHezs7Dns7Oye7Ozsnuzs7J3s7Oyd7OzsnOzs7Jzs7Oyb7Ozsm+zs7Jrs7Oya7Ozsmezs
|
||||||
|
7Jns7OyY7OzsmOzs7Jfs7OyW7Ozsluzs7JXs7OyV7OzslOzs7JPs7OyT7Ozskuzs7JHs7OyR7OzskOzs
|
||||||
|
7JDs7Ox67OzsRezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs9ezs
|
||||||
|
7B4AAAAAAAAAAICAgBuAgIAjfX19AAAAAADs7OwI7Ozs3+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsYAAAAADs7Oy07Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7H0AAAAAAAAAAAAAAADs7OwK7OzsHwAAAAAAAAAAAAAAAOzs7Ffs7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsw+rq6gAAAAAA7OzsJ+zs7Pvs7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7N7s7OwIAAAAAAAAAAAAAAAA7Ozsg+zs7K0AAAAAAAAAAAAA
|
||||||
|
AADKysoA7Ozswezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs++zs7CwAAAAAAAAAAAAA
|
||||||
|
AADs7OyS7Ozs+Ozs7Kns7Oxn7OzsPuzs7Drs7OxY7Ozsjuzs7Ofs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OxSAAAAAAAAAAAAAAAA7OzsIOzs
|
||||||
|
7Pbs7Oz/7OzsQwAAAAAAAAAAAAAAAOzs7DDs7Oz+7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ozx7Ozspuzs7Gzs7OxT7OzsWuzs7Hjs7Oy57Ozs/ezs
|
||||||
|
7IwAAAAAAAAAAAAAAAAAAAAA7OzsEOzs7BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwF7Ozsaezs
|
||||||
|
7PPs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oy8AAAAAAAA
|
||||||
|
AAAAAAAAAAAAAOzs7K3s7Oz/7Ozs/+zs7NLs7OwCAAAAAAAAAAAAAAAA7Ozsnuzs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7Pns7OyB7OzsDgAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAOzs7CTs7OwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
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
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AADs7Owz7Ozs/+zs7P/s7Oz/7Ozs/+zs7EsAAAAAAAAAAAAAAADs7Owl7Ozs+ezs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/uzs7DEAAAAAAAAAAAAA
|
||||||
|
AADs7OxN7Ozs/+zs7P/s7Oz/7Ozs/+zs7DEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAADs7OwD7Ozsxezs7P/s7Oz/7Ozs/+zs7LUAAAAAAAAAAAAAAAAAAAAA7OzstOzs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
|
||||||
|
7P/s7OzB6urqAAAAAAAAAAAAAAAAAOzs7Lrs7Oz/7Ozs/+zs7P/s7OzB7OzsAgAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+sA7Ozsluzs7P/s7Oz/7Ozs/+zs7Pjs7OwlAAAAAAAA
|
||||||
|
AAAAAAAA7OzsTOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P3s7OzT7Ozstuzs7Ljs7OzU7Ozs/uzs
|
||||||
|
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7FQAAAAAAAAAAAAAAADs7Owq7Ozs/Ozs7P/s7Oz/7Ozs/+zs
|
||||||
|
7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwO7Ozspuzs7P/s7Oz/7Ozs/+zs
|
||||||
|
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
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsD+zs
|
||||||
|
7Ovs7Oz/7Ozs/+zs7P/s7Oz/7OzsfQAAAAAAAAAAAAAAAAAAAAAAAAAAgICA84CAgP+AgID/gICA/4CA
|
||||||
|
gP+AgIDjAAAAAAAAAAAAAAAAAAAAAAAAAADs7OyN7Ozs/+zs7P/s7Oz/7Ozs/+zs7Obs7OwLAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAOzs7ALs7OwI7OzsCOzs7Ajs7OwI7OzsCOzs7AQAAAAAAAAAAAAAAAAAAAAAAAAAAICA
|
||||||
|
gPaAgID/gICA/4CAgP+AgID/gICA5gAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsBOzs7Ajs7OwI7OzsCOzs
|
||||||
|
7Ajs7OwI6+vrAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACAgICagICA/4CAgP+AgID/gICA/4CAgIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICACoCAgJeAgID0gICA8ICAgI6AgIAFAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4H///////
|
||||||
|
//gf////////+A///////4D4DwH/////wPgfA7////nA/B8Dn///+OB//gcf///wcD/8Dg////BwH/wO
|
||||||
|
D///4DgP8BwH///gOAPAHAf///gcAAA4H////BwAAHgf///8DgAAcD//+D4HAADgfB/wPgcAAOB8D/Ae
|
||||||
|
A4ABwHgP8B4DgAHAeA/wHgHAA4B4D/A+AeAHAHwP/HwA4AcAPj///ABwDgA////4AHAOAB////AAOBwA
|
||||||
|
D//PwAA4PAAD88AAABw4AAADgAAAHnAAAAEAAAAOcAAAAQAAAAQgAAAAAAAAAAAAAAD////4H///////
|
||||||
|
//gf////////+B////8AAAAAAAAAAAAAAAZgAAAAgAAADnAAAAGAAAAOeAAAAcAAABw4AAADz8AAPBwA
|
||||||
|
A/P/8AA4HAAP///4AHAOAB////wAcA4AP//4fADgBwA+P/A+AeAHgHwP8B4BwAOAeA/wHgPAAcB4D/Ae
|
||||||
|
A4ABwHgP8D4HAADgfA/4fgcAAOB8H//8DgAAcD////geAAB4H///+BwAADgf///gOAPAHAf//+A4D/Ac
|
||||||
|
B///4HAf+A4P///w8D/8Dg////jgf/4HH///+cD4Hgef////wPgfA/////+A+B8B/////4D4HwH/////
|
||||||
|
//gf////////+B////8=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
BIN
02_Windows_App/Perun_v1/03_Resources/perun_logo.ico
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
02_Windows_App/Perun_v1/03_Resources/perun_logo.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
02_Windows_App/Perun_v1/03_Resources/status-connected-error.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
02_Windows_App/Perun_v1/03_Resources/status-connected.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
BIN
02_Windows_App/Perun_v1/03_Resources/status-disconnected.png
Normal file
|
After Width: | Height: | Size: 909 B |
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<configuration>
|
|
||||||
<startup>
|
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
|
|
||||||
</startup>
|
|
||||||
</configuration>
|
|
||||||
@@ -7,11 +7,38 @@
|
|||||||
<ProjectGuid>{5A710507-92E9-4664-9B91-918B8B82F107}</ProjectGuid>
|
<ProjectGuid>{5A710507-92E9-4664-9B91-918B8B82F107}</ProjectGuid>
|
||||||
<OutputType>WinExe</OutputType>
|
<OutputType>WinExe</OutputType>
|
||||||
<RootNamespace>Perun_v1</RootNamespace>
|
<RootNamespace>Perun_v1</RootNamespace>
|
||||||
<AssemblyName>Perun_v1</AssemblyName>
|
<AssemblyName>Perun</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
<Deterministic>true</Deterministic>
|
<Deterministic>true</Deterministic>
|
||||||
|
<IsWebBootstrapper>true</IsWebBootstrapper>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
<PublishUrl>ftp://s18.mydevil.net/perun/</PublishUrl>
|
||||||
|
<Install>true</Install>
|
||||||
|
<InstallFrom>Web</InstallFrom>
|
||||||
|
<UpdateEnabled>true</UpdateEnabled>
|
||||||
|
<UpdateMode>Foreground</UpdateMode>
|
||||||
|
<UpdateInterval>7</UpdateInterval>
|
||||||
|
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||||
|
<UpdatePeriodically>false</UpdatePeriodically>
|
||||||
|
<UpdateRequired>false</UpdateRequired>
|
||||||
|
<MapFileExtensions>true</MapFileExtensions>
|
||||||
|
<InstallUrl>http://share.porwolik.com/ftp/perun/</InstallUrl>
|
||||||
|
<SupportUrl>https://github.com/szporwolik/perun</SupportUrl>
|
||||||
|
<ErrorReportUrl>https://github.com/szporwolik/perun</ErrorReportUrl>
|
||||||
|
<TargetCulture>en</TargetCulture>
|
||||||
|
<ProductName>Perun for DCS World</ProductName>
|
||||||
|
<PublisherName>szporwolik</PublisherName>
|
||||||
|
<SuiteName>Perun</SuiteName>
|
||||||
|
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
|
||||||
|
<WebPage>Perun.htm</WebPage>
|
||||||
|
<ApplicationRevision>0</ApplicationRevision>
|
||||||
|
<ApplicationVersion>0.9.0.%2a</ApplicationVersion>
|
||||||
|
<UseApplicationTrust>false</UseApplicationTrust>
|
||||||
|
<CreateDesktopShortcut>true</CreateDesktopShortcut>
|
||||||
|
<PublishWizardCompleted>true</PublishWizardCompleted>
|
||||||
|
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
@@ -22,6 +49,7 @@
|
|||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<CodeAnalysisRuleSet>SecurityRules.ruleset</CodeAnalysisRuleSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
@@ -31,10 +59,60 @@
|
|||||||
<DefineConstants>TRACE</DefineConstants>
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<DocumentationFile>
|
||||||
|
</DocumentationFile>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ApplicationIcon>03_Resources\perun_logo.ico</ApplicationIcon>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ManifestCertificateThumbprint>2ACE4C8C2C325A04CA5986B1CD76744B4B03755D</ManifestCertificateThumbprint>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ManifestKeyFile>
|
||||||
|
</ManifestKeyFile>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<GenerateManifests>true</GenerateManifests>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SignManifests>false</SignManifests>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SignAssembly>false</SignAssembly>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetZone>LocalIntranet</TargetZone>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup />
|
||||||
|
<PropertyGroup>
|
||||||
|
<ApplicationManifest>Properties\app.manifest</ApplicationManifest>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="BouncyCastle.Crypto, Version=1.8.3.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
|
||||||
|
<HintPath>..\packages\BouncyCastle.1.8.3.1\lib\BouncyCastle.Crypto.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Google.Protobuf, Version=3.6.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Google.Protobuf.3.6.1\lib\net45\Google.Protobuf.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="MySql.Data, Version=8.0.17.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\MySql.Data.8.0.17\lib\net452\MySql.Data.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Renci.SshNet, Version=2016.1.0.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\SSH.NET.2016.1.0\lib\net40\Renci.SshNet.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.ComponentModel" />
|
||||||
|
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||||
|
<Reference Include="System.Configuration" />
|
||||||
|
<Reference Include="System.Configuration.Install" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Drawing.Design" />
|
||||||
|
<Reference Include="System.Management" />
|
||||||
|
<Reference Include="System.Transactions" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
@@ -46,30 +124,44 @@
|
|||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="form_Main.cs">
|
<Compile Include="01_Classes\LogController.cs" />
|
||||||
|
<Compile Include="01_Classes\TCPController.cs" />
|
||||||
|
<Compile Include="01_Classes\Globals.cs" />
|
||||||
|
<Compile Include="01_Classes\DatabaseController.cs" />
|
||||||
|
<Compile Include="01_Classes\PerunHelper.cs" />
|
||||||
|
<Compile Include="02_Forms\form_Main.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="form_Main.Designer.cs">
|
<Compile Include="02_Forms\form_Main.Designer.cs">
|
||||||
<DependentUpon>form_Main.cs</DependentUpon>
|
<DependentUpon>form_Main.cs</DependentUpon>
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="01_Classes\Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<EmbeddedResource Include="form_Main.resx">
|
<EmbeddedResource Include="02_Forms\form_Main.resx">
|
||||||
<DependentUpon>form_Main.cs</DependentUpon>
|
<DependentUpon>form_Main.cs</DependentUpon>
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Properties\Resources.resx">
|
<EmbeddedResource Include="Properties\Resources.resx">
|
||||||
<Generator>ResXFileCodeGenerator</Generator>
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<Compile Include="Properties\Resources.Designer.cs">
|
<None Include="00_Config\packages.config" />
|
||||||
<AutoGen>True</AutoGen>
|
<None Include="00_Config\Perun_v1_TemporaryKey.pfx" />
|
||||||
<DependentUpon>Resources.resx</DependentUpon>
|
<None Include="app.config" />
|
||||||
</Compile>
|
<None Include="packages.config" />
|
||||||
|
<None Include="Properties\app.manifest" />
|
||||||
<None Include="Properties\Settings.settings">
|
<None Include="Properties\Settings.settings">
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||||
</None>
|
</None>
|
||||||
|
<Compile Include="Properties\Resources.Designer.cs">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Properties\Settings.Designer.cs">
|
<Compile Include="Properties\Settings.Designer.cs">
|
||||||
<AutoGen>True</AutoGen>
|
<AutoGen>True</AutoGen>
|
||||||
<DependentUpon>Settings.settings</DependentUpon>
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
@@ -77,7 +169,29 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="App.config" />
|
<None Include="00_Config\App.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>Microsoft .NET Framework 4.6.1 %28x86 and x64%29</ProductName>
|
||||||
|
<Install>true</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||||
|
<Install>false</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="03_Resources\perun_logo.ico" />
|
||||||
|
<None Include="03_Resources\perun_logo.png" />
|
||||||
|
<None Include="Resources\perun_logo.png" />
|
||||||
|
<None Include="Resources\status-connected-error.png" />
|
||||||
|
<None Include="Resources\status-disconnected-error.png" />
|
||||||
|
<None Include="Resources\status-disconnected.png" />
|
||||||
|
<None Include="Resources\status-connected.png" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup />
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
</Project>
|
</Project>
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace Perun_v1
|
|
||||||
{
|
|
||||||
static class Program
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Główny punkt wejścia dla aplikacji.
|
|
||||||
/// </summary>
|
|
||||||
[STAThread]
|
|
||||||
static void Main()
|
|
||||||
{
|
|
||||||
Application.EnableVisualStyles();
|
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
|
||||||
Application.Run(new form_Main());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,16 @@
|
|||||||
using System.Reflection;
|
using System.Resources;
|
||||||
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
// Ogólne informacje o zestawie są kontrolowane poprzez następujący
|
// Ogólne informacje o zestawie są kontrolowane poprzez następujący
|
||||||
// zestaw atrybutów. Zmień wartości tych atrybutów, aby zmodyfikować informacje
|
// zestaw atrybutów. Zmień wartości tych atrybutów, aby zmodyfikować informacje
|
||||||
// powiązane z zestawem.
|
// powiązane z zestawem.
|
||||||
[assembly: AssemblyTitle("Perun_v1")]
|
[assembly: AssemblyTitle("Perun for DCS World")]
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("https://github.com/szporwolik/perun")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("Szymon Porwolik")]
|
||||||
[assembly: AssemblyProduct("Perun_v1")]
|
[assembly: AssemblyProduct("Perun for DCS World")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2019")]
|
[assembly: AssemblyCopyright("Copyright © 2019")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
@@ -32,5 +33,7 @@ using System.Runtime.InteropServices;
|
|||||||
// Możesz określić wszystkie wartości lub użyć domyślnych numerów kompilacji i poprawki
|
// Możesz określić wszystkie wartości lub użyć domyślnych numerów kompilacji i poprawki
|
||||||
// przy użyciu symbolu „*”, tak jak pokazano poniżej:
|
// przy użyciu symbolu „*”, tak jak pokazano poniżej:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
[assembly: AssemblyVersion("0.9.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
[assembly: AssemblyFileVersion("0.9.0.0")]
|
||||||
|
[assembly: NeutralResourcesLanguage("en")]
|
||||||
|
|
||||||
|
|||||||
118
02_Windows_App/Perun_v1/Properties/Resources.Designer.cs
generated
@@ -1,71 +1,113 @@
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// <auto-generated>
|
// <auto-generated>
|
||||||
// Ten kod został wygenerowany przez narzędzie.
|
// This code was generated by a tool.
|
||||||
// Wersja środowiska uruchomieniowego: 4.0.30319.42000
|
// Runtime Version:4.0.30319.42000
|
||||||
//
|
//
|
||||||
// Modyfikacje tego pliku mogą spowodować niewłaściwe zachowanie i zostaną utracone
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
// w przypadku ponownego wygenerowania kodu.
|
// the code is regenerated.
|
||||||
// </auto-generated>
|
// </auto-generated>
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
namespace Perun_v1.Properties
|
namespace Perun_v1.Properties {
|
||||||
{
|
using System;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Silnie typizowana klasa zasobów do wyszukiwania zlokalizowanych ciągów itd.
|
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
// Ta klasa została automatycznie wygenerowana za pomocą klasy StronglyTypedResourceBuilder
|
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||||
// przez narzędzie, takie jak ResGen lub Visual Studio.
|
// class via a tool like ResGen or Visual Studio.
|
||||||
// Aby dodać lub usunąć składowe, edytuj plik ResX, a następnie ponownie uruchom narzędzie ResGen
|
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||||
// z opcją /str lub ponownie skompiluj projekt programu VS.
|
// with the /str option, or rebuild your VS project.
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
internal class Resources
|
internal class Resources {
|
||||||
{
|
|
||||||
|
|
||||||
private static global::System.Resources.ResourceManager resourceMan;
|
private static global::System.Resources.ResourceManager resourceMan;
|
||||||
|
|
||||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||||
|
|
||||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||||
internal Resources()
|
internal Resources() {
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Zwraca buforowane wystąpienie składnika ResourceManager używane przez tę klasę.
|
/// Returns the cached ResourceManager instance used by this class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
internal static global::System.Resources.ResourceManager ResourceManager
|
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||||
{
|
get {
|
||||||
get
|
if (object.ReferenceEquals(resourceMan, null)) {
|
||||||
{
|
|
||||||
if ((resourceMan == null))
|
|
||||||
{
|
|
||||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Perun_v1.Properties.Resources", typeof(Resources).Assembly);
|
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Perun_v1.Properties.Resources", typeof(Resources).Assembly);
|
||||||
resourceMan = temp;
|
resourceMan = temp;
|
||||||
}
|
}
|
||||||
return resourceMan;
|
return resourceMan;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Przesłania właściwość CurrentUICulture bieżącego wątku dla wszystkich
|
/// Overrides the current thread's CurrentUICulture property for all
|
||||||
/// przypadków przeszukiwania zasobów za pomocą tej silnie typizowanej klasy zasobów.
|
/// resource lookups using this strongly typed resource class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
internal static global::System.Globalization.CultureInfo Culture
|
internal static global::System.Globalization.CultureInfo Culture {
|
||||||
{
|
get {
|
||||||
get
|
|
||||||
{
|
|
||||||
return resourceCulture;
|
return resourceCulture;
|
||||||
}
|
}
|
||||||
set
|
set {
|
||||||
{
|
|
||||||
resourceCulture = value;
|
resourceCulture = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap perun_logo {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("perun_logo", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap status_connected {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("status_connected", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap status_connected_error {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("status_connected_error", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap status_disconnected {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("status_disconnected", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap status_disconnected_error {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("status_disconnected_error", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
value : The object must be serialized with
|
value : The object must be serialized with
|
||||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
: and then encoded with base64 encoding.
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
@@ -60,6 +60,7 @@
|
|||||||
: and then encoded with base64 encoding.
|
: and then encoded with base64 encoding.
|
||||||
-->
|
-->
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
<xsd:complexType>
|
<xsd:complexType>
|
||||||
<xsd:choice maxOccurs="unbounded">
|
<xsd:choice maxOccurs="unbounded">
|
||||||
@@ -68,9 +69,10 @@
|
|||||||
<xsd:sequence>
|
<xsd:sequence>
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
</xsd:sequence>
|
</xsd:sequence>
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
</xsd:complexType>
|
</xsd:complexType>
|
||||||
</xsd:element>
|
</xsd:element>
|
||||||
<xsd:element name="assembly">
|
<xsd:element name="assembly">
|
||||||
@@ -85,9 +87,10 @@
|
|||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
</xsd:sequence>
|
</xsd:sequence>
|
||||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
</xsd:complexType>
|
</xsd:complexType>
|
||||||
</xsd:element>
|
</xsd:element>
|
||||||
<xsd:element name="resheader">
|
<xsd:element name="resheader">
|
||||||
@@ -109,9 +112,25 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
|
<data name="perun_logo" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\03_Resources\perun_logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="status_connected" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\03_Resources\status-connected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="status_connected_error" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\03_Resources\status-connected-error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="status_disconnected" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\03_Resources\status-disconnected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="status_disconnected_error" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\03_Resources\status-disconnected-error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
154
02_Windows_App/Perun_v1/Properties/Settings.Designer.cs
generated
@@ -8,23 +8,151 @@
|
|||||||
// </auto-generated>
|
// </auto-generated>
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
namespace Perun_v1.Properties
|
namespace Perun_v1.Properties {
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.2.0.0")]
|
||||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||||
{
|
|
||||||
|
|
||||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||||
|
|
||||||
public static Settings Default
|
public static Settings Default {
|
||||||
{
|
get {
|
||||||
get
|
|
||||||
{
|
|
||||||
return defaultInstance;
|
return defaultInstance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||||
|
public string MYSQL_Server {
|
||||||
|
get {
|
||||||
|
return ((string)(this["MYSQL_Server"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["MYSQL_Server"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||||
|
public string MYSQL_User {
|
||||||
|
get {
|
||||||
|
return ((string)(this["MYSQL_User"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["MYSQL_User"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||||
|
public string MYSQL_Password {
|
||||||
|
get {
|
||||||
|
return ((string)(this["MYSQL_Password"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["MYSQL_Password"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||||
|
public string MYSQL_DB {
|
||||||
|
get {
|
||||||
|
return ((string)(this["MYSQL_DB"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["MYSQL_DB"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||||
|
public string OTHER_LOTATC_FILE {
|
||||||
|
get {
|
||||||
|
return ((string)(this["OTHER_LOTATC_FILE"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["OTHER_LOTATC_FILE"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||||
|
public string OTHER_SRS_FILE {
|
||||||
|
get {
|
||||||
|
return ((string)(this["OTHER_SRS_FILE"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["OTHER_SRS_FILE"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||||
|
public bool OTHER_LOTATC_USE {
|
||||||
|
get {
|
||||||
|
return ((bool)(this["OTHER_LOTATC_USE"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["OTHER_LOTATC_USE"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||||
|
public bool OTHER_SRS_USE {
|
||||||
|
get {
|
||||||
|
return ((bool)(this["OTHER_SRS_USE"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["OTHER_SRS_USE"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("3306")]
|
||||||
|
public string MYSQL_Port {
|
||||||
|
get {
|
||||||
|
return ((string)(this["MYSQL_Port"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["MYSQL_Port"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("48620")]
|
||||||
|
public int DCS_Server_Port {
|
||||||
|
get {
|
||||||
|
return ((int)(this["DCS_Server_Port"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["DCS_Server_Port"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("1")]
|
||||||
|
public int DCS_Instance {
|
||||||
|
get {
|
||||||
|
return ((int)(this["DCS_Instance"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["DCS_Instance"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,39 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Perun_v1.Properties" GeneratedClassName="Settings">
|
||||||
<Profiles>
|
<Profiles />
|
||||||
<Profile Name="(Default)" />
|
<Settings>
|
||||||
</Profiles>
|
<Setting Name="MYSQL_Server" Type="System.String" Scope="User">
|
||||||
<Settings />
|
<Value Profile="(Default)" />
|
||||||
</SettingsFile>
|
</Setting>
|
||||||
|
<Setting Name="MYSQL_User" Type="System.String" Scope="User">
|
||||||
|
<Value Profile="(Default)" />
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="MYSQL_Password" Type="System.String" Scope="User">
|
||||||
|
<Value Profile="(Default)" />
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="MYSQL_DB" Type="System.String" Scope="User">
|
||||||
|
<Value Profile="(Default)" />
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="OTHER_LOTATC_FILE" Type="System.String" Scope="User">
|
||||||
|
<Value Profile="(Default)" />
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="OTHER_SRS_FILE" Type="System.String" Scope="User">
|
||||||
|
<Value Profile="(Default)" />
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="OTHER_LOTATC_USE" Type="System.Boolean" Scope="User">
|
||||||
|
<Value Profile="(Default)">False</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="OTHER_SRS_USE" Type="System.Boolean" Scope="User">
|
||||||
|
<Value Profile="(Default)">False</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="MYSQL_Port" Type="System.String" Scope="User">
|
||||||
|
<Value Profile="(Default)">3306</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="DCS_Server_Port" Type="System.Int32" Scope="User">
|
||||||
|
<Value Profile="(Default)">48620</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="DCS_Instance" Type="System.Int32" Scope="User">
|
||||||
|
<Value Profile="(Default)">1</Value>
|
||||||
|
</Setting>
|
||||||
|
</Settings>
|
||||||
|
</SettingsFile>
|
||||||
70
02_Windows_App/Perun_v1/Properties/app.manifest
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<!-- Opcje manifestu Kontroli konta użytkownika
|
||||||
|
Jeśli chcesz zmienić poziom Kontroli konta użytkownika systemu Windows, zastąp
|
||||||
|
węzeł requestedExecutionLevel jednym z następujących.
|
||||||
|
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
||||||
|
|
||||||
|
Określenie elementu requestedExecutionLevel spowoduje wyłączenie wirtualizacji plików i rejestru.
|
||||||
|
Usuń ten element, jeśli aplikacja wymaga wirtualizacji w celu zachowania
|
||||||
|
zgodności z poprzednimi wersjami.
|
||||||
|
-->
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
</requestedPrivileges>
|
||||||
|
<applicationRequestMinimum>
|
||||||
|
<defaultAssemblyRequest permissionSetReference="Custom" />
|
||||||
|
<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
|
||||||
|
</applicationRequestMinimum>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- Lista wersji systemu Windows, na których ta aplikacja została przetestowana
|
||||||
|
i dla których została zaprojektowana. Odkomentuj odpowiednie elementy, a system Windows
|
||||||
|
automatycznie wybierze najbardziej zgodne środowisko. -->
|
||||||
|
<!-- Windows Vista -->
|
||||||
|
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
|
||||||
|
<!-- Windows 7 -->
|
||||||
|
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
|
||||||
|
<!-- Windows 8 -->
|
||||||
|
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
|
||||||
|
<!-- Windows 8.1 -->
|
||||||
|
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
|
||||||
|
<!-- Windows 10 -->
|
||||||
|
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
<!-- Wskazuje, że aplikacja rozpoznaje wartości DPI i nie będzie automatycznie skalowana przez system Windows przy dużych
|
||||||
|
wartościach DPI. Aplikacje korzystające z technologii Windows Presentation Foundation (WPF) automatycznie rozpoznają wartości DPI i nie potrzebują
|
||||||
|
tej opcji. Aplikacje korzystające z technologii Windows Forms przeznaczone dla platformy .NET Framework 4.6, które korzystają z tej opcji, powinny
|
||||||
|
ustawić także wartość „true” dla parametru „EnableWindowsFormsHighDpiAutoResizing” w pliku app.config. -->
|
||||||
|
<!--
|
||||||
|
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<windowsSettings>
|
||||||
|
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
|
||||||
|
</windowsSettings>
|
||||||
|
</application>
|
||||||
|
-->
|
||||||
|
<!-- Włącz motywy dla typowych formantów systemu Windows i okien dialogowych (system Windows XP i nowsze) -->
|
||||||
|
<!--
|
||||||
|
<dependency>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity
|
||||||
|
type="win32"
|
||||||
|
name="Microsoft.Windows.Common-Controls"
|
||||||
|
version="6.0.0.0"
|
||||||
|
processorArchitecture="*"
|
||||||
|
publicKeyToken="6595b64144ccf1df"
|
||||||
|
language="*"
|
||||||
|
/>
|
||||||
|
</dependentAssembly>
|
||||||
|
</dependency>
|
||||||
|
-->
|
||||||
|
</assembly>
|
||||||
BIN
02_Windows_App/Perun_v1/Resources/perun_logo.png
Normal file
|
After Width: | Height: | Size: 233 B |
45
02_Windows_App/Perun_v1/app.config
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<configSections>
|
||||||
|
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<section name="Perun_v1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
|
||||||
|
</sectionGroup>
|
||||||
|
</configSections>
|
||||||
|
<userSettings>
|
||||||
|
<Perun_v1.Properties.Settings>
|
||||||
|
<setting name="MYSQL_Server" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_User" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_Password" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_DB" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_LOTATC_FILE" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_SRS_FILE" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_LOTATC_USE" serializeAs="String">
|
||||||
|
<value>False</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="OTHER_SRS_USE" serializeAs="String">
|
||||||
|
<value>False</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="MYSQL_Port" serializeAs="String">
|
||||||
|
<value>3306</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="DCS_Server_Port" serializeAs="String">
|
||||||
|
<value>48620</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="DCS_Instance" serializeAs="String">
|
||||||
|
<value>1</value>
|
||||||
|
</setting>
|
||||||
|
</Perun_v1.Properties.Settings>
|
||||||
|
</userSettings>
|
||||||
|
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>
|
||||||
73
02_Windows_App/Perun_v1/form_Main.Designer.cs
generated
@@ -1,73 +0,0 @@
|
|||||||
namespace Perun_v1
|
|
||||||
{
|
|
||||||
partial class form_Main
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Wymagana zmienna projektanta.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Wyczyść wszystkie używane zasoby.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">prawda, jeżeli zarządzane zasoby powinny zostać zlikwidowane; Fałsz w przeciwnym wypadku.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Kod generowany przez Projektanta formularzy systemu Windows
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Metoda wymagana do obsługi projektanta — nie należy modyfikować
|
|
||||||
/// jej zawartości w edytorze kodu.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
this.con_List_Received = new System.Windows.Forms.ListBox();
|
|
||||||
this.con_Button_DEBUG = new System.Windows.Forms.Button();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// con_List_Received
|
|
||||||
//
|
|
||||||
this.con_List_Received.FormattingEnabled = true;
|
|
||||||
this.con_List_Received.Location = new System.Drawing.Point(12, 12);
|
|
||||||
this.con_List_Received.Name = "con_List_Received";
|
|
||||||
this.con_List_Received.Size = new System.Drawing.Size(594, 550);
|
|
||||||
this.con_List_Received.TabIndex = 0;
|
|
||||||
//
|
|
||||||
// con_Button_DEBUG
|
|
||||||
//
|
|
||||||
this.con_Button_DEBUG.Location = new System.Drawing.Point(612, 21);
|
|
||||||
this.con_Button_DEBUG.Name = "con_Button_DEBUG";
|
|
||||||
this.con_Button_DEBUG.Size = new System.Drawing.Size(80, 48);
|
|
||||||
this.con_Button_DEBUG.TabIndex = 1;
|
|
||||||
this.con_Button_DEBUG.Text = "Debug";
|
|
||||||
this.con_Button_DEBUG.UseVisualStyleBackColor = true;
|
|
||||||
this.con_Button_DEBUG.Click += new System.EventHandler(this.con_Button_DEBUG_Click);
|
|
||||||
//
|
|
||||||
// form_Main
|
|
||||||
//
|
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.ClientSize = new System.Drawing.Size(738, 567);
|
|
||||||
this.Controls.Add(this.con_Button_DEBUG);
|
|
||||||
this.Controls.Add(this.con_List_Received);
|
|
||||||
this.Name = "form_Main";
|
|
||||||
this.Text = "Perun for DCS World";
|
|
||||||
this.Load += new System.EventHandler(this.form_Main_Load);
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.ListBox con_List_Received;
|
|
||||||
private System.Windows.Forms.Button con_Button_DEBUG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Data;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace Perun_v1
|
|
||||||
{
|
|
||||||
public partial class form_Main : Form
|
|
||||||
{
|
|
||||||
public form_Main()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void con_Button_DEBUG_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
con_List_Received.Items.Add("test");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void form_Main_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
</root>
|
|
||||||
8
02_Windows_App/Perun_v1/packages.config
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="BouncyCastle" version="1.8.3.1" targetFramework="net48" />
|
||||||
|
<package id="Google.Protobuf" version="3.6.1" targetFramework="net48" />
|
||||||
|
<package id="MySql.Data" version="8.0.17" targetFramework="net48" />
|
||||||
|
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net48" />
|
||||||
|
<package id="SSH.NET" version="2016.1.0" targetFramework="net48" />
|
||||||
|
</packages>
|
||||||
187
03_MySQL/m1081_perun.sql
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||||
|
SET AUTOCOMMIT = 0;
|
||||||
|
START TRANSACTION;
|
||||||
|
SET time_zone = "+00:00";
|
||||||
|
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||||
|
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||||
|
/*!40101 SET NAMES utf8mb4 */;
|
||||||
|
|
||||||
|
CREATE DATABASE IF NOT EXISTS `m1081_perun` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
USE `m1081_perun`;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `pe_Config`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `pe_Config` (
|
||||||
|
`pe_Config_id` int(11) NOT NULL,
|
||||||
|
`pe_Config_payload` varchar(255) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`pe_Config_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
INSERT INTO `pe_Config` (`pe_Config_id`, `pe_Config_payload`) VALUES
|
||||||
|
(1, 'v0.9.0');
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `pe_DataMissionHashes`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `pe_DataMissionHashes` (
|
||||||
|
`pe_DataMissionHashes_id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||||
|
`pe_DataMissionHashes_instance` smallint(5) UNSIGNED NOT NULL,
|
||||||
|
`pe_DataMissionHashes_hash` varchar(150) NOT NULL,
|
||||||
|
`pe_DataMissionHashes_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (`pe_DataMissionHashes_id`),
|
||||||
|
UNIQUE KEY `UNIQUE_hash` (`pe_DataMissionHashes_hash`),
|
||||||
|
KEY `pe_DataMissionHashes_instance` (`pe_DataMissionHashes_instance`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=7215 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `pe_DataPlayers`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `pe_DataPlayers` (
|
||||||
|
`pe_DataPlayers_id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||||
|
`pe_DataPlayers_ucid` varchar(150) NOT NULL,
|
||||||
|
`pe_DataPlayers_lastname` varchar(150) NOT NULL,
|
||||||
|
`pe_DataPlayers_lastip` varchar(100) NOT NULL,
|
||||||
|
`pe_DataPlayers_updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (`pe_DataPlayers_id`),
|
||||||
|
UNIQUE KEY `UNIQUE_UCID` (`pe_DataPlayers_ucid`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=226 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `pe_DataRaw`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `pe_DataRaw` (
|
||||||
|
`pe_dataraw_type` tinyint(4) NOT NULL,
|
||||||
|
`pe_dataraw_instance` smallint(5) UNSIGNED NOT NULL,
|
||||||
|
`pe_dataraw_payload` text NOT NULL,
|
||||||
|
`pe_dataraw_updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (`pe_dataraw_type`,`pe_dataraw_instance`),
|
||||||
|
KEY `pe_dataraw_type_pe_dataraw_instance` (`pe_dataraw_type`,`pe_dataraw_instance`),
|
||||||
|
KEY `pe_dataraw_updated` (`pe_dataraw_updated`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `pe_DataTypes`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `pe_DataTypes` (
|
||||||
|
`pe_DataTypes_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`pe_DataTypes_name` varchar(100) NOT NULL,
|
||||||
|
`pe_DataTypes_update` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (`pe_DataTypes_id`),
|
||||||
|
UNIQUE KEY `UNIQUE_TYPE_NAME` (`pe_DataTypes_name`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `pe_LogChat`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `pe_LogChat` (
|
||||||
|
`pe_LogChat_id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||||
|
`pe_LogChat_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`pe_LogChat_missionhash_id` bigint(20) DEFAULT NULL,
|
||||||
|
`pe_LogChat_playerid` varchar(100) NOT NULL,
|
||||||
|
`pe_LogChat_msg` text NOT NULL,
|
||||||
|
`pe_LogChat_all` varchar(10) NOT NULL,
|
||||||
|
PRIMARY KEY (`pe_LogChat_id`),
|
||||||
|
KEY `pe_LogChat_missionhash_id` (`pe_LogChat_missionhash_id`),
|
||||||
|
KEY `pe_LogChat_playerid` (`pe_LogChat_playerid`),
|
||||||
|
KEY `pe_LogChat_datetime` (`pe_LogChat_datetime`),
|
||||||
|
KEY `pe_LogChat_all` (`pe_LogChat_all`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=22686 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `pe_LogEvent`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `pe_LogEvent` (
|
||||||
|
`pe_LogEvent_id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||||
|
`pe_LogEvent_datetime` datetime DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`pe_LogEvent_missionhash_id` bigint(20) DEFAULT NULL,
|
||||||
|
`pe_LogEvent_type` varchar(100) NOT NULL,
|
||||||
|
`pe_LogEvent_content` text NOT NULL,
|
||||||
|
`pe_LogEvent_arg1` varchar(150) DEFAULT NULL,
|
||||||
|
`pe_LogEvent_arg2` varchar(150) DEFAULT NULL,
|
||||||
|
`pe_LogEvent_argPlayers` varchar(150) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`pe_LogEvent_id`),
|
||||||
|
KEY `pe_LogEvent_missionhash_id` (`pe_LogEvent_missionhash_id`),
|
||||||
|
KEY `pe_LogEvent_datetime` (`pe_LogEvent_datetime`),
|
||||||
|
KEY `pe_LogEvent_type_2` (`pe_LogEvent_type`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=99807 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `pe_LogLogins`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `pe_LogLogins` (
|
||||||
|
`pe_LogLogins_id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||||
|
`pe_LogLogins_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`pe_LogLogins_instance` smallint(5) UNSIGNED NOT NULL,
|
||||||
|
`pe_LogLogins_playerid` bigint(20) DEFAULT NULL,
|
||||||
|
`pe_LogLogins_name` varchar(150) NOT NULL,
|
||||||
|
`pe_LogLogins_ip` varchar(100) NOT NULL,
|
||||||
|
PRIMARY KEY (`pe_LogLogins_id`),
|
||||||
|
KEY `pe_LogLogins_playerid` (`pe_LogLogins_playerid`),
|
||||||
|
KEY `pe_LogLogins_datetime` (`pe_LogLogins_datetime`),
|
||||||
|
KEY `pe_LogLogins_instance` (`pe_LogLogins_instance`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=11344 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `pe_LogStats`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `pe_LogStats` (
|
||||||
|
`pe_LogStats_id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||||
|
`pe_LogStats_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`pe_LogStats_missionhash_id` bigint(20) DEFAULT NULL,
|
||||||
|
`pe_LogStats_playerid` bigint(20) DEFAULT NULL,
|
||||||
|
`pe_LogStats_typeid` int(11) DEFAULT NULL,
|
||||||
|
`pe_LogStats_masterslot` int(11) DEFAULT NULL,
|
||||||
|
`pe_LogStats_seat` int(10) UNSIGNED DEFAULT NULL,
|
||||||
|
`ps_kills` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_pvp` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_deaths` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_ejections` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_crashes` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_teamkills` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_kills_planes` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_kills_helicopters` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_kills_air_defense` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_kills_armor` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_kills_unarmed` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_kills_infantry` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_kills_ships` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_kills_fortification` int(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_kills_other` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_airfield_takeoffs` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_airfield_landings` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_ship_takeoffs` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_ship_landings` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_farp_takeoffs` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_farp_landings` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_other_landings` int(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`ps_other_takeoffs` int(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`pe_LogStats_mstatus` enum('?','RTB','MIA','KIA') DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`pe_LogStats_id`),
|
||||||
|
UNIQUE KEY `UNIQUE_STATS_PER_MISSION_AND_UCID_AND_TYPE` (`pe_LogStats_playerid`,`pe_LogStats_missionhash_id`,`pe_LogStats_typeid`) USING BTREE,
|
||||||
|
KEY `pe_LogStats_missionhash_id` (`pe_LogStats_missionhash_id`),
|
||||||
|
KEY `pe_LogStats_playerid` (`pe_LogStats_playerid`),
|
||||||
|
KEY `pe_LogStats_typeid` (`pe_LogStats_typeid`),
|
||||||
|
KEY `pe_LogStats_masterslot` (`pe_LogStats_masterslot`),
|
||||||
|
KEY `pe_LogStats_mstatus` (`pe_LogStats_mstatus`),
|
||||||
|
KEY `pe_LogStats_seat` (`pe_LogStats_seat`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=10220 DEFAULT CHARSET=utf8;
|
||||||
|
DROP TRIGGER IF EXISTS `pe_LogStats_UPDATE`;
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER `pe_LogStats_UPDATE` BEFORE UPDATE ON `pe_LogStats` FOR EACH ROW BEGIN
|
||||||
|
IF NEW.ps_ejections > 0 THEN
|
||||||
|
SET NEW.pe_LogStats_mstatus = "MIA";
|
||||||
|
ELSEIF NEW.ps_deaths > 0 THEN
|
||||||
|
SET NEW.pe_LogStats_mstatus = "KIA";
|
||||||
|
ELSEIF (NEW.ps_airfield_landings + NEW.ps_farp_landings + NEW.ps_other_landings + NEW.ps_ship_landings) >= (NEW.ps_airfield_takeoffs + NEW.ps_farp_takeoffs + NEW.ps_other_takeoffs + NEW.ps_ship_takeoffs) THEN
|
||||||
|
IF (NEW.ps_airfield_takeoffs + NEW.ps_farp_takeoffs + NEW.ps_other_takeoffs + NEW.ps_ship_takeoffs) > 0 or (NEW.ps_airfield_landings + NEW.ps_farp_landings + NEW.ps_other_landings + NEW.ps_ship_landings) > 0 THEN
|
||||||
|
SET NEW.pe_LogStats_mstatus = "RTB";
|
||||||
|
ELSE
|
||||||
|
SET NEW.pe_LogStats_mstatus = "?";
|
||||||
|
END IF;
|
||||||
|
ELSEIF (NEW.ps_airfield_takeoffs + NEW.ps_farp_takeoffs + NEW.ps_other_takeoffs + NEW.ps_ship_takeoffs) > (NEW.ps_airfield_landings + NEW.ps_farp_landings + NEW.ps_other_landings + NEW.ps_ship_landings) and NEW.ps_ejections=0 and NEW.ps_deaths=0 THEN
|
||||||
|
SET NEW.pe_LogStats_mstatus = "MIA";
|
||||||
|
ELSE
|
||||||
|
SET NEW.pe_LogStats_mstatus = "?";
|
||||||
|
END IF;
|
||||||
|
END
|
||||||
|
$$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE `pe_DataMissionHashes` ADD FULLTEXT KEY `pe_DataMissionHashes_hash` (`pe_DataMissionHashes_hash`);
|
||||||
|
|
||||||
|
ALTER TABLE `pe_DataPlayers` ADD FULLTEXT KEY `pe_DataPlayers_ucid` (`pe_DataPlayers_ucid`);
|
||||||
|
|
||||||
|
ALTER TABLE `pe_DataTypes` ADD FULLTEXT KEY `pe_DataTypes_name` (`pe_DataTypes_name`);
|
||||||
|
|
||||||
|
ALTER TABLE `pe_LogChat` ADD FULLTEXT KEY `pe_LogChat_msg` (`pe_LogChat_msg`);
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||||
|
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||||
121
README.md
@@ -1,54 +1,131 @@
|
|||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
# Perun for DCS World
|
# Perun for DCS World
|
||||||
|
Included lua script extracts data from DCS World multiplayer server and sends information to TCP port and JSON file for further processing.
|
||||||
|
|
||||||
This toolset extracts data from DCS World server and export it to local json file and UDP port.
|
Provided windows app puts received TCP packets to MySQL database; additionaly Perun windows application can be used to merge LotATC and DCS SRS data in one database making Perun for DCS World wannabe ultimate integration tool for the server admins.
|
||||||
|
|
||||||
## Getting Started
|
However, this software is intended to be used by experienced users - the output is MySQL data and/or JSON file; you will need to process/display it yourself.
|
||||||
|
|
||||||
You can use this toolkit with or without Windows app. Simple DCS export scripts will create JSON file which can be used for further processing.
|

|
||||||
|

|
||||||
|
|
||||||
### Prerequisites
|
## Prerequisites
|
||||||
|
Core:
|
||||||
|
* For JSON Export:
|
||||||
|
* DCS World stable or DCS World beta
|
||||||
|
* **(Optional)** For MySQL Export:
|
||||||
|
* MySQL database with read/write access running at min. 5.7 server (tested with v5.7.21; native JSON support is required)
|
||||||
|
* .NET Framework 4.8.0
|
||||||
|
|
||||||
JSON Export:
|
3rd party applications support:
|
||||||
* DCS World stable or DCS World beta
|
* for [DCS SRS](https://github.com/ciribob/DCS-SimpleRadioStandalone/releases) integration location of the clients-list.json file will be required (by default: SRS Server folder), "Auto Export List" option has to be enabled - see [SRS documentation](https://github.com/ciribob/DCS-SimpleRadioStandalone/wiki)
|
||||||
|
* for [LotATC](https://www.lotatc.com/) you will need location of stats.json file and proper LotATC configuration with JSON data export enabled - see [LotATC documentation](https://www.lotatc.com/documentation/server_configuration.html)
|
||||||
|
|
||||||
For UDP Export:
|
## Installing
|
||||||
* Windows app which handles UDP readouts
|
* Download latest [release](https://github.com/szporwolik/perun/releases)
|
||||||
|
* Copy contents of [01_DCS](https://github.com/szporwolik/perun/tree/master/01_DCS) to your \Scripts folder (located inside DCS folder in your Saved Games)
|
||||||
|
* **optionaly** create MySQL database using SQL script located in [03_MySQL](https://github.com/szporwolik/perun/tree/master/03_MySQL); note that you need just a one database per DCS server machine - multiple instances pushing data to the one database are supported
|
||||||
|
|
||||||
For MySQL Export:
|
## Running
|
||||||
* MySQL server with read/write access
|
* Start DCS World and host multiplayer session
|
||||||
|
* by default the JSON is written into Scripts\Json folder located in your Saved Games DCS folder tree
|
||||||
|
* by default the TCP port 48620 is in use as target port
|
||||||
|
* **optionaly** run the Win32 application
|
||||||
|
* set MySQL connection data
|
||||||
|
* **optionaly** point LotATC json file location
|
||||||
|
* **optionaly** point DCS SRS json file location
|
||||||
|
* click connect and leave the app running in the background
|
||||||
|
* **data shall now be filling your MySQL database**
|
||||||
|
|
||||||
### Installing
|
### Windows APP - command line arguments (for expert users)
|
||||||
|
Windows app supports command line arguments, what may be handy in case of multiple instance of DCS servers running at the same machine.
|
||||||
|
|
||||||
* Copy contents of DCS folder to you \Scripts folder (inside DCS folder in your Saved Games)
|
The following arguments are accepted (keep the order!):
|
||||||
|
* server port (shall be the same as in the lua file!)
|
||||||
|
* instance ID (shall be the same as in the lua file!)
|
||||||
|
* path to SRS client-list.json
|
||||||
|
* path to LotATC stats.json
|
||||||
|
|
||||||
## Testing
|
Example for windows shortcut:
|
||||||
|
```
|
||||||
|
C:\Perun_v1\Perun.exe 48621 1 "G:\DCS SRS\clients-list.json" "C:\Users\DCS\Saved Games\DCS\Mods\tech\LotAtc\stats.json"
|
||||||
|
```
|
||||||
|
## Displaying data
|
||||||
|
Data displaying and handling is not in the current scope of this project. Since the end of 2018 the Perun data displaying has been hardcoded at forum.gildia.org , website for the Polish DCS community; examples:
|
||||||
|

|
||||||
|

|
||||||
|
Due to resource limitations, "Perun for DCS World" will focus on pulling the data from DCS (and external modules) and pushing it to MySQL server, but if anyone would like to develop open sourced PHP applets for data/statistics displaying we're willing to cooperate and support such projects. Unfortunetly it's not possible to share the hardcoded code from forum.gildia.org.
|
||||||
|
|
||||||
TBD
|
## Troubleshooting - FAQ
|
||||||
|
- [I keep getting 1305 MySQL error](#i-keep-getting-1305-mysql-error)
|
||||||
|
- [Carrier landing are not tracked correctly](#carrier-landing-are-not-tracked-correctly)
|
||||||
|
|
||||||
|
### I keep getting 1305 MySQL error
|
||||||
|
That probably means that your database does not support JSON functions, you shall upgrade your MySQL server to at lease 5.7 version.
|
||||||
|
|
||||||
|
### Carrier landing are not tracked correctly
|
||||||
|
DCS API does not track carrier landing natively, so there is a trick to achive that. You shall set your carrier to a propoer group name to have landings tracked.
|
||||||
|
|
||||||
|
# API documentation (for expert users)
|
||||||
|
## MySQL database structure
|
||||||
|
* table: pe_DataMissionHashes - holds mission hashes, unique hashes created per each mission start at server
|
||||||
|
* table: pe_DataPlayers - holds players UCIDs together with last login information
|
||||||
|
* table: pe_DataRaw - holds raw data received from perun windows app, containing debug/version information together with DCS SRS and LotATC data
|
||||||
|
* table: pe_DataTypes - names of all model depende class names detected in DCS
|
||||||
|
* table: pe_LogChat - holds chat history
|
||||||
|
* table: pe_LogEvent - holds event history
|
||||||
|
* table: pe_LogLogins - holds login to server event history
|
||||||
|
* table: pe_LogStats - holds static information
|
||||||
|
|
||||||
|
## Data packets - send from lua to TCP port
|
||||||
|
* ```ID: 1```, contains version/diagnostic information
|
||||||
|
* perun version - for server administration usage
|
||||||
|
* player count - actual number of connected players
|
||||||
|
* ```ID: 2```, contains status data in the following sections
|
||||||
|
* mission name - name of the mission file
|
||||||
|
* model time - simulation time
|
||||||
|
* real time - real time
|
||||||
|
* pause - information if server is paused
|
||||||
|
* multiplayer - information if this is multiplayer game (always true for dedicated server usage)
|
||||||
|
* theather - information about area of operation
|
||||||
|
* weather - basic weather information
|
||||||
|
* players - connected players
|
||||||
|
* ```ID: 3```, available slots list and coalitions
|
||||||
|
* coalitions - available coalitions
|
||||||
|
* slots - available slots
|
||||||
|
* ```ID: 4```, stores mission data ; idea is to have whole DCS.getCurrentMission() result - currenlty commented out due to performance issues
|
||||||
|
* ```ID: 50```, chat event
|
||||||
|
* ```ID: 51```, game event
|
||||||
|
* ```ID: 52```, player stats ; note that as DSC native stats are not reliable, seperate stats couting methods are used
|
||||||
|
* ```ID: 53```, player login to DCS server
|
||||||
|
* ```ID: 100```, DCS SRS's client-list.json
|
||||||
|
* ```ID: 101```, LotATC's stats.json
|
||||||
|
|
||||||
|
# Project information
|
||||||
## Built With
|
## Built With
|
||||||
|
|
||||||
* [VisualStudio 2017 Community](https://visualstudio.microsoft.com/vs/community/)
|
* [VisualStudio 2017 Community](https://visualstudio.microsoft.com/vs/community/)
|
||||||
* [Notepad++](https://notepad-plus-plus.org/)
|
* [Notepad++](https://notepad-plus-plus.org/)
|
||||||
* [TortoiseGit](https://tortoisegit.org/)
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
Please contact me if you'd like to contribute. Short rule is that all pull request shall come to "dev" branch, pull requests to "master" will be deleted.
|
||||||
Please contact me if you'd like to contribute.
|
|
||||||
|
|
||||||
## Versioning
|
## Versioning
|
||||||
|
|
||||||
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/szporwolik/perun/tags).
|
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/szporwolik/perun/tags).
|
||||||
|
|
||||||
## Authors
|
## Authors
|
||||||
|
|
||||||
* **Szymon Porwolik** - *Initial work* - [szporwolik](https://github.com/szporwolik)
|
* **Szymon Porwolik** - *Initial work* - [szporwolik](https://github.com/szporwolik)
|
||||||
|
|
||||||
See also the list of [contributors](https://github.com/szporwolik/perun/contributors) who participated in this project.
|
See also the list of [contributors](https://github.com/szporwolik/perun/contributors) who participated in this project.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
|
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
|
||||||
|
|
||||||
## Acknowledgments
|
## Acknowledgments
|
||||||
|

|
||||||
|
|
||||||
* Thanks to [Gildia DCS](https://forum.gildia.org) Polish community of DCS World pilots.
|
Thanks to [Gildia DCS](https://forum.gildia.org) Polish community of DCS World pilots.
|
||||||
|
|||||||