From 2207cb5c28fd00c06d3c00c08e00ac7e2114bf90 Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Sun, 20 Apr 2025 11:24:50 +0200 Subject: [PATCH] [CORE] Move assetcull, mangler, wolSetup tools to Core --- Core/Tools/CMakeLists.txt | 3 + Core/Tools/assetcull/CMakeLists.txt | 16 + .../Tools/assetcull/assetcull.cpp | 0 .../Tools/mangler/CMakeLists.txt | 36 +- .../Code => Core}/Tools/mangler/crc.cpp | 0 {GeneralsMD/Code => Core}/Tools/mangler/crc.h | 0 .../Code => Core}/Tools/mangler/endian.h | 0 .../Code => Core}/Tools/mangler/mangler.cpp | 0 .../Code => Core}/Tools/mangler/mangler.h | 0 .../Tools/mangler/manglertest.cpp | 0 .../Tools/mangler/wlib/arraylist.h | 0 .../Tools/mangler/wlib/configfile.cpp | 0 .../Tools/mangler/wlib/configfile.h | 0 .../Tools/mangler/wlib/critsec.cpp | 0 .../Tools/mangler/wlib/critsec.h | 0 .../Tools/mangler/wlib/dictionary.h | 0 .../Code => Core}/Tools/mangler/wlib/filed.h | 0 .../Tools/mangler/wlib/linkedlist.h | 0 .../Code => Core}/Tools/mangler/wlib/mboxd.h | 0 .../Tools/mangler/wlib/monod.cpp | 0 .../Code => Core}/Tools/mangler/wlib/monod.h | 0 .../Tools/mangler/wlib/odevice.h | 0 .../Code => Core}/Tools/mangler/wlib/sem4.cpp | 0 .../Code => Core}/Tools/mangler/wlib/sem4.h | 0 .../Tools/mangler/wlib/stderrd.h | 0 .../Tools/mangler/wlib/stdoutd.h | 0 .../Tools/mangler/wlib/streamer.cpp | 0 .../Tools/mangler/wlib/streamer.h | 0 .../Tools/mangler/wlib/syslogd.cpp | 0 .../Tools/mangler/wlib/syslogd.h | 0 .../Tools/mangler/wlib/threadfac.cpp | 0 .../Tools/mangler/wlib/threadfac.h | 0 .../Tools/mangler/wlib/threadsafe.h | 0 .../Tools/mangler/wlib/timezone.cpp | 0 .../Tools/mangler/wlib/timezone.h | 0 .../Tools/mangler/wlib/ustring.h | 0 .../Tools/mangler/wlib/wdebug.cpp | 0 .../Code => Core}/Tools/mangler/wlib/wdebug.h | 0 .../Tools/mangler/wlib/wstring.cpp | 0 .../Tools/mangler/wlib/wstring.h | 0 .../Tools/mangler/wlib/wstypes.h | 0 .../Tools/mangler/wlib/wtime.cpp | 0 .../Code => Core}/Tools/mangler/wlib/wtime.h | 0 .../Tools/mangler/wlib/xtime.cpp | 0 .../Code => Core}/Tools/mangler/wlib/xtime.h | 0 .../Tools/mangler/wnet/field.cpp | 0 .../Code => Core}/Tools/mangler/wnet/field.h | 0 .../Tools/mangler/wnet/packet.cpp | 0 .../Code => Core}/Tools/mangler/wnet/packet.h | 0 .../Code => Core}/Tools/mangler/wnet/tcp.cpp | 0 .../Code => Core}/Tools/mangler/wnet/tcp.h | 0 .../Code => Core}/Tools/mangler/wnet/udp.cpp | 0 .../Code => Core}/Tools/mangler/wnet/udp.h | 0 .../Tools/wolSetup/CMakeLists.txt | 10 +- .../Code => Core}/Tools/wolSetup/StdAfx.cpp | 0 .../Code => Core}/Tools/wolSetup/StdAfx.h | 0 .../Tools/wolSetup/WOLAPI/chatdefs.h | 0 .../Tools/wolSetup/WOLAPI/downloaddefs.h | 0 .../Tools/wolSetup/WOLAPI/ftpdefs.h | 0 .../Tools/wolSetup/WOLAPI/netutildefs.h | 0 .../Tools/wolSetup/WOLAPI/wolapi.dll | Bin .../Tools/wolSetup/WOLAPI/wolapi.h | 0 .../Tools/wolSetup/WOLAPI/wolapi_i.c | 0 .../Tools/wolSetup/WOLAPI/woldbg.dll | Bin .../Code => Core}/Tools/wolSetup/makedist.bat | 0 .../Code => Core}/Tools/wolSetup/resource.h | 0 .../Code => Core}/Tools/wolSetup/small.ico | Bin .../Code => Core}/Tools/wolSetup/verchk.cpp | 0 .../Code => Core}/Tools/wolSetup/verchk.h | 0 .../Code => Core}/Tools/wolSetup/wolInit.cpp | 0 .../Code => Core}/Tools/wolSetup/wolSetup.cpp | 0 .../Code => Core}/Tools/wolSetup/wolSetup.h | 0 .../Code => Core}/Tools/wolSetup/wolSetup.ico | Bin .../Code => Core}/Tools/wolSetup/wolSetup.rc | 0 Generals/Code/Tools/CMakeLists.txt | 2 - Generals/Code/Tools/mangler/Makefile | 59 - Generals/Code/Tools/mangler/crc.cpp | 180 - Generals/Code/Tools/mangler/crc.h | 26 - Generals/Code/Tools/mangler/endian.h | 65 - Generals/Code/Tools/mangler/mangler.cpp | 209 - Generals/Code/Tools/mangler/mangler.h | 79 - Generals/Code/Tools/mangler/manglertest.cpp | 246 - Generals/Code/Tools/mangler/wlib/Makefile | 41 - Generals/Code/Tools/mangler/wlib/arraylist.h | 709 --- .../Code/Tools/mangler/wlib/configfile.cpp | 490 -- Generals/Code/Tools/mangler/wlib/configfile.h | 76 - Generals/Code/Tools/mangler/wlib/critsec.cpp | 129 - Generals/Code/Tools/mangler/wlib/critsec.h | 62 - Generals/Code/Tools/mangler/wlib/dictionary.h | 681 -- Generals/Code/Tools/mangler/wlib/filed.h | 51 - Generals/Code/Tools/mangler/wlib/linkedlist.h | 495 -- Generals/Code/Tools/mangler/wlib/mboxd.h | 40 - Generals/Code/Tools/mangler/wlib/monod.cpp | 57 - Generals/Code/Tools/mangler/wlib/monod.h | 74 - Generals/Code/Tools/mangler/wlib/odevice.h | 32 - Generals/Code/Tools/mangler/wlib/sem4.cpp | 182 - Generals/Code/Tools/mangler/wlib/sem4.h | 64 - Generals/Code/Tools/mangler/wlib/stderrd.h | 39 - Generals/Code/Tools/mangler/wlib/stdoutd.h | 40 - Generals/Code/Tools/mangler/wlib/streamer.cpp | 154 - Generals/Code/Tools/mangler/wlib/streamer.h | 67 - Generals/Code/Tools/mangler/wlib/syslogd.cpp | 39 - Generals/Code/Tools/mangler/wlib/syslogd.h | 48 - .../Code/Tools/mangler/wlib/threadfac.cpp | 221 - Generals/Code/Tools/mangler/wlib/threadfac.h | 124 - Generals/Code/Tools/mangler/wlib/threadsafe.h | 62 - Generals/Code/Tools/mangler/wlib/timezone.cpp | 71 - Generals/Code/Tools/mangler/wlib/timezone.h | 41 - Generals/Code/Tools/mangler/wlib/ustring.h | 61 - Generals/Code/Tools/mangler/wlib/wdebug.cpp | 190 - Generals/Code/Tools/mangler/wlib/wdebug.h | 314 - Generals/Code/Tools/mangler/wlib/wstring.cpp | 597 -- Generals/Code/Tools/mangler/wlib/wstring.h | 93 - Generals/Code/Tools/mangler/wlib/wstypes.h | 118 - Generals/Code/Tools/mangler/wlib/wtime.cpp | 802 --- Generals/Code/Tools/mangler/wlib/wtime.h | 128 - Generals/Code/Tools/mangler/wlib/xtime.cpp | 1015 --- Generals/Code/Tools/mangler/wlib/xtime.h | 146 - Generals/Code/Tools/mangler/wnet/Makefile | 33 - Generals/Code/Tools/mangler/wnet/field.cpp | 319 - Generals/Code/Tools/mangler/wnet/field.h | 101 - Generals/Code/Tools/mangler/wnet/packet.cpp | 522 -- Generals/Code/Tools/mangler/wnet/packet.h | 108 - Generals/Code/Tools/mangler/wnet/tcp.cpp | 1242 ---- Generals/Code/Tools/mangler/wnet/tcp.h | 199 - Generals/Code/Tools/mangler/wnet/udp.cpp | 372 -- Generals/Code/Tools/mangler/wnet/udp.h | 114 - Generals/Code/Tools/wolSetup/CMakeLists.txt | 32 - Generals/Code/Tools/wolSetup/StdAfx.cpp | 26 - Generals/Code/Tools/wolSetup/StdAfx.h | 41 - .../Code/Tools/wolSetup/WOLAPI/chatdefs.h | 173 - .../Code/Tools/wolSetup/WOLAPI/downloaddefs.h | 60 - Generals/Code/Tools/wolSetup/WOLAPI/ftpdefs.h | 30 - .../Code/Tools/wolSetup/WOLAPI/netutildefs.h | 32 - Generals/Code/Tools/wolSetup/WOLAPI/wolapi.h | 5492 ----------------- .../Code/Tools/wolSetup/WOLAPI/wolapi_i.c | 113 - Generals/Code/Tools/wolSetup/resource.h | 33 - Generals/Code/Tools/wolSetup/verchk.cpp | 89 - Generals/Code/Tools/wolSetup/verchk.h | 32 - Generals/Code/Tools/wolSetup/wolInit.cpp | 219 - Generals/Code/Tools/wolSetup/wolSetup.cpp | 211 - Generals/Code/Tools/wolSetup/wolSetup.h | 46 - GeneralsMD/Code/Tools/CMakeLists.txt | 3 - .../Code/Tools/assetcull/CMakeLists.txt | 16 - GeneralsMD/Code/Tools/mangler/CMakeLists.txt | 95 - GeneralsMD/Code/Tools/mangler/Makefile | 59 - GeneralsMD/Code/Tools/mangler/wlib/Makefile | 41 - GeneralsMD/Code/Tools/mangler/wnet/Makefile | 33 - .../Code/Tools/wolSetup/WOLAPI/wolapi.dll | Bin 286782 -> 0 bytes .../Code/Tools/wolSetup/WOLAPI/woldbg.dll | Bin 921647 -> 0 bytes GeneralsMD/Code/Tools/wolSetup/makedist.bat | 5 - GeneralsMD/Code/Tools/wolSetup/small.ico | Bin 318 -> 0 bytes GeneralsMD/Code/Tools/wolSetup/wolSetup.ico | Bin 1078 -> 0 bytes GeneralsMD/Code/Tools/wolSetup/wolSetup.rc | 158 - 154 files changed, 42 insertions(+), 18491 deletions(-) create mode 100644 Core/Tools/assetcull/CMakeLists.txt rename {GeneralsMD/Code => Core}/Tools/assetcull/assetcull.cpp (100%) rename {Generals/Code => Core}/Tools/mangler/CMakeLists.txt (54%) rename {GeneralsMD/Code => Core}/Tools/mangler/crc.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/crc.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/endian.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/mangler.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/mangler.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/manglertest.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/arraylist.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/configfile.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/configfile.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/critsec.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/critsec.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/dictionary.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/filed.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/linkedlist.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/mboxd.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/monod.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/monod.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/odevice.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/sem4.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/sem4.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/stderrd.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/stdoutd.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/streamer.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/streamer.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/syslogd.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/syslogd.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/threadfac.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/threadfac.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/threadsafe.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/timezone.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/timezone.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/ustring.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/wdebug.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/wdebug.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/wstring.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/wstring.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/wstypes.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/wtime.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/wtime.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/xtime.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wlib/xtime.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wnet/field.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wnet/field.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wnet/packet.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wnet/packet.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wnet/tcp.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wnet/tcp.h (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wnet/udp.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/mangler/wnet/udp.h (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/CMakeLists.txt (63%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/StdAfx.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/StdAfx.h (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/WOLAPI/chatdefs.h (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/WOLAPI/downloaddefs.h (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/WOLAPI/ftpdefs.h (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/WOLAPI/netutildefs.h (100%) rename {Generals/Code => Core}/Tools/wolSetup/WOLAPI/wolapi.dll (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/WOLAPI/wolapi.h (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/WOLAPI/wolapi_i.c (100%) rename {Generals/Code => Core}/Tools/wolSetup/WOLAPI/woldbg.dll (100%) rename {Generals/Code => Core}/Tools/wolSetup/makedist.bat (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/resource.h (100%) rename {Generals/Code => Core}/Tools/wolSetup/small.ico (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/verchk.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/verchk.h (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/wolInit.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/wolSetup.cpp (100%) rename {GeneralsMD/Code => Core}/Tools/wolSetup/wolSetup.h (100%) rename {Generals/Code => Core}/Tools/wolSetup/wolSetup.ico (100%) rename {Generals/Code => Core}/Tools/wolSetup/wolSetup.rc (100%) delete mode 100644 Generals/Code/Tools/mangler/Makefile delete mode 100644 Generals/Code/Tools/mangler/crc.cpp delete mode 100644 Generals/Code/Tools/mangler/crc.h delete mode 100644 Generals/Code/Tools/mangler/endian.h delete mode 100644 Generals/Code/Tools/mangler/mangler.cpp delete mode 100644 Generals/Code/Tools/mangler/mangler.h delete mode 100644 Generals/Code/Tools/mangler/manglertest.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/Makefile delete mode 100644 Generals/Code/Tools/mangler/wlib/arraylist.h delete mode 100644 Generals/Code/Tools/mangler/wlib/configfile.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/configfile.h delete mode 100644 Generals/Code/Tools/mangler/wlib/critsec.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/critsec.h delete mode 100644 Generals/Code/Tools/mangler/wlib/dictionary.h delete mode 100644 Generals/Code/Tools/mangler/wlib/filed.h delete mode 100644 Generals/Code/Tools/mangler/wlib/linkedlist.h delete mode 100644 Generals/Code/Tools/mangler/wlib/mboxd.h delete mode 100644 Generals/Code/Tools/mangler/wlib/monod.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/monod.h delete mode 100644 Generals/Code/Tools/mangler/wlib/odevice.h delete mode 100644 Generals/Code/Tools/mangler/wlib/sem4.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/sem4.h delete mode 100644 Generals/Code/Tools/mangler/wlib/stderrd.h delete mode 100644 Generals/Code/Tools/mangler/wlib/stdoutd.h delete mode 100644 Generals/Code/Tools/mangler/wlib/streamer.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/streamer.h delete mode 100644 Generals/Code/Tools/mangler/wlib/syslogd.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/syslogd.h delete mode 100644 Generals/Code/Tools/mangler/wlib/threadfac.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/threadfac.h delete mode 100644 Generals/Code/Tools/mangler/wlib/threadsafe.h delete mode 100644 Generals/Code/Tools/mangler/wlib/timezone.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/timezone.h delete mode 100644 Generals/Code/Tools/mangler/wlib/ustring.h delete mode 100644 Generals/Code/Tools/mangler/wlib/wdebug.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/wdebug.h delete mode 100644 Generals/Code/Tools/mangler/wlib/wstring.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/wstring.h delete mode 100644 Generals/Code/Tools/mangler/wlib/wstypes.h delete mode 100644 Generals/Code/Tools/mangler/wlib/wtime.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/wtime.h delete mode 100644 Generals/Code/Tools/mangler/wlib/xtime.cpp delete mode 100644 Generals/Code/Tools/mangler/wlib/xtime.h delete mode 100644 Generals/Code/Tools/mangler/wnet/Makefile delete mode 100644 Generals/Code/Tools/mangler/wnet/field.cpp delete mode 100644 Generals/Code/Tools/mangler/wnet/field.h delete mode 100644 Generals/Code/Tools/mangler/wnet/packet.cpp delete mode 100644 Generals/Code/Tools/mangler/wnet/packet.h delete mode 100644 Generals/Code/Tools/mangler/wnet/tcp.cpp delete mode 100644 Generals/Code/Tools/mangler/wnet/tcp.h delete mode 100644 Generals/Code/Tools/mangler/wnet/udp.cpp delete mode 100644 Generals/Code/Tools/mangler/wnet/udp.h delete mode 100644 Generals/Code/Tools/wolSetup/CMakeLists.txt delete mode 100644 Generals/Code/Tools/wolSetup/StdAfx.cpp delete mode 100644 Generals/Code/Tools/wolSetup/StdAfx.h delete mode 100644 Generals/Code/Tools/wolSetup/WOLAPI/chatdefs.h delete mode 100644 Generals/Code/Tools/wolSetup/WOLAPI/downloaddefs.h delete mode 100644 Generals/Code/Tools/wolSetup/WOLAPI/ftpdefs.h delete mode 100644 Generals/Code/Tools/wolSetup/WOLAPI/netutildefs.h delete mode 100644 Generals/Code/Tools/wolSetup/WOLAPI/wolapi.h delete mode 100644 Generals/Code/Tools/wolSetup/WOLAPI/wolapi_i.c delete mode 100644 Generals/Code/Tools/wolSetup/resource.h delete mode 100644 Generals/Code/Tools/wolSetup/verchk.cpp delete mode 100644 Generals/Code/Tools/wolSetup/verchk.h delete mode 100644 Generals/Code/Tools/wolSetup/wolInit.cpp delete mode 100644 Generals/Code/Tools/wolSetup/wolSetup.cpp delete mode 100644 Generals/Code/Tools/wolSetup/wolSetup.h delete mode 100644 GeneralsMD/Code/Tools/assetcull/CMakeLists.txt delete mode 100644 GeneralsMD/Code/Tools/mangler/CMakeLists.txt delete mode 100644 GeneralsMD/Code/Tools/mangler/Makefile delete mode 100644 GeneralsMD/Code/Tools/mangler/wlib/Makefile delete mode 100644 GeneralsMD/Code/Tools/mangler/wnet/Makefile delete mode 100644 GeneralsMD/Code/Tools/wolSetup/WOLAPI/wolapi.dll delete mode 100644 GeneralsMD/Code/Tools/wolSetup/WOLAPI/woldbg.dll delete mode 100644 GeneralsMD/Code/Tools/wolSetup/makedist.bat delete mode 100644 GeneralsMD/Code/Tools/wolSetup/small.ico delete mode 100644 GeneralsMD/Code/Tools/wolSetup/wolSetup.ico delete mode 100644 GeneralsMD/Code/Tools/wolSetup/wolSetup.rc diff --git a/Core/Tools/CMakeLists.txt b/Core/Tools/CMakeLists.txt index dcf4f50e122..542db74c0c5 100644 --- a/Core/Tools/CMakeLists.txt +++ b/Core/Tools/CMakeLists.txt @@ -7,13 +7,16 @@ endif() # Build less useful tool/test binaries. if(RTS_BUILD_CORE_EXTRAS) + add_subdirectory(assetcull) add_subdirectory(Babylon) add_subdirectory(buildVersionUpdate) add_subdirectory(Compress) add_subdirectory(CRCDiff) + add_subdirectory(mangler) add_subdirectory(matchbot) add_subdirectory(textureCompress) add_subdirectory(timingTest) add_subdirectory(versionUpdate) + add_subdirectory(wolSetup) add_subdirectory(WW3D) endif() diff --git a/Core/Tools/assetcull/CMakeLists.txt b/Core/Tools/assetcull/CMakeLists.txt new file mode 100644 index 00000000000..ce70dc9ab7f --- /dev/null +++ b/Core/Tools/assetcull/CMakeLists.txt @@ -0,0 +1,16 @@ +set(ASSETCULL_SRC + "assetcull.cpp" +) + +add_executable(core_assetcull WIN32) +set_target_properties(core_assetcull PROPERTIES OUTPUT_NAME assetcull) + +target_sources(core_assetcull PRIVATE ${ASSETCULL_SRC}) + +target_link_libraries(core_assetcull PRIVATE + core_config +) + +if(WIN32 OR "${CMAKE_SYSTEM}" MATCHES "Windows") + target_link_options(core_assetcull PRIVATE /subsystem:console) +endif() diff --git a/GeneralsMD/Code/Tools/assetcull/assetcull.cpp b/Core/Tools/assetcull/assetcull.cpp similarity index 100% rename from GeneralsMD/Code/Tools/assetcull/assetcull.cpp rename to Core/Tools/assetcull/assetcull.cpp diff --git a/Generals/Code/Tools/mangler/CMakeLists.txt b/Core/Tools/mangler/CMakeLists.txt similarity index 54% rename from Generals/Code/Tools/mangler/CMakeLists.txt rename to Core/Tools/mangler/CMakeLists.txt index 21d297d23b0..542d8a63226 100644 --- a/Generals/Code/Tools/mangler/CMakeLists.txt +++ b/Core/Tools/mangler/CMakeLists.txt @@ -56,40 +56,40 @@ set(MANGLERTEST_SRC "manglertest.cpp" ) -add_library(g_manglerlib STATIC) -set_target_properties(g_manglerlib PROPERTIES OUTPUT_NAME manglerlib) +add_library(core_manglerlib STATIC) +set_target_properties(core_manglerlib PROPERTIES OUTPUT_NAME manglerlib) -target_sources(g_manglerlib PUBLIC ${MANGLERLIB_SRC}) -target_include_directories(g_manglerlib PRIVATE . wlib wnet) -target_link_libraries(g_manglerlib PRIVATE wsock32) -target_link_libraries(g_manglerlib PUBLIC +target_sources(core_manglerlib PUBLIC ${MANGLERLIB_SRC}) +target_include_directories(core_manglerlib PRIVATE . wlib wnet) +target_link_libraries(core_manglerlib PRIVATE wsock32) +target_link_libraries(core_manglerlib PUBLIC core_config core_utility ) # mangler app -add_executable(g_mangler WIN32) -set_target_properties(g_mangler PROPERTIES OUTPUT_NAME mangler) +add_executable(core_mangler WIN32) +set_target_properties(core_mangler PROPERTIES OUTPUT_NAME mangler) -target_sources(g_mangler PRIVATE ${MANGLER_SRC}) -target_include_directories(g_mangler PRIVATE . wlib wnet) -target_link_libraries(g_mangler PRIVATE g_manglerlib) +target_sources(core_mangler PRIVATE ${MANGLER_SRC}) +target_include_directories(core_mangler PRIVATE . wlib wnet) +target_link_libraries(core_mangler PRIVATE core_manglerlib) if(WIN32 OR "${CMAKE_SYSTEM}" MATCHES "Windows") - target_link_options(g_mangler PRIVATE /subsystem:console) + target_link_options(core_mangler PRIVATE /subsystem:console) endif() # manglertest app -add_executable(g_manglertest WIN32) -set_target_properties(g_manglertest PROPERTIES OUTPUT_NAME manglertest) +add_executable(core_manglertest WIN32) +set_target_properties(core_manglertest PROPERTIES OUTPUT_NAME manglertest) -target_sources(g_manglertest PRIVATE ${MANGLERTEST_SRC}) -target_include_directories(g_manglertest PRIVATE . wlib wnet) -target_link_libraries(g_manglertest PRIVATE g_manglerlib) +target_sources(core_manglertest PRIVATE ${MANGLERTEST_SRC}) +target_include_directories(core_manglertest PRIVATE . wlib wnet) +target_link_libraries(core_manglertest PRIVATE core_manglerlib) if(WIN32 OR "${CMAKE_SYSTEM}" MATCHES "Windows") - target_link_options(g_manglertest PRIVATE /subsystem:console) + target_link_options(core_manglertest PRIVATE /subsystem:console) endif() diff --git a/GeneralsMD/Code/Tools/mangler/crc.cpp b/Core/Tools/mangler/crc.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/crc.cpp rename to Core/Tools/mangler/crc.cpp diff --git a/GeneralsMD/Code/Tools/mangler/crc.h b/Core/Tools/mangler/crc.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/crc.h rename to Core/Tools/mangler/crc.h diff --git a/GeneralsMD/Code/Tools/mangler/endian.h b/Core/Tools/mangler/endian.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/endian.h rename to Core/Tools/mangler/endian.h diff --git a/GeneralsMD/Code/Tools/mangler/mangler.cpp b/Core/Tools/mangler/mangler.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/mangler.cpp rename to Core/Tools/mangler/mangler.cpp diff --git a/GeneralsMD/Code/Tools/mangler/mangler.h b/Core/Tools/mangler/mangler.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/mangler.h rename to Core/Tools/mangler/mangler.h diff --git a/GeneralsMD/Code/Tools/mangler/manglertest.cpp b/Core/Tools/mangler/manglertest.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/manglertest.cpp rename to Core/Tools/mangler/manglertest.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/arraylist.h b/Core/Tools/mangler/wlib/arraylist.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/arraylist.h rename to Core/Tools/mangler/wlib/arraylist.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/configfile.cpp b/Core/Tools/mangler/wlib/configfile.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/configfile.cpp rename to Core/Tools/mangler/wlib/configfile.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/configfile.h b/Core/Tools/mangler/wlib/configfile.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/configfile.h rename to Core/Tools/mangler/wlib/configfile.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/critsec.cpp b/Core/Tools/mangler/wlib/critsec.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/critsec.cpp rename to Core/Tools/mangler/wlib/critsec.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/critsec.h b/Core/Tools/mangler/wlib/critsec.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/critsec.h rename to Core/Tools/mangler/wlib/critsec.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/dictionary.h b/Core/Tools/mangler/wlib/dictionary.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/dictionary.h rename to Core/Tools/mangler/wlib/dictionary.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/filed.h b/Core/Tools/mangler/wlib/filed.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/filed.h rename to Core/Tools/mangler/wlib/filed.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/linkedlist.h b/Core/Tools/mangler/wlib/linkedlist.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/linkedlist.h rename to Core/Tools/mangler/wlib/linkedlist.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/mboxd.h b/Core/Tools/mangler/wlib/mboxd.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/mboxd.h rename to Core/Tools/mangler/wlib/mboxd.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/monod.cpp b/Core/Tools/mangler/wlib/monod.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/monod.cpp rename to Core/Tools/mangler/wlib/monod.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/monod.h b/Core/Tools/mangler/wlib/monod.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/monod.h rename to Core/Tools/mangler/wlib/monod.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/odevice.h b/Core/Tools/mangler/wlib/odevice.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/odevice.h rename to Core/Tools/mangler/wlib/odevice.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/sem4.cpp b/Core/Tools/mangler/wlib/sem4.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/sem4.cpp rename to Core/Tools/mangler/wlib/sem4.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/sem4.h b/Core/Tools/mangler/wlib/sem4.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/sem4.h rename to Core/Tools/mangler/wlib/sem4.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/stderrd.h b/Core/Tools/mangler/wlib/stderrd.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/stderrd.h rename to Core/Tools/mangler/wlib/stderrd.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/stdoutd.h b/Core/Tools/mangler/wlib/stdoutd.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/stdoutd.h rename to Core/Tools/mangler/wlib/stdoutd.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/streamer.cpp b/Core/Tools/mangler/wlib/streamer.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/streamer.cpp rename to Core/Tools/mangler/wlib/streamer.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/streamer.h b/Core/Tools/mangler/wlib/streamer.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/streamer.h rename to Core/Tools/mangler/wlib/streamer.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/syslogd.cpp b/Core/Tools/mangler/wlib/syslogd.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/syslogd.cpp rename to Core/Tools/mangler/wlib/syslogd.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/syslogd.h b/Core/Tools/mangler/wlib/syslogd.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/syslogd.h rename to Core/Tools/mangler/wlib/syslogd.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/threadfac.cpp b/Core/Tools/mangler/wlib/threadfac.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/threadfac.cpp rename to Core/Tools/mangler/wlib/threadfac.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/threadfac.h b/Core/Tools/mangler/wlib/threadfac.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/threadfac.h rename to Core/Tools/mangler/wlib/threadfac.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/threadsafe.h b/Core/Tools/mangler/wlib/threadsafe.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/threadsafe.h rename to Core/Tools/mangler/wlib/threadsafe.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/timezone.cpp b/Core/Tools/mangler/wlib/timezone.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/timezone.cpp rename to Core/Tools/mangler/wlib/timezone.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/timezone.h b/Core/Tools/mangler/wlib/timezone.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/timezone.h rename to Core/Tools/mangler/wlib/timezone.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/ustring.h b/Core/Tools/mangler/wlib/ustring.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/ustring.h rename to Core/Tools/mangler/wlib/ustring.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/wdebug.cpp b/Core/Tools/mangler/wlib/wdebug.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/wdebug.cpp rename to Core/Tools/mangler/wlib/wdebug.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/wdebug.h b/Core/Tools/mangler/wlib/wdebug.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/wdebug.h rename to Core/Tools/mangler/wlib/wdebug.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/wstring.cpp b/Core/Tools/mangler/wlib/wstring.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/wstring.cpp rename to Core/Tools/mangler/wlib/wstring.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/wstring.h b/Core/Tools/mangler/wlib/wstring.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/wstring.h rename to Core/Tools/mangler/wlib/wstring.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/wstypes.h b/Core/Tools/mangler/wlib/wstypes.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/wstypes.h rename to Core/Tools/mangler/wlib/wstypes.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/wtime.cpp b/Core/Tools/mangler/wlib/wtime.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/wtime.cpp rename to Core/Tools/mangler/wlib/wtime.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/wtime.h b/Core/Tools/mangler/wlib/wtime.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/wtime.h rename to Core/Tools/mangler/wlib/wtime.h diff --git a/GeneralsMD/Code/Tools/mangler/wlib/xtime.cpp b/Core/Tools/mangler/wlib/xtime.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/xtime.cpp rename to Core/Tools/mangler/wlib/xtime.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wlib/xtime.h b/Core/Tools/mangler/wlib/xtime.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wlib/xtime.h rename to Core/Tools/mangler/wlib/xtime.h diff --git a/GeneralsMD/Code/Tools/mangler/wnet/field.cpp b/Core/Tools/mangler/wnet/field.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wnet/field.cpp rename to Core/Tools/mangler/wnet/field.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wnet/field.h b/Core/Tools/mangler/wnet/field.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wnet/field.h rename to Core/Tools/mangler/wnet/field.h diff --git a/GeneralsMD/Code/Tools/mangler/wnet/packet.cpp b/Core/Tools/mangler/wnet/packet.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wnet/packet.cpp rename to Core/Tools/mangler/wnet/packet.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wnet/packet.h b/Core/Tools/mangler/wnet/packet.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wnet/packet.h rename to Core/Tools/mangler/wnet/packet.h diff --git a/GeneralsMD/Code/Tools/mangler/wnet/tcp.cpp b/Core/Tools/mangler/wnet/tcp.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wnet/tcp.cpp rename to Core/Tools/mangler/wnet/tcp.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wnet/tcp.h b/Core/Tools/mangler/wnet/tcp.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wnet/tcp.h rename to Core/Tools/mangler/wnet/tcp.h diff --git a/GeneralsMD/Code/Tools/mangler/wnet/udp.cpp b/Core/Tools/mangler/wnet/udp.cpp similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wnet/udp.cpp rename to Core/Tools/mangler/wnet/udp.cpp diff --git a/GeneralsMD/Code/Tools/mangler/wnet/udp.h b/Core/Tools/mangler/wnet/udp.h similarity index 100% rename from GeneralsMD/Code/Tools/mangler/wnet/udp.h rename to Core/Tools/mangler/wnet/udp.h diff --git a/GeneralsMD/Code/Tools/wolSetup/CMakeLists.txt b/Core/Tools/wolSetup/CMakeLists.txt similarity index 63% rename from GeneralsMD/Code/Tools/wolSetup/CMakeLists.txt rename to Core/Tools/wolSetup/CMakeLists.txt index 3ba070248c8..01e253838f7 100644 --- a/GeneralsMD/Code/Tools/wolSetup/CMakeLists.txt +++ b/Core/Tools/wolSetup/CMakeLists.txt @@ -15,18 +15,18 @@ set(WOLSETUP_SRC "WOLAPI/wolapi.h" ) -add_executable(z_wolsetup WIN32) -set_target_properties(z_wolsetup PROPERTIES OUTPUT_NAME wolsetup) +add_executable(core_wolsetup WIN32) +set_target_properties(core_wolsetup PROPERTIES OUTPUT_NAME wolsetup) -target_sources(z_wolsetup PRIVATE ${WOLSETUP_SRC}) +target_sources(core_wolsetup PRIVATE ${WOLSETUP_SRC}) -target_link_libraries(z_wolsetup PRIVATE +target_link_libraries(core_wolsetup PRIVATE core_config Version ) if(WIN32 OR "${CMAKE_SYSTEM}" MATCHES "Windows") - target_sources(z_wolsetup PRIVATE wolSetup.rc) + target_sources(core_wolsetup PRIVATE wolSetup.rc) endif() # TODO: Copy the dll's that reside in the WOLAPI folder. diff --git a/GeneralsMD/Code/Tools/wolSetup/StdAfx.cpp b/Core/Tools/wolSetup/StdAfx.cpp similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/StdAfx.cpp rename to Core/Tools/wolSetup/StdAfx.cpp diff --git a/GeneralsMD/Code/Tools/wolSetup/StdAfx.h b/Core/Tools/wolSetup/StdAfx.h similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/StdAfx.h rename to Core/Tools/wolSetup/StdAfx.h diff --git a/GeneralsMD/Code/Tools/wolSetup/WOLAPI/chatdefs.h b/Core/Tools/wolSetup/WOLAPI/chatdefs.h similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/WOLAPI/chatdefs.h rename to Core/Tools/wolSetup/WOLAPI/chatdefs.h diff --git a/GeneralsMD/Code/Tools/wolSetup/WOLAPI/downloaddefs.h b/Core/Tools/wolSetup/WOLAPI/downloaddefs.h similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/WOLAPI/downloaddefs.h rename to Core/Tools/wolSetup/WOLAPI/downloaddefs.h diff --git a/GeneralsMD/Code/Tools/wolSetup/WOLAPI/ftpdefs.h b/Core/Tools/wolSetup/WOLAPI/ftpdefs.h similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/WOLAPI/ftpdefs.h rename to Core/Tools/wolSetup/WOLAPI/ftpdefs.h diff --git a/GeneralsMD/Code/Tools/wolSetup/WOLAPI/netutildefs.h b/Core/Tools/wolSetup/WOLAPI/netutildefs.h similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/WOLAPI/netutildefs.h rename to Core/Tools/wolSetup/WOLAPI/netutildefs.h diff --git a/Generals/Code/Tools/wolSetup/WOLAPI/wolapi.dll b/Core/Tools/wolSetup/WOLAPI/wolapi.dll similarity index 100% rename from Generals/Code/Tools/wolSetup/WOLAPI/wolapi.dll rename to Core/Tools/wolSetup/WOLAPI/wolapi.dll diff --git a/GeneralsMD/Code/Tools/wolSetup/WOLAPI/wolapi.h b/Core/Tools/wolSetup/WOLAPI/wolapi.h similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/WOLAPI/wolapi.h rename to Core/Tools/wolSetup/WOLAPI/wolapi.h diff --git a/GeneralsMD/Code/Tools/wolSetup/WOLAPI/wolapi_i.c b/Core/Tools/wolSetup/WOLAPI/wolapi_i.c similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/WOLAPI/wolapi_i.c rename to Core/Tools/wolSetup/WOLAPI/wolapi_i.c diff --git a/Generals/Code/Tools/wolSetup/WOLAPI/woldbg.dll b/Core/Tools/wolSetup/WOLAPI/woldbg.dll similarity index 100% rename from Generals/Code/Tools/wolSetup/WOLAPI/woldbg.dll rename to Core/Tools/wolSetup/WOLAPI/woldbg.dll diff --git a/Generals/Code/Tools/wolSetup/makedist.bat b/Core/Tools/wolSetup/makedist.bat similarity index 100% rename from Generals/Code/Tools/wolSetup/makedist.bat rename to Core/Tools/wolSetup/makedist.bat diff --git a/GeneralsMD/Code/Tools/wolSetup/resource.h b/Core/Tools/wolSetup/resource.h similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/resource.h rename to Core/Tools/wolSetup/resource.h diff --git a/Generals/Code/Tools/wolSetup/small.ico b/Core/Tools/wolSetup/small.ico similarity index 100% rename from Generals/Code/Tools/wolSetup/small.ico rename to Core/Tools/wolSetup/small.ico diff --git a/GeneralsMD/Code/Tools/wolSetup/verchk.cpp b/Core/Tools/wolSetup/verchk.cpp similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/verchk.cpp rename to Core/Tools/wolSetup/verchk.cpp diff --git a/GeneralsMD/Code/Tools/wolSetup/verchk.h b/Core/Tools/wolSetup/verchk.h similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/verchk.h rename to Core/Tools/wolSetup/verchk.h diff --git a/GeneralsMD/Code/Tools/wolSetup/wolInit.cpp b/Core/Tools/wolSetup/wolInit.cpp similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/wolInit.cpp rename to Core/Tools/wolSetup/wolInit.cpp diff --git a/GeneralsMD/Code/Tools/wolSetup/wolSetup.cpp b/Core/Tools/wolSetup/wolSetup.cpp similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/wolSetup.cpp rename to Core/Tools/wolSetup/wolSetup.cpp diff --git a/GeneralsMD/Code/Tools/wolSetup/wolSetup.h b/Core/Tools/wolSetup/wolSetup.h similarity index 100% rename from GeneralsMD/Code/Tools/wolSetup/wolSetup.h rename to Core/Tools/wolSetup/wolSetup.h diff --git a/Generals/Code/Tools/wolSetup/wolSetup.ico b/Core/Tools/wolSetup/wolSetup.ico similarity index 100% rename from Generals/Code/Tools/wolSetup/wolSetup.ico rename to Core/Tools/wolSetup/wolSetup.ico diff --git a/Generals/Code/Tools/wolSetup/wolSetup.rc b/Core/Tools/wolSetup/wolSetup.rc similarity index 100% rename from Generals/Code/Tools/wolSetup/wolSetup.rc rename to Core/Tools/wolSetup/wolSetup.rc diff --git a/Generals/Code/Tools/CMakeLists.txt b/Generals/Code/Tools/CMakeLists.txt index 04cee100689..9fd5dc30331 100644 --- a/Generals/Code/Tools/CMakeLists.txt +++ b/Generals/Code/Tools/CMakeLists.txt @@ -14,7 +14,5 @@ endif() if(RTS_BUILD_GENERALS_EXTRAS) add_subdirectory(Autorun) add_subdirectory(Launcher) - add_subdirectory(mangler) add_subdirectory(PATCHGET) - add_subdirectory(wolSetup) endif() diff --git a/Generals/Code/Tools/mangler/Makefile b/Generals/Code/Tools/mangler/Makefile deleted file mode 100644 index d1176c2b043..00000000000 --- a/Generals/Code/Tools/mangler/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -all = mangler - -TARGET=mangler -TESTTARGET=manglertest - -OBJECTS=mangler.o crc.o -TESTOBJECTS=manglertest.o crc.o - - -LINKFLAGS= -LINKDIRS=-L. -Lwlib -Lwnet -############################################################################ -### -lpthread ### MUST MUST MUST be the last library! -############################################################################ -LINKLIBS = -lwnet -lwlib -lsocket -lnsl -lposix4 -lpthread - -INCDIR=-I. -Iwlib -Iwnet - -CPPFLAGS=$(INCDIR) -c -gstabs+ -DDEBUG -D_UNIX -#CPPFLAGS=$(INCDIR) -c -gstabs+ -D_UNIX - -CPPFILES=${OBJECTS:.o=.cpp} -CFILES=${OBJECTS:.o=.c} -.SUFFIXES : .c .cpp - - -$(TARGET) : $(OBJECTS) - g++ $(LINKFLAGS) $(OBJECTS) $(LINKDIRS) $(LINKLIBS) -o $(TARGET) - -$(TESTTARGET) : $(TESTOBJECTS) $(TARGET) - g++ $(LINKFLAGS) $(TESTOBJECTS) $(LINKDIRS) $(LINKLIBS) -o $(TESTTARGET) - -.cpp.o: - g++ $(CPPFLAGS) $< - -.c.o: - g++ $(CPPFLAGS) $< - - -depend: - g++ -M $(INCDIR) ${CFILES} $(CPPFILES) > dependencies - - -clean: - -rm *.o $(TARGET) $(TESTTARGET) core *.dat - -rebuild: - make clean; make - -run: - make; $(TARGET) - -debug: - gdb -s noxc noxc - -dist: - make clean; make; cp wdtd gavin; cp START gavin; cp STOP gavin; cp world.wdt gavin; - -#include dependencies diff --git a/Generals/Code/Tools/mangler/crc.cpp b/Generals/Code/Tools/mangler/crc.cpp deleted file mode 100644 index 42ec2f3fb5c..00000000000 --- a/Generals/Code/Tools/mangler/crc.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - - -#include -#ifdef _WINDOWS -#include // *MUST* be included before ANY Wnet/Wlib headers if _REENTRANT is defined -#endif - -#include "crc.h" - -#include "configfile.h" -#include "threadfac.h" - -#include "endian.h" - -#include "xtime.h" -#include -#include -#include -#include - - - - -/*************************************************************************** - * Add_CRC -- Adds a value to a CRC * - * * - * INPUT: * - * crc ptr to crc * - * val value to add * - * * - * OUTPUT: * - * none * - * * - * WARNINGS: * - * none * - * * - * HISTORY: * - * 05/09/1995 BRR : Created. * - *=========================================================================*/ -void Add_CRC(unsigned long *crc, unsigned char val) -{ - int hibit; - - //cout << "\t\t" << hex << val; -// val = htonl(val); - //cout << " / " << hex << val <. -*/ - -#ifndef __CRC_H__ -#define __CRC_H__ - -void Build_Packet_CRC(unsigned char *buf, int len); // len includes 4-byte CRC at head -bool Passes_CRC_Check(unsigned char *buf, int len); // len includes 4-byte CRC at head -void Add_CRC(unsigned long *crc, unsigned long val); - -#endif // __CRC_H__ diff --git a/Generals/Code/Tools/mangler/endian.h b/Generals/Code/Tools/mangler/endian.h deleted file mode 100644 index 29080033590..00000000000 --- a/Generals/Code/Tools/mangler/endian.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef __ENDIAN_H__ -#define __ENDIAN_H__ - - - -/* -** Network order is big-endian. -** -** Packet router and mangler order is big or little endian depending on server platform. -** -** Game client order is little endian. -*/ -extern bool BigEndian; - -template inline T Endian(T val) -{ - if (!BigEndian) { - return(val); - } - -/* - char temp[sizeof(T)]; - *((T*)(&temp[0])) = val; -*/ - - T retval = 0; - -/* - for (int i=0 ; i. -*/ - - -#include - -#include -#ifdef _WINDOWS -#include // *MUST* be included before ANY Wnet/Wlib headers if _REENTRANT is defined -#endif - -#include "mangler.h" -#include "crc.h" -#include "endian.h" - -#include -#include "threadfac.h" - -#include "xtime.h" -#include -#include -#include -#include - -void DisplayHelp(const char *prog) -{ - cout << "Usage: " << prog << " " << endl; - exit(0); -} - -int main(int argc, char **argv) -{ - ConfigFile config; - FILE* conf; - - if( argc <= 1 ) - { - // No args - use a default config file - if ((conf = fopen("mangler.cfg", "r")) == NULL) { - cout << "Cannot open mangler.cfg for reading." << endl; - DisplayHelp(argv[0]); - } - config.readFile(conf); - fclose(conf); - } - else if( argc == 2 && (strcmp(argv[1], "help") == 0 || strcmp(argv[1], "?") == 0 || - strcmp(argv[1], "-h") == 0) ) - DisplayHelp(argv[0]); - else if( argc == 2 ) - { - // Use a user-supplied config file - if ((conf = fopen(argv[1], "r")) == NULL) { - cout << "Cannot open " << argv[1] << " for reading." << endl; - DisplayHelp(argv[0]); - } - config.readFile(conf); - fclose(conf); - } - - // ----- LOGGING ----- - // Setup debugging & logging output - Wstring output_file("mangler.log"); - config.getString("LOGFILE", output_file); - Wstring backup_file; - backup_file = output_file; - backup_file += ".bak"; - rename(output_file.get(),backup_file.get()); // save the old file - FileD output_device(output_file.get()); - MsgManager::setAllStreams(&output_device); - DBGMSG("DBG working..."); - INFMSG("INF working..."); - WRNMSG("WRN working..."); - - if (htonl(0x12345678) == 0x12345678) - { - INFMSG("Host is network-byte-order"); - } - else - { - INFMSG("Host is Intel-byte-order"); - } - - - // ----- Initialize Winsock ----- -#ifdef _WINDOWS - WORD verReq = MAKEWORD(2, 2); - WSADATA wsadata; - - int err = WSAStartup(verReq, &wsadata); - if (err != 0) { - ERRMSG("Winsock Init failed."); - return 1; - } - - if ((LOBYTE(wsadata.wVersion) != 2) || (HIBYTE(wsadata.wVersion) !=2)) { - ERRMSG("Winsock DLL is not 2.2"); - WSACleanup(); - ERRMSG("Winsock Init failed."); - return 1; - } - INFMSG("Winsock Init done."); -#endif - - - // Set up a UDP listener - uint8 *buff=new uint8[1024]; - int retval; - UDP udp; - UDP udp2; - UDP udp3; - UDP udp4; - int port = 4321; - config.getInt("PORT", port); - uint8 blitz = 0; - - uint32 localIP = 0; - Wstring hostIPStr = ""; - config.getString("IP", hostIPStr); - if (hostIPStr.length()) - { - INFMSG("Binding to "< 0) - { - ManglerData *packet = (ManglerData *)buf; - theAddr = (unsigned char *)&(addr.sin_addr.s_addr); - if (retval != packet_size) - { - WRNMSG("Recieved mis-sized packet (" << retval << " bytes) from " << theAddr[0] << "." << theAddr[1] << "." << theAddr[2] << "." << theAddr[3] << ":" << addr.sin_port); - } - else - { - if (!Passes_CRC_Check(buf, packet_size)) - { - WRNMSG("Recieved a bad packet - good length!"); - continue; - } - packet->NetCommandType = 44; - packet->MyMangledPortNumber = addr.sin_port; // not changing to host order, cause its in network byte order now, and the game will expect it to stay that way. - packet->MyMangledAddress[0] = theAddr[0]; - packet->MyMangledAddress[1] = theAddr[1]; - packet->MyMangledAddress[2] = theAddr[2]; - packet->MyMangledAddress[3] = theAddr[3]; - blitz = packet->BlitzMe; - INFMSG("Packet ID = " << packet->packetID); - Build_Packet_CRC(buf, packet_size); - udp.Write(buf,packet_size,ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port)); - INFMSG("Saw " << (int)theAddr[0] << "." << (int)theAddr[1] << "." << (int)theAddr[2] << "." << (int)theAddr[3] << ":" << ntohs(addr.sin_port) << ((blitz)?" Blitzed":"") ); - - if (blitz) - { - udp2.Write(buf,packet_size,ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port)+1); - udp3.Write(buf,packet_size,ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port)+2); - udp4.Write(buf,packet_size,ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port)+3); - } - } - } - } - - - return 0; -} - - diff --git a/Generals/Code/Tools/mangler/mangler.h b/Generals/Code/Tools/mangler/mangler.h deleted file mode 100644 index e455648fdb8..00000000000 --- a/Generals/Code/Tools/mangler/mangler.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef __MANGLER_H__ -#define __MANGLER_H__ - -// Packet should consist of a GlobalHeaderType followed by a GlobalPacketType with the fields set as -// indicated. - - -/* -********************************** Defines ********************************** -*/ - -// This is the number of additional ports to which to reply. -#define BLITZ_SIZE 3 - -#define MPLAYER_NAME_MAX 20 -#define SERIAL_MAX 23 -typedef unsigned char ForwardMaskType; -typedef enum NetCommandType { - NET_MANGLER_REQUEST = 43, - NET_MANGLER_RESPONSE = 44 -} NetCommandType; - -/* -** One byte alignment. -*/ -#if !defined(__GNUC__) -#pragma pack(push, 1) -#define PACK -#else -#define PACK __attribute__ ((__packed__)) -#endif - -// size = 20 bytes -struct ManglerData { - unsigned int CRC PACK; - unsigned short magic PACK; - unsigned short packetID PACK; - unsigned short MyMangledPortNumber PACK; - unsigned short OriginalPortNumber PACK; - unsigned char MyMangledAddress[4] PACK; - unsigned char NetCommandType PACK; - unsigned char BlitzMe PACK; - unsigned short Padding PACK; -}; - -/* - This is for older GCC versions that can't do byte-packing. - Instead of declaring - GlobalPacketType p; - p.Command = NET_MANGLER_REQUEST; - you would do something like this: - GlobalPacketStruct p; - Eval(&p, GPCommand, NetCommandType) = NET_MANGLER_REQUEST; -*/ -#define Eval(x, y, z) ( *((z *)(&((x)->payload[(y)]))) ) - -#if !defined(__GNUC__) -#pragma pack(pop) -#endif - -#endif // __MANGLER_H__ diff --git a/Generals/Code/Tools/mangler/manglertest.cpp b/Generals/Code/Tools/mangler/manglertest.cpp deleted file mode 100644 index 6faaad6d4ba..00000000000 --- a/Generals/Code/Tools/mangler/manglertest.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - - -#include - -#include -#ifdef _WINDOWS -#include // *MUST* be included before ANY Wnet/Wlib headers if _REENTRANT is defined -#endif - -#include "mangler.h" -#include "crc.h" - -#include -#include "threadfac.h" - -#include "endian.h" - -#include "xtime.h" -#include -#include -#include -#include - -// ST - 2/1/01 12:46PM -bool BigEndian = false; - -unsigned long ResolveIP(const char *Server) -{ - char serverName[100]; - struct hostent *serverStruct; - struct in_addr *serverNode; - - if (Server == NULL) - { - ERRMSG("Can't resolve NULL"); - return 0; - } - - if (isdigit(Server[0])) - return ( ntohl(inet_addr(Server)) ); - - strcpy(serverName, Server); - - serverStruct = gethostbyname(Server); - if (serverStruct == NULL) - { - ERRMSG("Can't resolve " << Server); - return 0; - } - serverNode = (struct in_addr *) serverStruct->h_addr; - return ( ntohl(serverNode->s_addr) ); -} - -void DisplayHelp(const char *prog) -{ - cout << "Usage: " << prog << " " << endl; - exit(0); -} - -int main(int argc, char **argv) -{ - ConfigFile config; - FILE* conf; - - if( argc <= 1 ) - { - // No args - use a default config file - if ((conf = fopen("manglertest.cfg", "r")) == NULL) { - cout << "Cannot open mangler.cfg for reading." << endl; - DisplayHelp(argv[0]); - } - config.readFile(conf); - fclose(conf); - } - else if( argc == 2 && (strcmp(argv[1], "help") == 0 || strcmp(argv[1], "?") == 0 || - strcmp(argv[1], "-h") == 0) ) - DisplayHelp(argv[0]); - else if( argc == 2 ) - { - // Use a user-supplied config file - if ((conf = fopen(argv[1], "r")) == NULL) { - cout << "Cannot open " << argv[1] << " for reading." << endl; - DisplayHelp(argv[0]); - } - config.readFile(conf); - fclose(conf); - } - - // ----- LOGGING ----- - // Setup debugging & logging output - Wstring output_file("manglertest.log"); - config.getString("LOGFILE", output_file); - Wstring backup_file; - backup_file = output_file; - backup_file += ".bak"; - rename(output_file.get(),backup_file.get()); // save the old file - FileD output_device(output_file.get()); - MsgManager::setAllStreams(&output_device); - DBGMSG("DBG working..."); - INFMSG("INF working..."); - WRNMSG("WRN working..."); - - - // - // See if our processor is big or little endian. Network order is big endian. - // ST - 2/1/01 12:11PM - // - if (htonl(0x12345678) == 0x12345678) { - BigEndian = true; - } - - - // ----- Initialize Winsock ----- -#ifdef _WINDOWS - WORD verReq = MAKEWORD(2, 2); - WSADATA wsadata; - - int err = WSAStartup(verReq, &wsadata); - if (err != 0) { - ERRMSG("Winsock Init failed."); - return 1; - } - - if ((LOBYTE(wsadata.wVersion) != 2) || (HIBYTE(wsadata.wVersion) !=2)) { - ERRMSG("Winsock DLL is not 2.2"); - WSACleanup(); - ERRMSG("Winsock Init failed."); - return 1; - } - INFMSG("Winsock Init done."); -#endif - - - // Set up a UDP listener - uint8 *buff=new uint8[1024]; - int retval; - UDP udp; - int port = 4321; - config.getInt("MANGLERPORT", port); - - int localport = 4444; - config.getInt("CLIENTPORT", localport); - retval = udp.Bind((uint32)0,(uint16)localport); - DBGMSG("Bind returned " << retval); - - //----------------------------------------------------------------------------------------- - const int packet_size = sizeof(ManglerData); - INFMSG("sizeof(packet) == " << packet_size); - - unsigned char buf[packet_size]; - memset(buf, 0x44, packet_size); // init to something known for memory dumps :) - struct sockaddr_in addr; - - int doBlitz = 0; - config.getInt("BLITZ", doBlitz); - if (doBlitz) - { - INFMSG("Requsting port blitz"); - } - - unsigned char *theAddr; - fd_set fdset; - unsigned long server_addr; - Wstring manglername = "localhost"; - config.getString("MANGLERIP", manglername); - server_addr = ResolveIP(manglername.get()); - if (!server_addr) - { - ERRMSG("Cannot resolve mangler server IP"); - return 1; - } - - ManglerData *packet = (ManglerData *)buf; - packet->NetCommandType = 12; - packet->packetID = 9999; - packet->BlitzMe = doBlitz; - packet->magic = htons((unsigned short)0xf00d); - Build_Packet_CRC(buf, packet_size); - DBGMSG("Writing to " << manglername.get() << ":" << port); - udp.Write(buf,packet_size,server_addr, 4321); - - retval = udp.Wait(5, 0, fdset); - if (retval) - { - DBGMSG("Wait returned " << retval); - retval = udp.Read(buf, packet_size, &addr); // Wait until there is something on the socket - if (retval > 0) - { - theAddr = (unsigned char *)&(addr.sin_addr.s_addr); - if (retval != packet_size) - { - WRNMSG("Recieved mis-sized packet (" << retval << " bytes) from " << theAddr[0] << "." << theAddr[1] << "." << theAddr[2] << "." << theAddr[3] << ":" << addr.sin_port); - } - else - { - int packetCommand; - packetCommand = packet->NetCommandType; - if (!Passes_CRC_Check(buf, packet_size)) - { - WRNMSG("CRC error!"); - } - else if (packetCommand != 13) - { - WRNMSG("Returned packet had command type " << packetCommand); - } - else - { - int addr[4]; - unsigned short retPort; - retPort = htons(packet->MyMangledPortNumber); - addr[0] = packet->MyMangledAddress[0]; - addr[1] = packet->MyMangledAddress[1]; - addr[2] = packet->MyMangledAddress[2]; - addr[3] = packet->MyMangledAddress[3]; - DBGMSG("Saw " << addr[0] << "." << addr[1] << "." << addr[2] << "." << addr[3] << ":" << retPort); - } - } - } - } - else - { - DBGMSG("Wait timed out"); - } - - - return 0; -} - - diff --git a/Generals/Code/Tools/mangler/wlib/Makefile b/Generals/Code/Tools/mangler/wlib/Makefile deleted file mode 100644 index 1163a2ba61d..00000000000 --- a/Generals/Code/Tools/mangler/wlib/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -########################################################################### -# WLIB library makefile -########################################################################## - -#Define cc to be your C compiler -CC = g++ - -#This tells make how to go from a .cpp to a .o -.SUFFIXES: .cpp -.cpp.o: - ${CC} ${CFLAGS} -c $< - -INCLUDE = -I. -I.. - -CFLAGS = ${INCLUDE} -D_REENTRANT -DDEBUG -D_UNIX - -AR = ar -r -#CC is dumb and won't include templates in a library uness you define -#CC -xar as your replacement for 'ar' -#AR = CC -xar - -RM = rm -f -RANLIB = ranlib - -############################################################################ -#Dont mess with any of this stuff -OBJECTS = wtime.o monod.o wdebug.o sem4.o streamer.o syslogd.o wstring.o \ - configfile.o threadfac.o critsec.o xtime.o timezone.o - -LIBRARY = libwlib.a - -all: $(LIBRARY) - -$(LIBRARY): $(OBJECTS) - ${RM} libwlib.a - ${AR} libwlib.a $(OBJECTS) - #${AR} $(OBJECTS) -o libwlib.a - $(RANLIB) libwlib.a - -clean: - - rm -f $(LIBRARY) *.o core diff --git a/Generals/Code/Tools/mangler/wlib/arraylist.h b/Generals/Code/Tools/mangler/wlib/arraylist.h deleted file mode 100644 index efcd3abd650..00000000000 --- a/Generals/Code/Tools/mangler/wlib/arraylist.h +++ /dev/null @@ -1,709 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -* C O N F I D E N T I A L --- W E S T W O O D S T U D I O S * -****************************************************************************** -Project Name: -File Name : arraylist.h -Author : Neal Kettler -Start Date : Jan 19, 1997 -Last Update : Jan 19, 1997 ------------------------------------------------------------------------------- - -Array implementation of a list. Note: There are some freaky C++ memory tricks -going on here. If you think there's a leak, see me before changing it. -The way this works is that it allocates an array to hold 'N' items on the -first list add. It doesn't call the constructors for those 'N' items until -necessary (for efficiency). When an item is added to a slot then a new -class is constructed inside the array element using the placement new operator -and the class's copy constructor. When elements are removed the destructor -is then manually called on this memory location. - -All data added to the list is copied so feel free to delete/destroy/modify -the original after an add. - -You _must_ have a good copy constructor for any classes that you use this template -for! A good copy constructor is one that won't blindly duplicate pointers -that don't belong to them, etc... - -\****************************************************************************/ - -#ifndef ARRAYLIST_HEADER -#define ARRAYLIST_HEADER - -#include -#include -#include -#include -#include -#include - -#include "wstypes.h" - -// -// Usage: ArrayList TheList; -// -template -class ArrayList -{ - public: - ArrayList(); - ArrayList(ArrayList &other); - ~ArrayList(); - - // Remove all entries from the lsit - void clear(void); - - // Add a node after the zero based 'pos' - bit8 add(IN T &node,sint32 pos); - bit8 addTail(IN T &node); - bit8 addHead(IN T &node); - bit8 addSortedAsc(IN T &node); // Ascending - bit8 addSortedDes(IN T &node); // Descending - /*bit8 addNumSortedAsc(IN T &node); // Ascending - bit8 addNumSortedDes(IN T &node); // Descending*/ - - // Remove a node - bit8 remove(OUT T &node,sint32 pos); - bit8 remove(sint32 pos); - bit8 removeHead(OUT T &node); - bit8 removeTail(OUT T &node); - - // Replace one obj with another - bit8 replace(IN T &node, sint32 pos); - - - // Get a node without removing from the list - bit8 get(OUT T &node,sint32 pos) RO; - bit8 getHead(OUT T &node) RO; - bit8 getTail(OUT T &node) RO; - - // Get a pointer to the interally managed copy (careful!) - bit8 getPointer(OUT T **node,sint32 pos) RO; - - // Get the number of entries in the list - sint32 length(void) RO; - - // UNSAFE! for classes, see note below! - bit8 setSize(sint32 newsize, IN T &filler); - - // Print information on the list - void print(FILE *out); - - // assignment operator - ArrayList &operator=(IN ArrayList &other); - - private: - sint32 _sortedLookup(IN T &target, int ascending); - sint32 Entries_; // Number of entries - sint32 Slots_; // Number of available slots - - T *Vector_; // The actual memory where the list is held - - enum - { - INITIAL_SIZE = 10 - }; - - bit8 growVector(void); // Expand the number of slots - bit8 shrinkVector(void); // Reduce the number of slots -}; - - -//Create the empty list -template -ArrayList::ArrayList() -{ - Entries_=0; - Slots_=0; - Vector_=NULL; -} - -// copy constructor -template -ArrayList::ArrayList(ArrayList &other) -{ - Entries_=0; - Slots_=0; - Vector_=NULL; - (*this)=other; -} - -//Free all the memory... -template -ArrayList::~ArrayList() -{ - clear(); // Remove the entries & call destructors on them - - delete[]((uint8*)Vector_); // this will prevent the destructors from - // gettting called on elements not - // containing valid objects. - - //fprintf(stderr,"Arraylist destructor\n"); -} - -// assignment operator -template -ArrayList &ArrayList::operator=(IN ArrayList &other) -{ - T node; - clear(); - for (int i=0; i -void ArrayList::clear() -{ - for (int i=0; i~T(); // Call the destructor manually. Don't try this - // at home kiddies! - } - Entries_=0; -} - -// ************************* UNSAFE UNSAFE UNSAFE ************************* -// Note - Don't call this on any type with a constructor/destructor since this -// is really dumb and just puts a new one of filler in. Well, it's kindof safe -// just be careful. -// It's fine for simple classes like ints though.. -// -// Add/remove entries in a stupid manner... -// -// ************************************************************************** -template -bit8 ArrayList::setSize(sint32 newsize, IN T &filler) -{ - int oldEntries=Entries_; - Entries_ = newsize; - - if (newsize<0) - return(false); - - // Grow the vector as much as we need to - while (newsize > Slots_) - growVector(); - - // Create new objects in the blank holes - for (int i=oldEntries; i -bit8 ArrayList::add(IN T &node,sint32 pos) -{ - if (pos > Entries_) // You can only access one of the end of the vector - pos=Entries_; - if (pos >= Slots_) // If we're at the end, grow the list - growVector(); - if (Entries_ >= Slots_) // enuff space? - growVector(); - - // If we are insering into the middle or front of the list we have to - // slide the old objects forward. - if (pos < Entries_) // If there are elements after the add point - memmove(Vector_+pos+1,Vector_+pos,sizeof(T)*(Entries_-pos)); // move them forward - - //fprintf(stderr,"Placement new to %p\n",(Vector_+pos)); - - // This uses the placement new operator. placement new allows us to - // specify the memory address for the new object. In this case we - // want it at the 'pos' index into our array. - new((void *)(Vector_+pos)) T((T &)node); // Trust me, this isn't a memory leak - Entries_++; // one new entry - return(TRUE); -} - - -// Add to the first node, all others get shifted down one slot -template -bit8 ArrayList::addHead(IN T &node) -{ - return(add(node,0)); -} - - -// Append to the end of the list -template -bit8 ArrayList::addTail(IN T &node) -{ - return(add(node,length())); -} - - -// addSortedX only works (properly) if evrerything else in the list is added -// using addSorted. -template -bit8 ArrayList::addSortedAsc(IN T &node) -{ - sint32 pos = _sortedLookup(node, 1); - return(add(node, pos)); -} - - -// addSortedX only works (properly) if evrerything else in the list is added -// using addSorted. -template -bit8 ArrayList::addSortedDes(IN T &node) -{ - sint32 pos = _sortedLookup(node, 0); - return(add(node, pos)); -} - - -// This is the binary search used by addSorted -template -sint32 ArrayList::_sortedLookup(IN T &target, int ascending) -{ - int low, mid, high; - T* lowtarget; - T* hightarget; - T* midtarget; - - - // Trivial cases - if( Entries_ == 0 ) - return 0; - - low = 0; - high = Entries_ - 1; - while( 1 ) - { - assert( low <= high ); - mid = low + (int)(floor(((double)high - (double)low) / (double)2)); - - getPointer(&lowtarget, low); - getPointer(&hightarget, high); - getPointer(&midtarget, mid); - - // Exact match - if( *midtarget == target ) return mid; - - // Single element - if( high == low ) - { - if( ascending ) - { - if( target <= *lowtarget ) - return low; - else - return low + 1; - } - else - { - if( target <= *lowtarget ) - return low + 1; - else - return low; - } - } - - // Two elemsnts - if( (high - low) == 1 ) - { - if( ascending ) - { - if( target <= *lowtarget ) - return low; - else if( target <= *hightarget ) - return high; - else - return high + 1; - } - else - { - if( target <= *hightarget ) - return high + 1; - else if( target <= *lowtarget ) - return high; - else - return low; - } - } - - // Sorry, try again... - if( ascending ) - { - if( target < *midtarget ) - high = mid; - else - low = mid; - } - else - { - if( target < *midtarget ) - low = mid; - else - high = mid; - } - } -} - - -/*// addNumSortedX works in much the same way as addSortedX, except that I needed -// it for a very specific thing. I needed a list of strings numerically sorted, -// not alphabetically sorted. Furthermore these strings were composed of numbers -// delimited by underscores. In the interest of keeping it generic, these -// functions take as args a node, a delimiting character, and a count of the -// number of fields to include in a sort. If this is the list of strings: -// -// 55_100, 2_5, 23_32, 98_445, 2_48, 8_88, 2_3, 2_4 -// -// An alphabetical sort is: -// -// 2_3, 2_4, 2_48, 2_5, 55_100, 8_88, 98_445 -// -// But a numerical sort by calling addNumSortedAsc(, "_", 2) will result in: -// -// 2_3, 2_4, 2_5, 2_48, 8_88, 55_100, 98_445 -// -// Yes...now that you mention it I am on crack... -// -template -bit8 ArrayList::addNumSortedAsc(IN T &node, char delim, int fields) -{ - sint32 pos = _numSortedLookup(node, delim, fields, 1); - return(add(node, pos)); -} - - -// See addNumSortedAsc comment above. -template -bit8 ArrayList::addSortedDes(IN T &node, char delim, int fields) -{ - sint32 pos = _sortedLookup(node, delim, fields, 0); - return(add(node, pos)); -} - - -// This is the binary search used by addSorted -template -sint32 ArrayList::_numSortedLookup(IN T &target, char delim, int fields, int ascending) -{ - int low, mid, high; - T* lowtarget; - T* hightarget; - T* midtarget; - - - // Trivial case - if( Entries_ == 0 ) - return 0; - - low = 0; - high = Entries_; - while( 1 ) - { - assert( low <= high ); - mid = low + (int)(floor(((double)high - (double)low) / (double)2)); - - getPointer(&lowtarget, low); - getPointer(&hightarget, high); - getPointer(&midtarget, mid); - - // Exact match - if( *midtarget == target ) return mid; - - // Single element - if( high == low ) - { - if( ascending ) - { - if( target <= *lowtarget ) - return low; - else - return low + 1; - } - else - { - if( target <= *lowtarget ) - return low + 1; - else - return low; - } - } - - // Two elemsnts - if( (high - low) == 1 ) - { - if( ascending ) - { - if( target <= *lowtarget ) - return low; - else - return high; - } - else - { - if( target <= *lowtarget ) - return high; - else - return low; - } - } - - // Sorry, try again... - if( ascending ) - { - if( target < *midtarget ) - high = mid; - else - low = mid; - } - else - { - if( target < *midtarget ) - low = mid; - else - high = mid; - } - } -}*/ - - -// -// Delete an item at this index and construct a new one in it's place -// -template -bit8 ArrayList::replace(IN T &node, sint32 pos) -{ - if (Entries_==0) - return(FALSE); - if (pos<0) - pos=0; - if (pos >= Entries_) - pos=Entries_-1; - - (Vector_+pos)->~T(); // Call the destructor manually. Don't try this - // at home kiddies! - - // Now put the replacement object in there... - new((void *)(Vector_+pos)) T(node); // Trust me, this isn't a memory leak - - return(TRUE); -} - - - -// Remove at the zero based index specified by 'pos'. When removing from -// a slot, all others get shifted up by one. -template -bit8 ArrayList::remove(sint32 pos) -{ - if (Entries_==0) - return(FALSE); - if (pos<0) - pos=0; - if (pos >= Entries_) - pos=Entries_-1; - - (Vector_+pos)->~T(); // Call the destructor manually. Don't try this - // at home kiddies! - - memmove(Vector_+pos,Vector_+pos+1,sizeof(T)*(Entries_-pos-1)); - - Entries_--; - - // If we're at 33% usage or less, shrink the vector - if ( (Entries_*3) <= Slots_) - shrinkVector(); - - return(TRUE); -} - - -// Remove at the zero based index specified by 'pos'. When removing from -// a slot, all others get shifted up by one. -template -bit8 ArrayList::remove(OUT T &node, sint32 pos) -{ - bit8 retval; - retval=get(node,pos); - if (retval==FALSE) - return(FALSE); - return(remove(pos)); -} - - -// Remove the first node of the list -template -bit8 ArrayList::removeHead(OUT T &node) -{ - return(remove(node,0)); -} - - -// Remove the last node of the list -template -bit8 ArrayList::removeTail(OUT T &node) -{ - return(remove(node,Entries_-1)); -} - -// get a pointer to the internally managed object. Try and avoid this, but -// sometimes efficiency requires it... -// get a copy of an item -template -bit8 ArrayList::getPointer(OUT T **node,sint32 pos) RO -{ - if ((pos < 0)||(pos >= Entries_)) - return(FALSE); - *node=&(Vector_[pos]); - return(TRUE); -} - - -// get a copy of an item -template -bit8 ArrayList::get(OUT T &node,sint32 pos) RO -{ - if ((pos < 0)||(pos >= Entries_)) - return(FALSE); - node=Vector_[pos]; - return(TRUE); -} - - -// get a copy of the first node of the list -template -bit8 ArrayList::getHead(OUT T &node) RO -{ - return(get(node,0)); -} - - -// get a copy of the last node -template -bit8 ArrayList::getTail(OUT T &node) RO -{ - return(get(node,Entries_-1)); -} - -// just for debugging -template -void ArrayList::print(FILE *out) -{ - fprintf(out,"--------------------\n"); - //for (int i=0; i -sint32 ArrayList::length(void) RO -{ - return(Entries_); -} - -// Grow the vector by a factor of 2X -template -bit8 ArrayList::growVector(void) -{ - if (Entries_ < Slots_) // Don't grow until we're at 100% usage - return(FALSE); - - int newSlots=Entries_*2; - if(newSlots < INITIAL_SIZE) - newSlots=INITIAL_SIZE; - - //fprintf(stderr,"Growing vector to: %d\n",newSlots); - - // The goofy looking new below prevents operator new from getting called - // unnecessarily. This is severall times faster than allocating all of - // the slots as objects and then calling the assignment operator on them - // when they actually get used. - // - T *newVector=(T *)(new uint8[newSlots * sizeof(T)]); - memset(newVector,0,newSlots * sizeof(T)); // zero just to be safe - - if (Vector_ != NULL) - memcpy(newVector,Vector_,Entries_*sizeof(T)); - - delete[]((uint8 *)Vector_); // Get rid of the old vector without calling - // destructors - - Vector_=newVector; - Slots_=newSlots; - - return(TRUE); -} - - -// Shrink the vector by a factor of 2X -template -bit8 ArrayList::shrinkVector(void) -{ - //fprintf(stderr,"Shrink called\n"); - - // Don't need to shrink until usage goes below 33% - if ( (Entries_*3) > Slots_) - return(FALSE); - - int newSlots=Slots_/2; - if(newSlots < INITIAL_SIZE) // never shrink past initial size - newSlots=INITIAL_SIZE; - - if (newSlots >= Slots_) // don't need to shrink - return(FALSE); - - //fprintf(stderr,"Shrinking vector to: %d\n",newSlots); - - // The goofy looking new below prevents operator new from getting called - // unnecessarily. This is severall times faster than allocating all of - // the slots as objects and then calling the assignment operator on them - // when they actually get used. - // - T *newVector=(T *)(new uint8[newSlots * sizeof(T)]); - - if (Vector_ != NULL) // Vector_ better not be NULL! - memcpy(newVector,Vector_,Entries_*sizeof(T)); - - delete[]((uint8 *)Vector_); // Get rid of the old vector without calling - // destructors - - Vector_=newVector; - Slots_=newSlots; - - return(TRUE); -} - - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/configfile.cpp b/Generals/Code/Tools/mangler/wlib/configfile.cpp deleted file mode 100644 index b0f9e5a91ca..00000000000 --- a/Generals/Code/Tools/mangler/wlib/configfile.cpp +++ /dev/null @@ -1,490 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -* C O N F I D E N T I A L --- W E S T W O O D S T U D I O S * -****************************************************************************** -Project Name: Carpenter (The RedAlert ladder creator) -File Name : configfile.cpp -Author : Neal Kettler -Start Date : June 9, 1997 -Last Update : June 17, 1997 - - -This class will read in a config file and store the key value pairs for -later access. This is a fairly simple class, the config file is assumed -to be of the form: - -#comment -key = value - -The value can then be retrieved as a string or an integer. The key on -the left is used for retrieval and it must be specified in uppercase -for the 'get' functions. E.g. getString("KEY",valWstring); -\***************************************************************************/ - -#include -#include -#include - -#include "configfile.h" -#include "wdebug.h" - -static uint32 Wstring_Hash(const Wstring &string); -static char *Eat_Spaces(char *string); - -ConfigFile::ConfigFile() : Dictionary_(Wstring_Hash) -{ } - -ConfigFile::~ConfigFile() -{ } - -// Read and parse the config file. The key value pairs will be stored -// for later access by the getString/getInt functions. -bit8 ConfigFile::readFile(FILE *in) -{ - char string[256]; - char sectionname[256]; // section name like '[user parameters]' - Wstring key; - Wstring value; - char *cptr; - - memset(string,0,256); - memset(sectionname,0,256); - sectionList.clear(); - - while (fgets(string,256,in)) - { - cptr=Eat_Spaces(string); - if ((*cptr==0)||(*cptr=='#')) // '#' signals a comment - continue; - - if (*cptr=='[') // new section - { - key=cptr; - key.truncate(']'); // remove after & including the ] - key.cat("]"); // put the ] back - strcpy(sectionname,key.get()); // set the current section name - Wstring wssectionname; - - if (strlen(sectionname)==2) // clear section with a "[]" - { - sectionname[0]=0; - wssectionname.set(""); - } - else - wssectionname.set(sectionname+1); - - wssectionname.truncate(']'); - sectionList.addTail(wssectionname); - - - continue; - } - - if (strchr(cptr,'=')==NULL) // All config entries must have a '=' - continue; - key=cptr; - key.truncate('='); - key.removeSpaces(); // No spaces allowed in the key - key.toUpper(); // make key all caps - - // Add the section name to the end of the key - if (strlen(sectionname)) - key.cat(sectionname); - - cptr=Eat_Spaces(strchr(cptr,'=')+1); // Jump to after the '=' - value=cptr; - value.truncate('\r'); - value.truncate('\n'); - value.truncate('#'); - - // TheSuperHackers @compile xezon 25/03/2025 Re-implement algorithm to avoid writing into string buffer directly. - // Remove trailing spaces - { - const char* valueStr = value.get(); - const uint32 valueLen = value.length(); - uint32 spaceIdx = valueLen; - for (; spaceIdx > 0 && isgraph(valueStr[spaceIdx - 1])==0; --spaceIdx); - if (spaceIdx != valueLen) - value.truncate(spaceIdx); - } - - Critsec_.lock(); - Dictionary_.add(key,value); - Critsec_.unlock(); - } - return(TRUE); -} - - -// -// Enum through the config strings. To start, index & offset should be 0 -// If retval is false you're done, ignore whatever's in key & value. -// -// Section specifies the configfile section. Set to NULL if you don't care. -// -bit8 ConfigFile::enumerate(int &index, int &offset, Wstring &key, Wstring &value, IN char *section) const -{ - int seclen = strlen(section); - while(1) - { - Critsec_.lock(); - if (Dictionary_.iterate(index,offset,key,value)==FALSE) // out of keys? - { - Critsec_.unlock(); - return(FALSE); - } - Critsec_.unlock(); - - if (section==NULL) // no specified section, so any will do... - break; - - if (strlen(section)+2 >= strlen(key.get())) // key should have form: X[section] - continue; - - // Is this key part of our section? - const char *keystr = key.get() + strlen(key.get())-seclen-1; - if (strncmp(keystr,section,strlen(section))==0) - break; - } - key.truncate('['); // remove the section name - return(TRUE); -} - - - -// Get a config entry as a string -bit8 ConfigFile::getString(IN Wstring &_key, Wstring &value, IN char *section) const -{ - Wstring key(_key); - key.toUpper(); - - if (section) // append section name to key - { - key+="["; - key+=section; - key+="]"; - } - - Critsec_.lock(); - bit8 retval=Dictionary_.getValue(key,value); - Critsec_.unlock(); - - if (retval==FALSE) - { - DBGMSG("Config entry missing: "<>24); // ROL 8 - } - return(retval); -} - -static char *Eat_Spaces(char *string) -{ - char *retval=string; - while (isspace(*retval)) - retval++; - return(retval); -} diff --git a/Generals/Code/Tools/mangler/wlib/configfile.h b/Generals/Code/Tools/mangler/wlib/configfile.h deleted file mode 100644 index b622f1354e4..00000000000 --- a/Generals/Code/Tools/mangler/wlib/configfile.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -* C O N F I D E N T I A L --- W E S T W O O D S T U D I O S * -****************************************************************************** -Project Name: Carpenter (The RedAlert ladder creator) -File Name : configfile.h -Author : Neal Kettler -Start Date : June 9, 1997 -Last Update : May 13, 1999 -\***************************************************************************/ - -#ifndef CONFIGFILE_HEADER -#define CONFIGFILE_HEADER - -#include "wstypes.h" -#include "dictionary.h" -#include "wstring.h" -#include "critsec.h" -#include "arraylist.h" - -class ConfigFile -{ - public: - ConfigFile(); - ~ConfigFile(); - bit8 readFile(FILE *config); - bit8 getString(IN Wstring &key,OUT Wstring &value, IN char *section=NULL) const; - bit8 getString(IN char *key,OUT Wstring &value, IN char *section=NULL) const; - - bit8 getInt(IN Wstring &key,OUT sint32 &value, IN char *section=NULL) const; - bit8 getInt(IN char *key,OUT sint32 &value, IN char *section=NULL) const; - - bit8 getInt(IN Wstring &key,OUT sint16 &value, IN char *section=NULL) const; - bit8 getInt(IN char *key,OUT sint16 &value, IN char *section=NULL) const; - - // Enumerate through the config lines - bit8 enumerate(int &index, int &offset, Wstring &key, Wstring &value, IN char *section=NULL) const; - - // Manual update of config file - bit8 setString(IN Wstring &key,IN Wstring &value, IN char *section=NULL); - bit8 setString(IN char *key,IN Wstring &value, IN char *section=NULL); - bit8 setInt(IN Wstring &key,IN sint32 &value, IN char *section=NULL); - bit8 setInt(IN char *key,IN sint32 &value, IN char *section=NULL); - bit8 removeEntry(IN Wstring &key, IN char *section=NULL); - bit8 removeEntry(IN char *key, IN char *section=NULL); - bit8 writeFile(FILE *config); // Does not preserve comments, etc - - ArrayList sectionList; // stores the names of all sections - - private: - Dictionary Dictionary_; // stores the mappings from keys - // to value strings - - // The lock is only needed around the immediate access to the dictionary, no writes - // are allowed so you don't need to worry about an outer lock around the enumerate - CritSec Critsec_; // lock around dictionary -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/critsec.cpp b/Generals/Code/Tools/mangler/wlib/critsec.cpp deleted file mode 100644 index 21b8ced2b79..00000000000 --- a/Generals/Code/Tools/mangler/wlib/critsec.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#include "critsec.h" -#include -#include "wlib/wdebug.h" - - - -CritSec::CritSec() -{ -#ifdef _UNIX - pthread_mutex_init(&Mutex_, NULL); - RefCount_ = 0; -#elif defined(_WIN32) - InitializeCriticalSection(&CritSec_); -#endif -} - -CritSec::~CritSec() -{ - #ifdef _UNIX - pthread_mutex_destroy(&Mutex_); - #elif defined(_WIN32) - DeleteCriticalSection(&CritSec_); - #endif -} - -// The "lock" function blocks until the mutex is available. -// Returns 0 on success, error code on error. -// -// A thread that already has a lock will increment a reference count if it calls -// lock again. It must then call unlock() enough times to get the reference to 0. -// -// If refcount is not null you can get the current ref counter after the lock. -// -sint32 CritSec::lock(int *refcount) RO -{ - #ifdef _UNIX - sint32 status; - - // I TRY to get the lock. IF I succeed, OR if I fail because - // I already have the lock, I just increment the reference - // count and return. - if (((status = pthread_mutex_trylock(&Mutex_)) == 0) || - ((status == EBUSY) && (ThreadId_ == pthread_self()))) - { - ThreadId_ = pthread_self(); - RefCount_++; - if (refcount) - *refcount=RefCount_; - return(0); - } - - // Otherwise, I wait for the lock. - if ((status = pthread_mutex_lock(&Mutex_)) == 0) - { - assert(RefCount_ == 0); - ThreadId_ = pthread_self(); - RefCount_++; - } - else - { - ERRMSG("pthread_mutex_lock: " << strerror(errno)); - } - - if (refcount) - *refcount=RefCount_; - - return(status); - #elif defined(_WIN32) - // TOFIX update the refcount - EnterCriticalSection(&CritSec_); - return(0); - #else - #error Must define either _WIN32 or _UNIX - #endif -} - -// The "unlock" function release the critical section. -sint32 CritSec::unlock(void) RO -{ - #ifdef _UNIX - sint32 status = 0; - - assert(RefCount_ >= 0); - if (RefCount_ <= 0) - { - //ERRMSG("unlocking unlocked mutex!"); - return(-1); - } - - ///assert(ThreadId_ == pthread_self()); - if (ThreadId_ != pthread_self()) - { - WRNMSG("tried to unlock a mutex not owned by self"); - return(-1); - } - - if (--RefCount_ == 0) - { - // Set thread id to zero -- we're going to release mutex - ThreadId_ = (pthread_t)0; - - // Unlock the mutex. - if ((status = pthread_mutex_unlock(&Mutex_)) != 0) - ERRMSG("pthread_mutex_lock: " << strerror(errno)); - } - return status; - #elif defined(_WIN32) - LeaveCriticalSection(&CritSec_); - return(0); - #endif -} diff --git a/Generals/Code/Tools/mangler/wlib/critsec.h b/Generals/Code/Tools/mangler/wlib/critsec.h deleted file mode 100644 index c25759cf047..00000000000 --- a/Generals/Code/Tools/mangler/wlib/critsec.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef CRITSEC_HEADER -#define CRITSEC_HEADER - -#include "wstypes.h" -#ifdef _WIN32 - #include - #include -#elif defined(_UNIX) - #include - #include -#endif - -// Windows headers have a tendency to redefine IN -#ifdef IN -#undef IN -#endif -#define IN const - -// -// Critical Section built either on a POSIX Mutex, or a Win32 Critical Section -// -// POSIX version is done by keeping a thread_id and a reference count. Win32 version -// just calls the built in functions. -// -class CritSec -{ - public: - CritSec(); - ~CritSec(); - - sint32 lock(int *refcount=NULL) RO; - sint32 unlock(void) RO; - - protected: - #ifdef _WIN32 - mutable CRITICAL_SECTION CritSec_; - #else - mutable pthread_mutex_t Mutex_; // Mutex lock - mutable pthread_t ThreadId_; // Owner of mutex - mutable int RefCount_; // Reference count - #endif -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/dictionary.h b/Generals/Code/Tools/mangler/wlib/dictionary.h deleted file mode 100644 index 56e1cc346b4..00000000000 --- a/Generals/Code/Tools/mangler/wlib/dictionary.h +++ /dev/null @@ -1,681 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -* C O N F I D E N T I A L --- W E S T W O O D S T U D I O S * -****************************************************************************** -Project Name: Carpenter (The RedAlert ladder creator) -File Name : dictionary.h -Author : Neal Kettler -Start Date : June 1, 1997 -Last Update : June 17, 1997 - -This template file implements a hash dictionary. A hash dictionary is -used to quickly match a value with a key. This works well for very -large sets of data. A table is constructed that has some power of two -number of pointers in it. Any value to be put in the table has a hashing -function applied to the key. That key/value pair is then put in the -linked list at the slot the hashing function specifies. If everything -is working well, this is much faster than a linked list, but only if -your hashing function is good. -\****************************************************************************/ - - -#ifndef DICTIONARY_HEADER -#define DICTIONARY_HEADER - - -#include -#include -#include -#include -#include - -#include "wstypes.h" - -// Every entry in the hash dictionary must be an instance of the DNode -// template. 'K' and 'V' denote Key and Value. -template -class DNode -{ - public: - K key; - V value; - DNode *hashNext; -}; - -template -class Dictionary -{ - public: - ////////////////Dictionary(uint32 (* hashFn)(K &key)); - - -// Note: I had to put this inside the class definition because VC5 sucks butt - -//Create the empty hash dictionary -Dictionary(uint32 (*hashFn)(const K &key)) : - SHRINK_THRESHOLD(0.20), // When table is only 20% full shrink it - EXPAND_THRESHOLD(0.80), // When table is 80% full grow it - MIN_TABLE_SIZE(128) // must be a power of 2 -{ - log2Size=MIN_TABLE_SIZE; - size=MIN_TABLE_SIZE; - assert(size>=4); - tableBits=0; - while(log2Size) { tableBits++; log2Size>>=1; } - tableBits--; - size=1< **)new DNode* [size]; - assert(table!=NULL); - - memset((void *)table,0,size*sizeof(void *)); - hashFunc=hashFn; -} - - - ~Dictionary(); - - void clear(void); - bit8 add(IN K &key,IN V &value); - bool getValue(IN K &key, OUT V &value) RO; - bool getPointer(IN K &key, OUT V **value) RO; // ptr to internal storage (Careful!) - void print(FILE *out) RO; - uint32 getSize(void) RO; - uint32 getEntries(void) RO; - bit8 contains(IN K &key) RO; - bit8 updateValue(IN K &key,IN V &value); - bit8 remove(IN K &key,OUT V &value); - bit8 remove(IN K &key); - bit8 removeAny(OUT K &key,OUT V &value); - bit8 iterate(INOUT int &index,INOUT int &offset, OUT V &value) RO; - bit8 iterate(INOUT int &index,INOUT int &offset, OUT K &key, OUT V &value) RO; - Dictionary &operator=(Dictionary &other); - - private: - void shrink(void); // halve the number of slots - void expand(void); // double the number of slots - - - DNode **table; // This stores the lists at each slot - - uint32 entries; // number of entries - uint32 size; // size of table - uint32 tableBits; // table is 2^tableBits big - uint32 log2Size; // Junk variable - bit8 keepSize; // If true don't shrink or expand - - uint32 (* hashFunc)(IN K &key); // User provided hash function - uint32 keyHash(IN K &key) RO; // This will reduce to correct range - - - // See initilizer list of constructor for values - const double SHRINK_THRESHOLD; // When table is this % full shrink it - const double EXPAND_THRESHOLD; // When table is this % full grow it - const int MIN_TABLE_SIZE; // must be a power of 2 -}; - - - -//Free all the memory... -template -Dictionary::~Dictionary() -{ - clear(); // Remove the entries - delete[](table); // And the table as well -} - -// Remove all the entries and free the memory -template -void Dictionary::clear() -{ - DNode *temp,*del; - uint32 i; - //free all the data - for (i=0; ihashNext; - delete(del); - } - table[i]=NULL; - } - entries=0; - - while ((getSize()>(uint32)MIN_TABLE_SIZE)&&(keepSize==FALSE)) - shrink(); -} - -template -uint32 Dictionary::keyHash(IN K &key) RO -{ - uint32 retval=hashFunc(key); - retval &= ((1< -void Dictionary::print(FILE *out) RO -{ - DNode *temp; - uint32 i; - - fprintf(out,"--------------------\n"); - for (i=0; ihashNext; - } - fprintf(out,"\n"); - } - fprintf(out,"--------------------\n"); -} - - -template -Dictionary &Dictionary::operator=(Dictionary &other) -{ - _ASSERTE(0); -} - - - -// -// Iterate through all the records. Index is for the table, offset specifies the -// element in the linked list. Set both to 0 and continue calling till false -// is returned. -template -bit8 Dictionary::iterate(INOUT int &index,INOUT int &offset, - OUT V &value) RO -{ - DNode *temp; - - // index out of range - if ((index<0)||(index >= (int)getSize())) - return(FALSE); - - temp=table[index]; - while ((temp==NULL)&&((++index) < (int)getSize())) - { - temp=table[index]; - offset=0; - } - - if (temp==NULL) // no more slots with data - return(FALSE); - - uint32 i=0; - while ((temp!=NULL) && ((int)i < offset)) - { - temp=temp->hashNext; - i++; - } - - if (temp==NULL) // should never happen - return(FALSE); - - value=temp->value; - if (temp->hashNext==NULL) - { - index++; - offset=0; - } - else - offset++; - - return(TRUE); -} - - - - -// -// Iterate through all the records. Index is for the table, offset specifies the -// element in the linked list. Set both to 0 and continue calling till false -// is returned. -template -bit8 Dictionary::iterate(INOUT int &index,INOUT int &offset, - OUT K &key, OUT V &value) RO -{ - DNode *temp; - - // index out of range - if ((index<0)||(index >= (int)getSize())) - return(FALSE); - - temp=table[index]; - while ((temp==NULL)&&((++index) < (int)getSize())) - { - temp=table[index]; - offset=0; - } - - if (temp==NULL) // no more slots with data - return(FALSE); - - uint32 i=0; - while ((temp!=NULL) && ((int)i < offset)) - { - temp=temp->hashNext; - i++; - } - - if (temp==NULL) // should never happen - return(FALSE); - - value=temp->value; - key=temp->key; - if (temp->hashNext==NULL) - { - index++; - offset=0; - } - else - offset++; - - return(TRUE); -} - - - - -// Return the current size of the hash table -template -uint32 Dictionary::getSize(void) RO -{ return(size); } - - -// Return the current number of entries in the table -template -uint32 Dictionary::getEntries(void) RO -{ return(entries); } - - -// Does the Dictionary contain the key? -template -bit8 Dictionary::contains(IN K &key) RO -{ - int offset; - DNode *node; - - offset=keyHash(key); - - node=table[offset]; - - if (node==NULL) - { return(FALSE); } // can't find it - - while(node!=NULL) - { - if ((node->key)==key) - { return(TRUE); } - node=node->hashNext; - } - return(FALSE); -} - - -// Try and update the value of an already existing object -template -bit8 Dictionary::updateValue(IN K &key,IN V &value) -{ - sint32 retval; - - retval=remove(key); - if (retval==FALSE) - return(FALSE); - - add(key,value); - return(TRUE); -} - - -// Add to the dictionary (if key exists, value is updated with the new V) -template -bit8 Dictionary::add(IN K &key,IN V &value) -{ - int offset; - DNode *node,*item,*temp; - float percent; - - item=(DNode *)new DNode; - assert(item!=NULL); - - #ifdef KEY_MEM_OPS - memcpy(&(item->key),&key,sizeof(K)); - #else - item->key=key; - #endif - - #ifdef VALUE_MEM_OPS - memcpy(&(item->value),&value,sizeof(V)); - #else - item->value=value; - #endif - - item->hashNext=NULL; - - //If key already exists, it will be overwritten - remove(key); // Hopefully this will be false... - - offset=keyHash(key); - - node=table[offset]; - - if (node==NULL) - { table[offset]=item; } - else - { - temp=table[offset]; - table[offset]=item; - item->hashNext=temp; - } - - entries++; - percent=(float)entries; - percent/=(float)getSize(); - if (percent>= EXPAND_THRESHOLD ) expand(); - - return(TRUE); -} - -// Remove an item from the dictionary -template -bit8 Dictionary::remove(IN K &key,OUT V &value) -{ - int offset; - DNode *node,*last,*temp; - float percent; - - if (entries==0) - return(FALSE); - - percent=(float)(entries-1); - percent/=(float)getSize(); - - offset=keyHash(key); - node=table[offset]; - - last=node; - if (node==NULL) - return(FALSE); - - //special case table points to thing to delete - - #ifdef KEY_MEM_OPS - if (0==memcmp(&(node->key),&key,sizeof(K))) - #else - if ((node->key)==key) - #endif - { - #ifdef VALUE_MEM_OPS - memcpy(&value,&(node->value),sizeof(V)); - #else - value=node->value; - #endif - temp=table[offset]->hashNext; - delete(table[offset]); - table[offset]=temp; - entries--; - if (percent <= SHRINK_THRESHOLD) - shrink(); - return(TRUE); - } - node=node->hashNext; - - bit8 retval=FALSE; // wow, didn't add this for years... (DOH!) - - //Now the case if the thing to delete is not the first - while (node!=NULL) - { - #ifdef KEY_MEM_OPS - if (0==memcmp(&(node->key),&key,sizeof(K))) - #else - if (node->key==key) - #endif - { - #ifdef VALUE_MEM_OPS - memcpy(&value,&(node->value),sizeof(V)); - #else - value=node->value; - #endif - last->hashNext=node->hashNext; - entries--; - delete(node); - retval=TRUE; // yes, we deleted something - break; - } - last=node; - node=node->hashNext; - } - - if (percent <= SHRINK_THRESHOLD) - shrink(); - return(retval); -} - - -template -bit8 Dictionary::remove(IN K &key) -{ - V temp; - return(remove(key,temp)); -} - - -// Remove some random K/V pair that's in the Dictionary -template -bit8 Dictionary::removeAny(OUT K &key,OUT V &value) -{ - int offset; - DNode *node,*last,*temp; - float percent; - - if (entries==0) - return(FALSE); - - percent=(entries-1); - percent/=(float)getSize(); - - int i; - offset=-1; - for (i=0; i<(int)getSize(); i++) - if (table[i]!=NULL) - { - offset=i; - break; - } - - if (offset==-1) // Nothing there - return(FALSE); - - node=table[offset]; - last=node; - - #ifdef KEY_MEM_OPS - memcpy(&key,&(node->key),sizeof(K)); - #else - key=node->key; - #endif - #ifdef VALUE_MEM_OPS - memcpy(&value,&(node->value),sizeof(V)); - #else - value=node->value; - #endif - - temp=table[offset]->hashNext; - delete(table[offset]); - table[offset]=temp; - entries--; - if (percent <= SHRINK_THRESHOLD) - shrink(); - return(TRUE); -} - - -template -bool Dictionary::getValue(IN K &key,OUT V &value) RO -{ - V *valptr=NULL; - bool retval=getPointer(key,&valptr); - if (retval && valptr) - { - #ifdef VALUE_MEM_OPS - assert(0); - #else - value=*valptr; - #endif - } - return(retval); -} - -// Try and avoid this since you're getting a pointer to the internally -// managed data! -template -bool Dictionary::getPointer(IN K &key,OUT V **valptr) RO -{ - int offset; - DNode *node; - - if (entries==0) - return(FALSE); - - offset=keyHash(key); - - node=table[offset]; - - if (node==NULL) - return(FALSE); - - #ifdef KEY_MEM_OPS - while ((node!=NULL)&&(memcmp(&(node->key),&key,sizeof(K)))) - #else - while ((node!=NULL)&&( ! ((node->key)==key)) ) // odd syntax so you don't - #endif // have to do oper != - { node=node->hashNext; } - - if (node==NULL) - { return(FALSE); } - - *valptr=&(node->value); - - return(TRUE); -} - - -//A note about Shrink and Expand: They are never necessary, they are -//only here to improve performance of the hash table by reducing -//the length of the linked list at each table entry. - -// Shrink the hash table by a factor of 2 (and relocate entries) -template -void Dictionary::shrink(void) -{ - int i; - int oldsize; - uint32 offset; - DNode **oldtable,*temp,*first,*next; - - if ((size<=(uint32)MIN_TABLE_SIZE)||(keepSize==TRUE)) - return; - - //fprintf(stderr,"Shrinking....\n"); - - oldtable=table; - oldsize=size; - size/=2; - tableBits--; - - table=(DNode **)new DNode*[size]; - assert(table!=NULL); - memset((void *)table,0,size*sizeof(void *)); - - for (i=0; ikey); - first=table[offset]; - table[offset]=temp; - next=temp->hashNext; - temp->hashNext=first; - temp=next; - } - } - delete[](oldtable); -} - - -template -void Dictionary::expand(void) -{ - int i; - int oldsize; - uint32 offset; - DNode **oldtable,*temp,*first,*next; - - if (keepSize==TRUE) - return; - - //fprintf(stderr,"Expanding...\n"); - - oldtable=table; - oldsize=size; - size*=2; - tableBits++; - - table=(DNode **)new DNode* [size]; - assert(table!=NULL); - memset((void *)table,0,size*sizeof(void *)); - - for (i=0; ikey); - first=table[offset]; - table[offset]=temp; - next=temp->hashNext; - temp->hashNext=first; - temp=next; - } - } - delete[](oldtable); -} - - -#endif - diff --git a/Generals/Code/Tools/mangler/wlib/filed.h b/Generals/Code/Tools/mangler/wlib/filed.h deleted file mode 100644 index ac68d7c7054..00000000000 --- a/Generals/Code/Tools/mangler/wlib/filed.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef FILED_HEADER -#define FILED_HEADER - -#include "odevice.h" - -class FileD : public OutputDevice -{ - public: - FileD(IN char *filename, IN char *mode = "w") - { - out=fopen(filename,mode); - if (out==NULL) - out=fopen("FileDev.out",mode); - } - - virtual ~FileD() - { fclose(out); } - - virtual int print(const char *str,int len) - { - char *string=new char[len+1]; - memset(string,0,len+1); - memcpy(string,str,len); - fprintf(out,"%s",string); - delete[](string); - fflush(out); - return(len); - } - - FILE *out; -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/linkedlist.h b/Generals/Code/Tools/mangler/wlib/linkedlist.h deleted file mode 100644 index d546d3e96c6..00000000000 --- a/Generals/Code/Tools/mangler/wlib/linkedlist.h +++ /dev/null @@ -1,495 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -* C O N F I D E N T I A L --- W E S T W O O D S T U D I O S * -****************************************************************************** -Project Name: -File Name : linkedlist.h -Author : Neal Kettler -Start Date : June 19, 1997 -Last Update : June 19, 1997 - -Linked list template. This is a fairly standard doubly linked list that -allows insertion and removal at any point in the list. A current pointer -is used to quickly access items when they are examined sequentially. -Copies of the data are stored instead of a pointer to the original. - -If you want to store pointers then the template should be of a pointer type. -\****************************************************************************/ - -#ifndef LINKEDLIST_HEADER -#define LINKEDLIST_HEADER - -#include -#include -#include -#include - -#include "wstypes.h" - -template -class LNode -{ - public: - T Node; - LNode *Next; - LNode *Prev; -}; - -template -class LinkedList -{ - public: - LinkedList(); - LinkedList(LinkedList &other); - ~LinkedList(); - - // Remove all entries from the lsit - void clear(void); - - // Add a node after the zero based 'pos' - bit8 add(IN T &node,sint32 pos, OUT T **newnodeptr=NULL); - bit8 addTail(IN T &node, OUT T **newnodeptr=NULL); - bit8 addHead(IN T &node, OUT T **newnodeptr=NULL); - - // Remove a node - bit8 remove(OUT T &node,sint32 pos); - bit8 remove(sint32 pos); - bit8 removeHead(OUT T &node); - bit8 removeTail(OUT T &node); - - - // Get a node without removing from the list - bit8 get(OUT T &node,sint32 pos); - bit8 getHead(OUT T &node); - bit8 getTail(OUT T &node); - - // Get a pointer to the internally managed data (careful!) - bit8 getPointer(OUT T **node, sint32 pos); - - // Get the number of entries in the list - sint32 length(void); - - // Print information on the list - void print(IN FILE *out); - - // assignment operator - LinkedList &operator=(LinkedList &other); - - private: - sint32 Entries; // Number of entries - LNode *Head; // Head of the list - LNode *Tail; // Tail of the list - - LNode *Current; // Current pointer & index for speed only - sint32 CurIndex; -}; - - -//Create the empty list -template -LinkedList::LinkedList() -{ - Entries=0; - Head=Tail=Current=NULL; - CurIndex=-1; // Not valid when 0 entries -} - -// copy constructor -template -LinkedList::LinkedList(LinkedList &other) -{ - Entries=0; - Head=Tail=Current=NULL; - CurIndex=-1; // Not valid when 0 entries - (*this)=other; -} - -//Free all the memory... -template -LinkedList::~LinkedList() -{ - clear(); // Remove the entries -} - -// assignment operator -template -LinkedList &LinkedList::operator=(LinkedList &other) -{ - T node; - clear(); - for (int i=0; i -void LinkedList::clear() -{ - LNode *temp,*del; - - temp=Head; - while (temp) { - del=temp; - temp=temp->Next; - delete(del); - } - Entries=0; - CurIndex=-1; - Head=Tail=Current=NULL; -} - -// When adding into a position, the new node goes at the zero based slot -// specified by pos. All other nodes get moved one slot down. -template -bit8 LinkedList::add(IN T &node,sint32 pos, OUT T **newnodeptr) -{ - LNode *temp; - LNode *item; - - if (pos<0) - pos=0; - if (pos>Entries) - pos=Entries; - - item=(LNode *)new LNode; - assert(item!=NULL); - item->Node=node; // copy the passed in object - item->Prev=NULL; - item->Next=NULL; - - if (newnodeptr) - *newnodeptr=&(item->Node); - - if ((pos==0)||(pos==Entries)) { // Both cases can be true for a new list! - if (pos==0) { - item->Next=Head; - if (Head) - Head->Prev=item; - Head=item; - } - if (pos==Entries) { - item->Prev=Tail; - if (Tail) - Tail->Next=item; - Tail=item; - } - Entries++; - Current=item; - CurIndex=pos; - return(TRUE); - } - - // If control is here, we know the new node is not an endpoint - - // Check for possible speedup, so we don't have to scan the list - if (pos==CurIndex) { - item->Next=Current; - item->Prev=Current->Prev; - Current->Prev=item; - item->Prev->Next=item; - Current=item; - Entries++; - return(TRUE); - } - // Check the other possible speedup (adding after CurIndex) - if (pos==CurIndex+1) { - item->Next=Current->Next; - item->Prev=Current; - Current->Next=item; - item->Next->Prev=item; - Current=item; - CurIndex++; - Entries++; - return(TRUE); - } - - // If control reaches here we have to scan the whole thing - temp=Head->Next; // Can start at node '1' because head was special cased - for (int i=1; iNext; - assert(temp!=NULL); - } - item->Next=temp; - item->Prev=temp->Prev; - temp->Prev=item; - item->Prev->Next=item; - Current=item; - CurIndex=pos; - Entries++; - - return(TRUE); -} - - -// Add to the first node, all others get shifted down one slot -template -bit8 LinkedList::addHead(IN T &node, OUT T **newnodeptr) -{ - return(add(node,0,newnodeptr)); -} - - -// Append to the end of the list -template -bit8 LinkedList::addTail(IN T &node, OUT T **newnodeptr) -{ - return(add(node,length(),newnodeptr)); -} - - -// Remove at the zero based index specified by 'pos'. When removing from -// a slot, all others get shifted up by one. -template -bit8 LinkedList::remove(OUT T &node, sint32 pos) -{ - ////////LNode *temp; - LNode *item; - - if (Entries==0) - return(FALSE); - - if (pos<0) - pos=0; - if (pos>=Entries) - pos=Entries-1; - - if ((pos==0)||(pos==Entries-1)) { // Both can be true for a 1 item list - if (pos==0) { - item=Head; - if (item->Next) - item->Next->Prev=NULL; - Head=item->Next; - node=item->Node; - Current=Head; - CurIndex=0; - } - if (pos==Entries-1) { - item=Tail; - if (item->Prev) - item->Prev->Next=NULL; - Tail=item->Prev; - node=item->Node; - Current=Tail; - CurIndex=Entries-2; - } - delete(item); - Entries--; - - if (Entries==0) { // Super paranoia check - assert(Current==NULL); - assert(CurIndex==-1); - assert(Head==NULL); - assert(Tail==NULL); - } - return(TRUE); - } - // If control is here, we know the target node is not an endpoint - - // Check for possible speedup, so we don't have to scan the list - if (pos==CurIndex) { - item=Current; - item->Prev->Next=item->Next; - item->Next->Prev=item->Prev; - Current=item->Next; - // CurIndex stays the same - node=item->Node; - delete(item); - Entries--; - return(TRUE); - } - - // Check the other possible speedup (removing after CurIndex) - if (pos==CurIndex+1) { - item=Current->Next; - item->Prev->Next=item->Next; - item->Next->Prev=item->Prev; - Current=item->Next; - CurIndex++; - node=item->Node; - delete(item); - Entries--; - return(TRUE); - } - - - // If control reaches here we have to scan the whole thing - item=Head->Next; // Can start at node '1' because head was special cased - for (int i=1; iNext; - assert(item!=NULL); - } - - item->Prev->Next=item->Next; - item->Next->Prev=item->Prev; - Current=item->Next; - CurIndex=pos; - node=item->Node; - delete(item); - Entries--; - - return(TRUE); -} - - - - -// Remove at the zero based index specified by 'pos'. When removing from -// a slot, all others get shifted up by one. -template -bit8 LinkedList::remove(sint32 pos) -{ - T temp_node; - return(remove(temp_node,pos)); -} - - -// Remove the first node of the list -template -bit8 LinkedList::removeHead(OUT T &node) -{ - return(remove(node,0)); -} - - -// Remove the last node of the list -template -bit8 LinkedList::removeTail(OUT T &node) -{ - return(remove(node,Entries-1)); -} - - - -template -bit8 LinkedList::get(OUT T &node, sint32 pos) -{ - T *objptr; - bool retval=getPointer(&objptr,pos); - if (retval && objptr) - node=*objptr; - - return(retval); -} - - -template -bit8 LinkedList::getPointer(OUT T **node,sint32 pos) -{ - if ((node==0)||(Entries==0)) - return(FALSE); - - LNode *item; - - if (pos<0) - { - //pos=0; - return(FALSE); - } - if (pos>=Entries) - { - //pos=Entries-1; - return(FALSE); - } - - if (pos==0) { - *node=&(Head->Node); - return(TRUE); - } else if (pos==Entries-1) { - *node=&(Tail->Node); - return(TRUE); - } - // If control reaches here, we know target is not an endpoint - - // Check for possible speedup, so we don't have to scan the list - if (pos==CurIndex) { - *node=&(Current->Node); - return(TRUE); - } else if (pos==CurIndex+1) { - *node=&(Current->Next->Node); - CurIndex++; - Current=Current->Next; - return(TRUE); - } else if (pos==CurIndex-1) { - *node=&(Current->Prev->Node); - CurIndex--; - Current=Current->Prev; - return(TRUE); - } - - // If control reaches here we have to scan the whole thing - item=Head->Next; // Can start at node '1' because head was special cased - for (int i=1; iNext; - assert(item!=NULL); - } - *node=&(item->Node); - CurIndex=pos; - Current=item; - - return(TRUE); -} - - -// Remove the first node of the list -template -bit8 LinkedList::getHead(OUT T &node) -{ - return(get(node,0)); -} - - -// Remove the last node of the list -template -bit8 LinkedList::getTail(OUT T &node) -{ - return(get(node,Entries-1)); -} - - -template -void LinkedList::print(IN FILE *out) -{ - LNode *temp; - - fprintf(out,"--------------------\n"); - fprintf(out,"Entries = %d\n",length()); - fprintf(out,"H = %8p C = %8p (%d) T = %8p\n",Head,Current,CurIndex,Tail); - - temp=Head; - while (temp) { - fprintf(out," %8p<-((%8p))->%8p \n",temp->Prev,temp,temp->Next); - temp=temp->Next; - } - - fprintf(out,"--------------------\n"); -} - -// Return the current length of the list -template -sint32 LinkedList::length(void) { - return(Entries); -} - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/mboxd.h b/Generals/Code/Tools/mangler/wlib/mboxd.h deleted file mode 100644 index 4bd1e7f1214..00000000000 --- a/Generals/Code/Tools/mangler/wlib/mboxd.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef MBOXD_HEADER -#define MBOXD_HEADER - -#include "odevice.h" - -class MboxD : public OutputDevice -{ - public: - - virtual int print(const char *str,int len) - { - char *string=new char[len+1]; - memset(string,0,len+1); - memcpy(string,str,len); - MessageBox(NULL,string,"Debug Message", MB_OK | MB_ICONINFORMATION); - delete[](string); - return(len); - } - -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/monod.cpp b/Generals/Code/Tools/mangler/wlib/monod.cpp deleted file mode 100644 index 5448e627f15..00000000000 --- a/Generals/Code/Tools/mangler/wlib/monod.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#include "monod.h" - -MonoD::MonoD(void) -{ -#ifdef _WIN32 - unsigned long retval; - handle = CreateFile("\\\\.\\MONO", GENERIC_READ|GENERIC_WRITE, 0, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - if (handle != INVALID_HANDLE_VALUE) - { - DeviceIoControl(handle, (DWORD)IOCTL_MONO_CLEAR_SCREEN, NULL, 0, NULL, 0, - &retval,0); - } -#endif -} - -MonoD::~MonoD() -{ - #ifdef _WIN32 - CloseHandle(handle); - handle=NULL; - #endif -} - -int MonoD::print(const char *str, int len) -{ - #ifdef _WIN32 - unsigned long retval; - WriteFile(handle, str, len, &retval, NULL); - ////DeviceIoControl(handle, (DWORD)IOCTL_MONO_PRINT_RAW, (void *)str, len, NULL, 0, - //// &retval,0); - return(len); - #else - for (int i=0; i. -*/ - -#ifndef MONOD_HEADER -#define MONOD_HEADER - - -#include -#include -#include "odevice.h" - -///////////////////////// WIN32 ONLY /////////////////////////////////// - -#ifdef _WIN32 -#include -#include - - -/* -** This is the identifier for the Monochrome Display Driver -*/ -#define FILE_DEVICE_MONO 0x00008000 - -/* -** These are the IOCTL commands supported by the Monochrome Display Driver. -*/ -#define IOCTL_MONO_HELP_SCREEN CTL_CODE(FILE_DEVICE_MONO, 0x800, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_CLEAR_SCREEN CTL_CODE(FILE_DEVICE_MONO, 0x801, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_PRINT_RAW CTL_CODE(FILE_DEVICE_MONO, 0x802, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_SET_CURSOR CTL_CODE(FILE_DEVICE_MONO, 0x803, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_SCROLL CTL_CODE(FILE_DEVICE_MONO, 0x804, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_BRING_TO_TOP CTL_CODE(FILE_DEVICE_MONO, 0x805, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_SET_ATTRIBUTE CTL_CODE(FILE_DEVICE_MONO, 0x806, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_PAN CTL_CODE(FILE_DEVICE_MONO, 0x807, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_LOCK CTL_CODE(FILE_DEVICE_MONO, 0x808, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_UNLOCK CTL_CODE(FILE_DEVICE_MONO, 0x809, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_SET_WINDOW CTL_CODE(FILE_DEVICE_MONO, 0x80A, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_RESET_WINDOW CTL_CODE(FILE_DEVICE_MONO, 0x80B, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_SET_FLAG CTL_CODE(FILE_DEVICE_MONO, 0x80C, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_CLEAR_FLAG CTL_CODE(FILE_DEVICE_MONO, 0x80D, METHOD_BUFFERED, FILE_WRITE_DATA) -#define IOCTL_MONO_FILL_ATTRIB CTL_CODE(FILE_DEVICE_MONO, 0x80E, METHOD_BUFFERED, FILE_WRITE_DATA) - -#endif // ifdef _WIN32 - -class MonoD : public OutputDevice -{ - public: - MonoD(); - ~MonoD(); - - virtual int print(const char *str,int len); - - private: - #ifdef _WIN32 - HANDLE handle; - #endif -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/odevice.h b/Generals/Code/Tools/mangler/wlib/odevice.h deleted file mode 100644 index f04bffaec12..00000000000 --- a/Generals/Code/Tools/mangler/wlib/odevice.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef ODEVICE_HEADER -#define ODEVICE_HEADER - -// This virtual base class provides an interface for output devices -// that can be used for the debugging package. -class OutputDevice -{ - public: - OutputDevice() {} - virtual ~OutputDevice() {}; - virtual int print(const char *s,int len)=0; -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/sem4.cpp b/Generals/Code/Tools/mangler/wlib/sem4.cpp deleted file mode 100644 index 9c7f7e42a1c..00000000000 --- a/Generals/Code/Tools/mangler/wlib/sem4.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/******************************************************************************\ -sem4.cpp Neal Kettler - -Simple Posix semaphore class -This is useful because the constructor will automatically call sem_init - and you don't have to worry about it. It also allows for other semaphore - libraries if you don't have posix. -\******************************************************************************/ - -#include "sem4.h" - -#ifdef _REENTRANT - -Sem4::Sem4() -{ -#ifndef _WINDOWS - sem_init(&sem,1,1); -#else - sem = CreateSemaphore(NULL, 1, 1, NULL); -#endif -} - -Sem4::Sem4(uint32 value) -{ -#ifndef _WINDOWS - sem_init(&sem,1,value); -#else - sem = CreateSemaphore(NULL, value, value, NULL); -#endif -} - -Sem4::~Sem4() -{ -#ifndef _WINDOWS - sem_destroy(&sem); -#else - if (sem) CloseHandle(sem); -#endif -} - -sint32 Sem4::Wait(void) const -{ -#ifndef _WINDOWS - return(sem_wait((sem_t *)&sem)); -#else - if (!sem) - return -1; // no semaphore! - - DWORD dwWaitResult = WaitForSingleObject(sem, INFINITE); - switch (dwWaitResult) { - case WAIT_OBJECT_0: // The semaphore object was signaled. - return 0; - break; - case WAIT_TIMEOUT: // Should not happen ;) - return -1; - break; - } - return -1; -#endif -} - -sint32 Sem4::Post(void) const -{ -#ifndef _WINDOWS - return(sem_post((sem_t *)&sem)); -#else - if (!sem) - return -1; - if (!ReleaseSemaphore(sem, 1 ,NULL)) - return -1; - return 0; -#endif -} - -sint32 Sem4::TryWait(void) const -{ -#ifndef _WINDOWS - return(sem_trywait((sem_t *)&sem)); -#else - if (!sem) - return -1; - DWORD dwWaitResult = WaitForSingleObject(sem, 0L); - switch (dwWaitResult) { - case WAIT_OBJECT_0: // The semaphore object was signaled. - return 0; - break; - case WAIT_TIMEOUT: - return -1; - break; - } - return -1; -#endif -} - -sint32 Sem4::GetValue(int *sval) const -{ -#ifndef _WINDOWS - return(sem_getvalue((sem_t *)&sem,sval)); -#else - if (!sem) - return -1; - long prev; - if (!ReleaseSemaphore(sem, 0, &prev)) - return -1; - if (sval) - *sval = prev; - return 0; -#endif -} - -sint32 Sem4::Destroy(void) -{ -#ifndef _WINDOWS - return(sem_destroy(&sem)); -#else - return CloseHandle(sem); -#endif -} - -#else - -/**************************************************************************** -non threaded versions that do nothing -*****************************************************************************/ - -Sem4::Sem4() -{ -} - -Sem4::Sem4(uint32) -{ -} - -Sem4::~Sem4() -{ -} - -sint32 Sem4::Wait(void) const -{ - return(0); -} - -sint32 Sem4::Post(void) const -{ - return(0); -} - -sint32 Sem4::TryWait(void) const -{ - return(0); -} - -sint32 Sem4::GetValue(int *) const -{ - return(0); -} - -sint32 Sem4::Destroy(void) -{ - return(0); -} - -#endif - diff --git a/Generals/Code/Tools/mangler/wlib/sem4.h b/Generals/Code/Tools/mangler/wlib/sem4.h deleted file mode 100644 index c96f2f7b786..00000000000 --- a/Generals/Code/Tools/mangler/wlib/sem4.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef SEM4_HEADER -#define SEM4_HEADER - -#include -#ifndef _WINDOWS -#include -#endif -#include "wstypes.h" - -#ifdef _REENTRANT -#ifndef _WINDOWS -#include -#else -#include -#endif // _WINDOWS -#endif // _REENTRANT - -// Windows headers have a tendency to redefine IN -#ifdef IN -#undef IN -#endif -#define IN const - -class Sem4 -{ - private: - #ifdef _REENTRANT -#ifndef _WINDOWS - sem_t sem; -#else - HANDLE sem; -#endif - #endif - public: - Sem4(); - Sem4(uint32 value); - ~Sem4(); - - sint32 Wait(void) const; - sint32 TryWait(void) const; - sint32 Post(void) const; - sint32 GetValue(int *sval) const; - sint32 Destroy(void); -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/stderrd.h b/Generals/Code/Tools/mangler/wlib/stderrd.h deleted file mode 100644 index 4559bea747c..00000000000 --- a/Generals/Code/Tools/mangler/wlib/stderrd.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef STDERRD_HEADER -#define STDERRD_HEADER - -#include "odevice.h" - -class StderrD : public OutputDevice -{ - public: - - virtual int print(const char *str,int len) - { - char *string=new char[len+1]; - memset(string,0,len+1); - memcpy(string,str,len); - fprintf(stderr,"%s",string); - delete[](string); - return(len); - } -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/stdoutd.h b/Generals/Code/Tools/mangler/wlib/stdoutd.h deleted file mode 100644 index a3d20fc3c58..00000000000 --- a/Generals/Code/Tools/mangler/wlib/stdoutd.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef STDOUTD_HEADER -#define STDOUTD_HEADER - -#include "odevice.h" - -class StdoutD : public OutputDevice -{ - public: - - virtual int print(const char *str,int len) - { - char *string=new char[len+1]; - memcpy(string,str,len); - string[len]=0; - fprintf(stdout,"%s",string); - fflush(stdout); - delete[](string); - return(len); - } -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/streamer.cpp b/Generals/Code/Tools/mangler/wlib/streamer.cpp deleted file mode 100644 index b8a8eca1c1e..00000000000 --- a/Generals/Code/Tools/mangler/wlib/streamer.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#include "streamer.h" -#ifdef _WIN32 - #include -#endif - -#if defined(USING_STLPORT) || (defined(_MSC_VER) && _MSC_VER < 1300) -#define STREAMER_UNBUFFERED unbuffered() -#else -#define STREAMER_UNBUFFERED 0 -#endif - -Streamer::Streamer() : streambuf(), Output_Device(NULL), Buf(NULL) -{ -#if defined(USING_STLPORT) || (defined(_MSC_VER) && _MSC_VER < 1300) - int state=unbuffered(); - unbuffered(0); // 0 = buffered, 1 = unbuffered -#else - static_assert(STREAMER_UNBUFFERED==0, "std::streambuf is assumed to be buffered by default"); -#endif -} - -Streamer::~Streamer() -{ - ///////// calling sync seems to cause crashes here on Win32 - //sync(); - ///////// - if (Buf) - delete[] Buf; -} - -int Streamer::setOutputDevice(OutputDevice *device) -{ - Output_Device=device; - return(0); -} - - -// put n chars from string into buffer -int Streamer::xsputn(const char* buf, int size) //implementation of sputn -{ - if (size<=0) // Nothing to do - return(0); - - const unsigned char *ptr=(const unsigned char *)buf; - for (int i=0; i= epptr()) && (sync()==EOF)) - return(EOF); - else { - sputc(c); - if ((STREAMER_UNBUFFERED && c=='\n' || pptr() >= epptr()) - && sync()==EOF) { - return(EOF); - } - return(c); - } -} - -// This is a write only stream, this should never happen -int Streamer::underflow(void) -{ - return(EOF); -} - -int Streamer::doallocate() -{ - if (Buf==NULL) - { - Buf=new char[(2*STREAMER_BUFSIZ)]; // deleted by destructor - memset(Buf,0,2*STREAMER_BUFSIZ); - - // Buffer -#if defined(USING_STLPORT) || (defined(_MSC_VER) && _MSC_VER < 1300) - setb( - Buf, // base pointer - Buf+STREAMER_BUFSIZ, // ebuf pointer (end of buffer); - 0); // 0 = manual deletion of buff -#else - pubsetbuf(Buf, 2*STREAMER_BUFSIZ); -#endif - - // Get area - setg( - Buf, // eback - Buf, // gptr - Buf); // egptr - - Buf+=STREAMER_BUFSIZ; - // Put area - setp(Buf,Buf+STREAMER_BUFSIZ); - return(1); - } - else - return(0); -} - - -int Streamer::sync() -{ - if (pptr()<=pbase()) { - return(0); - } - - int wlen=pptr()-pbase(); - - if (Output_Device) - { - Output_Device->print(pbase(),wlen); - } - - if (STREAMER_UNBUFFERED) { - setp(pbase(),pbase()); - } - else { - setp(pbase(),pbase()+STREAMER_BUFSIZ); - } - return(0); -} diff --git a/Generals/Code/Tools/mangler/wlib/streamer.h b/Generals/Code/Tools/mangler/wlib/streamer.h deleted file mode 100644 index 8dce9298f98..00000000000 --- a/Generals/Code/Tools/mangler/wlib/streamer.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef STREAMER_HEADER -#define STREAMER_HEADER - -#include -#include -#include -#include -#include - -// Windows headers have a tendency to redefine IN -#ifdef IN -#undef IN -#endif -#define IN const - -#include "odevice.h" - -#ifndef STREAMER_BUFSIZ -// This limits the number of characters that can be sent to a single 'print' -// call. If your debug message is bigger than this, it will get split over -// multiple 'print' calls. That's usually not a problem. - #define STREAMER_BUFSIZ 2048 -#endif - - -// Provide a streambuf interface for a class that can 'print' -class Streamer : public streambuf -{ - public: - Streamer(); - virtual ~Streamer(); - - int setOutputDevice(OutputDevice *output_device); - - protected: - // Virtual methods from streambuf - int xsputn(const char* s, int n); // buffer some characters - int overflow(int = EOF); // flush buffer and make more room - int underflow(void); // Does nothing - int sync(); - - int doallocate(); // allocate a buffer - - - OutputDevice *Output_Device; - char* Buf; -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/syslogd.cpp b/Generals/Code/Tools/mangler/wlib/syslogd.cpp deleted file mode 100644 index 7568868b240..00000000000 --- a/Generals/Code/Tools/mangler/wlib/syslogd.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#include "syslogd.h" - -SyslogD::SyslogD(char *ident,int logopt,int facility,int _priority) -{ -#ifndef _WINDOWS - openlog(ident,logopt,facility); - priority=_priority; -#endif -} - -int SyslogD::print(const char *str, int len) -{ -#ifndef _WINDOWS - char *temp_str=new char[len+1]; - memset(temp_str,0,len+1); - strncpy(temp_str,str,len); - syslog(priority,temp_str); - delete[](temp_str); -#endif - return(len); -} diff --git a/Generals/Code/Tools/mangler/wlib/syslogd.h b/Generals/Code/Tools/mangler/wlib/syslogd.h deleted file mode 100644 index 569f2b1d5bc..00000000000 --- a/Generals/Code/Tools/mangler/wlib/syslogd.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef SYSLOGD_HEADER -#define SYSLOGD_HEADER - -#include -#include -#ifndef _WINDOWS -#include -#endif -#include - -// Windows headers have a tendency to redefine IN -#ifdef IN -#undef IN -#endif -#define IN const - -#include "odevice.h" - -// Windows doesn't have a syslog equivalent (does it?), so this class does little there -class SyslogD : public OutputDevice -{ - public: - SyslogD(char *ident,int logopt,int facility,int priority); - virtual int print(const char *str,int len); - - private: - int priority; -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/threadfac.cpp b/Generals/Code/Tools/mangler/wlib/threadfac.cpp deleted file mode 100644 index 0f42558536a..00000000000 --- a/Generals/Code/Tools/mangler/wlib/threadfac.cpp +++ /dev/null @@ -1,221 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#define THREADFAC_CODE - -#include "threadfac.h" - -int Runnable::ThreadCount_ = 0; -CritSec Runnable::CritSec_; // to protect ThreadCount_ - -// MDC: Made all this dependent on _REENTRANT being defined so VC++ doesn't complain on -// single-threaded programs... - - -// -// Note: I chose the following type signature for thread functions -// void function(void *data); -// -// -// Since Win32 & POSIX have different type signatures for the thread entry points -// an intermediate system-dependent function in this file gets called first. -// That function then calls the system independent version. So the system dependent -// version needs 2 Items 1) The address of the _real_ thread func 2) the data -// to pass. We only have 1 argument available, so you figure out the rest... -// -// This is for internal use only -// -struct ThreadInformation -{ - void *startPoint; // The address of the _real_ thread function, or class - void *data; // data to pass to real thread function or class - bit8 destroy; // only applies to classes, should delete after execution? -}; - - - -// -// Start a thread inside a class -// -bit8 ThreadFactory::startThread(Runnable &runable, void *data, bit8 destroy) -{ -#ifdef _REENTRANT - - { - Runnable::CritSec_.lock(); - Runnable::ThreadCount_++; - Runnable::CritSec_.unlock(); - } - - - ThreadInformation *tInfo=new ThreadInformation; - tInfo->startPoint=(void *)&runable; - tInfo->data=data; - tInfo->destroy=destroy; - - #ifdef _WIN32 - // Under windows call _beginthreadex instead of CreateThread so you can - // use all the normal C library stuff. (IMPORTANT!!!) - uint32 handle; - uint32 stup1d; - handle=_beginthreadex(NULL,0, threadClassLauncher, tInfo, 0, &stup1d); - if (handle!=NULL) - return(TRUE); - else - { - { - runable.CritSec_.lock(); - runable.ThreadCount_--; // Ok, so it didn't really start - runable.CritSec_.unlock(); - } - return(FALSE); - } - #else // UNIX - // Setup thread attributes for client threads - int retval; - pthread_attr_t threadAttr; - pthread_attr_init(&threadAttr); - pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED); - pthread_attr_setscope(&threadAttr,PTHREAD_SCOPE_SYSTEM); - retval=pthread_create(NULL,&threadAttr, threadClassLauncher, tInfo); - if (retval==0) - return(TRUE); - else - { - { - runable.CritSec_.lock(); - runable.ThreadCount_--; // Ok, so it didn't really start - runable.CritSec_.unlock(); - } - return(FALSE); - } - #endif -#else - return (FALSE); -#endif /* _REENTRANT */ -} - - -// -// Start a thread inside a function -// -bit8 ThreadFactory::startThread(void (*start_func)(void *), void *data) -{ -#ifdef _REENTRANT - ThreadInformation *tInfo=new ThreadInformation; - tInfo->startPoint=start_func; - tInfo->data=data; - - #ifdef _WIN32 - // Under windows call _beginthreadex instead of CreateThread so you can - // use all the normal C library stuff. (IMPORTANT!!!) - uint32 handle; - unsigned temp; - handle=_beginthreadex(NULL,0, threadFuncLauncher, tInfo, 0, &temp); - if (handle!=NULL) - return(TRUE); - return(FALSE); - #else // UNIX - // Setup thread attributes for client threads - int retval; - pthread_attr_t threadAttr; - pthread_attr_init(&threadAttr); - pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED); - pthread_attr_setscope(&threadAttr,PTHREAD_SCOPE_SYSTEM); - retval=pthread_create(NULL,&threadAttr, threadFuncLauncher, tInfo); - if (retval==0) - return(TRUE); - else - return(FALSE); - #endif -#else - return(FALSE); -#endif /* REENTRANT */ -} - -#ifdef _WIN32 - unsigned __stdcall threadFuncLauncher(void *temp) -#else // UNIX - void *threadFuncLauncher(void *temp) -#endif -{ - ThreadInformation *tInfo=(ThreadInformation *)temp; - - void (*start_func)(void *); - start_func=(void (*)(void *))tInfo->startPoint; - - void *data=tInfo->data; - delete(tInfo); - - start_func(data); - return(0); -} - -#ifdef _WIN32 - unsigned __stdcall threadClassLauncher(void *temp) -#else // UNIX - void *threadClassLauncher(void *temp) -#endif -{ - ThreadInformation *tInfo=(ThreadInformation *)temp; - - Runnable *thrClass=(Runnable *)tInfo->startPoint; - void *data=tInfo->data; - bit8 destroy=tInfo->destroy; - delete(tInfo); - - thrClass->run(data); - - if (destroy) // May want to free memory after thread finishes - delete(thrClass); - - { - Runnable::CritSec_.lock(); - Runnable::ThreadCount_--; - Runnable::CritSec_.unlock(); - } - - #ifdef _WIN32 - ExitThread(0); // is this really needed? - #endif - return(0); -} - -Runnable::Runnable() -{ } - -Runnable::~Runnable() -{ } - -// Is there a thread running in this class -bit8 Runnable::isRunning(void) -{ - // Don't need to lock a simple assignment - int temp=ThreadCount_; - return((temp>0)?TRUE:FALSE); -} - -// How many threads are running in this class -int Runnable::getThreadCount(void) -{ - // Don't need to lock a simple assignment - int temp=ThreadCount_; - return(temp); -} - -#undef THREADFAC_CODE diff --git a/Generals/Code/Tools/mangler/wlib/threadfac.h b/Generals/Code/Tools/mangler/wlib/threadfac.h deleted file mode 100644 index a4edbc36804..00000000000 --- a/Generals/Code/Tools/mangler/wlib/threadfac.h +++ /dev/null @@ -1,124 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -// -// Platform independent thread creation (Win32 & POSIX) -// - -#ifndef THREADFAC_HEADER -#define THREADFAC_HEADER - -#ifdef _WIN32 - #include -#endif -#include "wstypes.h" -#include - -#ifdef _WIN32 - #include -#else // UNIX - #include -#endif - -// Windows headers have a tendency to redefine IN -#ifdef IN -#undef IN -#endif -#define IN const - -#include "critsec.h" - - - -#ifdef THREADFAC_CODE - // This is the fake thread entry point for functions - #ifdef _WIN32 - static unsigned __stdcall threadFuncLauncher(void *temp); - #else // UNIX - static void *threadFuncLauncher(void *temp); - #endif - - // Fake entry point for classes - #ifdef _WIN32 - static unsigned __stdcall threadClassLauncher(void *temp); - #else // UNIX - static void *threadClassLauncher(void *temp); - #endif -#endif - - - - - -// Forward definition of base class for threaded classes -class Runnable; - -// -// Call the static method startThread to begin a new thread. -// -class ThreadFactory -{ - public: - static bit8 startThread(void (*start_func)(void *), void *data); - static bit8 startThread(Runnable &runable, void *data, bit8 destroy=FALSE); -}; - - - -// -// Base class for when you want a thread to execute inside a class -// instead of a function. -// -class Runnable -{ - public: - Runnable(); - virtual ~Runnable(); - - - // ThreadFactory needs to be able to access the private - // IsRunning_ field. - friend class ThreadFactory; - - // So do the threadClassLaunchers - #ifdef _WIN32 - friend static unsigned __stdcall threadClassLauncher(void *temp); - #else // UNIX - friend void *threadClassLauncher(void *temp); - #endif - - virtual void run(void *data)=0; // Thread entry point - - void startThread(void *data,bit8 destroy=FALSE) // nice way to start a thread - { - ThreadFactory::startThread(*this,data,destroy); - }; - - // Is there a thread running in this class? - static bit8 isRunning(void); - - // Get the count of threads running inside this class - static int getThreadCount(); - - - private: - static int ThreadCount_; - static CritSec CritSec_; // to protect ThreadCount_ -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/threadsafe.h b/Generals/Code/Tools/mangler/wlib/threadsafe.h deleted file mode 100644 index 8a2addac60f..00000000000 --- a/Generals/Code/Tools/mangler/wlib/threadsafe.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -// -// threadsafe.h -// -// If you include this file and call non-threadsafe functions, it'll -// prevent your program from compiling. It's meant to be a slap -// on the wrist in case you forget and call an unsafe function -// from a threadsafe program. -// - -// -// Reminder to self - use sigwait, not signal handlers! -// - -#ifdef _REENTRANT - -#ifndef THREADSAFE_HEADER -#define THREADSAFE_HEADER - -#define strtok ("strtok() is not MT-SAFE!") -#define ascctime ("asctime() is not MT-SAFE!") -// Can't just do ctime, as Windows' objidl.h uses it as a FILETIME thingie -#define ctime(x) ("ctime() is not MT-SAFE!") -#define gmtime ("gmtime() is not MT-SAFE!") -#define localtime ("localtime() is not MT-SAFE!") -#define tzset ("tzset() is not MT-SAFE!") -#define tzsetwall ("tzsetwall() is not MT-SAFE!") -#define readdir ("readdir() is not MT-SAFE!") - -#define rand ("rand() is not MT-SAFE!") -#define srand ("srand() is not MT-SAFE!") -#define random ("random() is not MT-SAFE!") -#define srandom ("srandom() is not MT-SAFE!") - -#define tmpnam ("tmpnam() is not MT-SAFE!") -#define vfork ("vfork() is not MT-SAFE!") - -#define system ("system() is not MT-SAFE!") -#define popen ("popen() is not MT-SAFE!") -#define pclose ("pclose() is not MT-SAFE!") -#define ctermid ("ctermid() is not MT-SAFE!") -#define getlogin ("getlogin() is not MT-SAFE!"); - -#endif // THREADSAFE_HEADER -#endif // _REENTRANT diff --git a/Generals/Code/Tools/mangler/wlib/timezone.cpp b/Generals/Code/Tools/mangler/wlib/timezone.cpp deleted file mode 100644 index 6e191ebb17f..00000000000 --- a/Generals/Code/Tools/mangler/wlib/timezone.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#include "wlib/xtime.h" -#include "timezone.h" - -void GetTimezoneInfo(const char * &timezone_str, int &timezone_offset) { - timezone_str = "Unknown Timezone"; - timezone_offset = 0; -#ifdef _WINDOWS - struct _timeb wintime; - _ftime(&wintime); - - if (wintime.dstflag) { - // Daylight savings time - if (_daylight) { - timezone_str = _tzname[1]; - } - } else { - timezone_str = _tzname[0]; - } - timezone_offset = wintime.timezone * 60; // its in minutes... - -#endif -#ifndef _WINDOWS - struct timeval unixtime; - struct timezone unixtzone; - gettimeofday(&unixtime,&unixtzone); - - struct tm unixtm; - localtime_r(&unixtime.tv_sec, &unixtm); - - if (unixtm.tm_isdst) { - // Daylight savings time - if (daylight) timezone_str = tzname[1]; - timezone_offset = altzone; - } else { - timezone_str = tzname[0]; - timezone_offset = timezone; - } -#endif -} - -const char * TimezoneString(void) { - const char *timezone_str; - int timezone_offset; - GetTimezoneInfo(timezone_str, timezone_offset); - return timezone_str; -} - -int TimezoneOffset(void) { - const char *timezone_str; - int timezone_offset; - GetTimezoneInfo(timezone_str, timezone_offset); - return timezone_offset; -} diff --git a/Generals/Code/Tools/mangler/wlib/timezone.h b/Generals/Code/Tools/mangler/wlib/timezone.h deleted file mode 100644 index 95e4c37f384..00000000000 --- a/Generals/Code/Tools/mangler/wlib/timezone.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -timezone Matthew D. Campbell - -This is just a couple of convenience functions for determining what timezone -we are now in. It even accounts for daylight savings! One caveat is that it -only tells you info about what the daylight savings info is now, not 5 minutes -from now, not 2 hours ago. Oh well. -\****************************************************************************/ - -#ifndef _TIMEZONE_H_ -#define _TIMEZONE_H_ - -// Just fill in both the timezone description and its offset from GMT -void GetTimezoneInfo(const char * &timezone_str, int &timezone_offset); - -// Returns the description of the current timezone (daylight savings included) -const char * TimezoneString(void); - -// Returns the offset from GMT of the current timezone -int TimezoneOffset(void); - -#endif // _TIMEZONE_H_ - diff --git a/Generals/Code/Tools/mangler/wlib/ustring.h b/Generals/Code/Tools/mangler/wlib/ustring.h deleted file mode 100644 index 12fee83b683..00000000000 --- a/Generals/Code/Tools/mangler/wlib/ustring.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef USTRING_HEADER -#define USTRING_HEADER - -#include -#include -#include -#include - -// Windows headers have a tendency to redefine IN -#ifdef IN -#undef IN -#endif -#define IN const - -#define MAX_BYTES_PER_CHAR 1 - -template -class UstringT : public basic_string > -{ - public: - explicit UstringT(int max_charlength) { - set_max_bytelength(max_charlength*MAX_BYTES_PER_CHAR); - } - - UstringT() { max_bytelength=4000; } - - size_t get_max_bytelength(void) { return(max_bytelength); } - void set_max_bytelength(size_t max) { max_bytelength=max; } - - bool operator==(const UstringT &other) - { - const basic_string > *other_basic=&other; - const basic_string > *this_basic=this; - return((*other_basic)==(*this_basic)); - } - - private: - size_t max_bytelength; -}; - -typedef UstringT Ustring; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/wdebug.cpp b/Generals/Code/Tools/mangler/wlib/wdebug.cpp deleted file mode 100644 index 8e2d14f7e47..00000000000 --- a/Generals/Code/Tools/mangler/wlib/wdebug.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#include -#include "wdebug.h" -#include "streamer.h" -#include "odevice.h" - - -static MsgManager *msg_manager=NULL; - -static int debug_enabled=0; -static ostream *debug_ostream=NULL; -static Streamer debug_streamer; - -static int info_enabled=0; -static ostream *info_ostream=NULL; -static Streamer info_streamer; - -static int warn_enabled=0; -static ostream *warn_ostream=NULL; -static Streamer warn_streamer; - -static int error_enabled=0; -static ostream *error_ostream=NULL; -static Streamer error_streamer; - - -// Don't dare touch this semaphore in application code! -#ifdef USE_DEBUG_SEM -Sem4 DebugLibSemaphore; -#else -CritSec DebugLibSemaphore; -#endif - - -int MsgManager::setAllStreams(OutputDevice *device) -{ - if (device==NULL) - return(1); - - DEBUGLOCK; - debug_streamer.setOutputDevice(device); - delete(debug_ostream); - debug_ostream=new ostream(&debug_streamer); - - info_streamer.setOutputDevice(device); - delete(info_ostream); - info_ostream=new ostream(&info_streamer); - - warn_streamer.setOutputDevice(device); - delete(warn_ostream); - warn_ostream=new ostream(&warn_streamer); - - error_streamer.setOutputDevice(device); - delete(error_ostream); - error_ostream=new ostream(&error_streamer); - - DEBUGUNLOCK; - - return(0); -} - - -int MsgManager::ReplaceAllStreams(FileD * output_device, IN char *device_filename, IN char *copy_filename) -{ - DebugLibSemaphore.Wait(); - - delete(debug_ostream); - delete(info_ostream); - delete(warn_ostream); - delete(error_ostream); - - if (output_device != NULL) - { - delete(output_device); - output_device = NULL; - } - - rename(device_filename, copy_filename); - -// FileD new_device(device_filename); - output_device = new FileD(device_filename); - - debug_streamer.setOutputDevice(output_device); - debug_ostream = new ostream(&debug_streamer); - - info_streamer.setOutputDevice(output_device); - info_ostream=new ostream(&info_streamer); - - warn_streamer.setOutputDevice(output_device); - warn_ostream = new ostream(&warn_streamer); - - error_streamer.setOutputDevice(output_device); - error_ostream = new ostream(&error_streamer); - - DebugLibSemaphore.Post(); - - return(0); -} - - -int MsgManager::setDebugStream(OutputDevice *device) -{ - if (device==NULL) - return(1); - - DEBUGLOCK; - debug_streamer.setOutputDevice(device); - delete(debug_ostream); - debug_ostream=new ostream(&debug_streamer); - DEBUGUNLOCK; - return(0); -} - -int MsgManager::setInfoStream(OutputDevice *device) -{ - if (device==NULL) - return(1); - - DEBUGLOCK; - info_streamer.setOutputDevice(device); - delete(info_ostream); - info_ostream=new ostream(&info_streamer); - DEBUGUNLOCK; - return(0); -} - -int MsgManager::setWarnStream(OutputDevice *device) -{ - if (device==NULL) - return(1); - - DEBUGLOCK; - warn_streamer.setOutputDevice(device); - delete(warn_ostream); - warn_ostream=new ostream(&warn_streamer); - DEBUGUNLOCK; - return(0); -} - -int MsgManager::setErrorStream(OutputDevice *device) -{ - if (device==NULL) - return(1); - - DEBUGLOCK; - error_streamer.setOutputDevice(device); - delete(error_ostream); - error_ostream=new ostream(&error_streamer); - DEBUGUNLOCK; - return(0); -} - - - -ostream *MsgManager::debugStream(void) -{ - return(debug_ostream); -} - -ostream *MsgManager::infoStream(void) -{ - return(info_ostream); -} - -ostream *MsgManager::warnStream(void) -{ - return(warn_ostream); -} - -ostream *MsgManager::errorStream(void) -{ - return(error_ostream); -} diff --git a/Generals/Code/Tools/mangler/wlib/wdebug.h b/Generals/Code/Tools/mangler/wlib/wdebug.h deleted file mode 100644 index a37c9ee75ff..00000000000 --- a/Generals/Code/Tools/mangler/wlib/wdebug.h +++ /dev/null @@ -1,314 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/*****************************************************************************\ -wdebug Neal Kettler - -MT-LEVEL - MT-Safe - -The debugging module is pretty good for debugging and it has some message -printing stuff as well. The basic idea is that you write a class that -inherits from OutputDevice (several are provided) and assign that output -device to a stream. There are seperate streams for debugging, information, -warning, and error messages. Each one can have a seperate output device, -or they can all have the same one. Debugging messages only get compiled -in if your module defines 'DEBUG'. If you don't define debug, then not even -the text of the debugging message gets into the binary. All the other -output streams get printed regardless of whether DEBUG is defined. - -Sample usage: -FileD debug_device("gameres.debug"); // create a file device -MsgManager::setDebugStream(&debug_device); -DBGMSG("This debug message #" << 1 << " you use C++ streams"); - -Note that since these are defines you really don't need to put a semicolon -at the end, and it can be bad in situations like this: - -if (x) - DBGMSG("Stuff is broken"); -else - DBGMSG("Stuff is NOT broken"); - -This won't compile, read the code until you figure it out. Only then -will you be ready to leave grasshopper. - -\*****************************************************************************/ - -#ifndef WDEBUG_HEADER -#define WDEBUG_HEADER - -#define USE_DEBUG_SEM - -#include "wstypes.h" - -#include -#include - -#if !defined(_WINDOWS) -// Windows headers have a tendency to redefine IN -#ifdef IN -#undef IN -#endif -#define IN const -#endif - -#ifdef USE_DEBUG_SEM -#include "sem4.h" -#else -#include "critsec.h" -#endif -#include "odevice.h" -#include "streamer.h" -#include "xtime.h" -#include "timezone.h" // MDC -#include "filed.h" - -// This is needed because the streams return a pointer. Every time you -// change the output device the old stream is deleted, and a new one -// is created. -// MDC: Added a macro to switch between semaphores & critsecs to debug a -// problem in Win32. - -#ifdef USE_DEBUG_SEM -extern Sem4 DebugLibSemaphore; -#define DEBUGLOCK DebugLibSemaphore.Wait() -#define DEBUGUNLOCK DebugLibSemaphore.Post() -#else -extern CritSec DebugLibSemaphore; -#define DEBUGLOCK DebugLibSemaphore.lock() -#define DEBUGUNLOCK DebugLibSemaphore.unlock() -#endif - -// Print an information message -#define INFMSG(X)\ -{\ - char timebuf[40]; \ - Xtime now; \ - now -= TimezoneOffset(); \ - now.FormatTime(timebuf, "mm/dd/yy hh:mm:ss"); \ - DEBUGLOCK; \ - if (MsgManager::infoStream()) \ - (*(MsgManager::infoStream())) << "INF " << timebuf << " [" << \ - __FILE__ << " " << __LINE__ << "] " << X << endl; \ - DEBUGUNLOCK; \ -} - -// Print a warning message -#define WRNMSG(X)\ -{\ - char timebuf[40]; \ - Xtime now; \ - now -= TimezoneOffset(); \ - now.FormatTime(timebuf, "mm/dd/yy hh:mm:ss"); \ - DEBUGLOCK; \ - if (MsgManager::warnStream()) \ - (*(MsgManager::warnStream())) << "WRN " << timebuf << " [" << \ - __FILE__ << " " << __LINE__ << "] " << X << endl; \ - DEBUGUNLOCK; \ -} - -// Print an error message -#define ERRMSG(X)\ -{\ - char timebuf[40]; \ - Xtime now; \ - now -= TimezoneOffset(); \ - now.FormatTime(timebuf, "mm/dd/yy hh:mm:ss"); \ - DEBUGLOCK; \ - if (MsgManager::errorStream()) \ - (*(MsgManager::errorStream())) << "ERR " << timebuf << " [" << \ - __FILE__ << " " << __LINE__ << "] " << X << endl; \ - DEBUGUNLOCK; \ -} - - -// Just get a stream to the information device, no extra junk -#define INFSTREAM(X)\ -{\ - DEBUGLOCK; \ - if (MsgManager::infoStream()) \ - (*(MsgManager::infoStream())) << X;\ - DEBUGUNLOCK; \ -} - -// Just get a stream to the warning device, no extra junk -#define WRNSTREAM(X)\ -{\ - DEBUGLOCK; \ - if (MsgManager::warnStream()) \ - (*(MsgManager::warnStream())) << X;\ - DEBUGUNLOCK; \ -} - -// Just get a stream to the error device, no extra junk -#define ERRSTREAM(X)\ -{\ - DEBUGLOCK; \ - if (MsgManager::errorStream()) \ - (*(MsgManager::errorStream())) << X;\ - DEBUGUNLOCK; \ -} - -#ifndef DEBUG - -// No debugging, no debug messages. -// Note that anything enclosed in "DBG()" will NOT get executed -// unless DEBUG is defined. -// They are defined to {} for consistency when DEBUG is defined - -#define DBG(X) -#define DBGSTREAM(X) {} -#define PVAR(v) {} -#define DBGMSG(X) {} -#define VERBOSE(X) {} - -#else // DEBUG _is_ defined - -// Execute only if in debugging mode -#define DBG(X) X - -// In Windows, send a copy to the debugger window -#ifdef _WINDOWS - -// Print a variable -#define PVAR(v) \ -{ \ - DEBUGLOCK; \ - if (MsgManager::debugStream()) \ - (*(MsgManager::debugStream())) << __FILE__ << "[" << __LINE__ << \ - "]: " << ##V << " = " << V << endl; \ - strstream __s;\ - __s << __FILE__ << "[" << __LINE__ << \ - "]: " << ##V << " = " << V << '\n' << '\0';\ - OutputDebugString(STRSTREAM_CSTR(__s));\ - DEBUGUNLOCK; \ -} - - -#define DBGMSG(X)\ -{\ - DEBUGLOCK; \ - if (MsgManager::debugStream()) \ - (*(MsgManager::debugStream())) << "DBG [" << __FILE__ << \ - " " << __LINE__ << "] " << X << endl;\ - strstream __s;\ - __s << "DBG [" << __FILE__ << \ - " " << __LINE__ << "] " << X << '\n' << '\0';\ - OutputDebugString(STRSTREAM_CSTR(__s));\ - DEBUGUNLOCK; \ -} - -// Just get a stream to the debugging device, no extra junk -#define DBGSTREAM(X)\ -{\ - DEBUGLOCK; \ - if (MsgManager::debugStream()) \ - (*(MsgManager::debugStream())) << X;\ - strstream __s;\ - __s << X << '\0';\ - OutputDebugString(STRSTREAM_CSTR(__s));\ - DEBUGUNLOCK; \ -} - -// Verbosely execute a statement -#define VERBOSE(X)\ -{ \ - DEBUGLOCK; \ - if (MsgManager::debugStream()) \ - (*(DebugManager::debugStream())) << __FILE__ << "[" << __LINE__ << \ - "]: " << ##X << endl; X \ - strstream __s;\ - __s << __FILE__ << "[" << __LINE__ << \ - "]: " << ##X << '\n' << '\0';\ - OutputDebugString(STRSTREAM_CSTR(__s));\ - DEBUGUNLOCK; \ -} - -#else // _WINDOWS - -// Print a variable -#define PVAR(v) \ -{ \ - DEBUGLOCK; \ - if (MsgManager::debugStream()) \ - (*(MsgManager::debugStream())) << __FILE__ << "[" << __LINE__ << \ - "]: " << ##V << " = " << V << endl; \ - DEBUGUNLOCK; \ -} - - -#define DBGMSG(X)\ -{\ - DEBUGLOCK; \ - if (MsgManager::debugStream()) \ - (*(MsgManager::debugStream())) << "DBG [" << __FILE__ << \ - " " << __LINE__ << "] " << X << endl;\ - DEBUGUNLOCK; \ -} - -// Just get a stream to the debugging device, no extra junk -#define DBGSTREAM(X)\ -{\ - DEBUGLOCK; \ - if (MsgManager::debugStream()) \ - (*(MsgManager::debugStream())) << X;\ - DEBUGUNLOCK; \ -} - -// Verbosely execute a statement -#define VERBOSE(X)\ -{ \ - DEBUGLOCK; \ - if (MsgManager::debugStream()) \ - (*(DebugManager::debugStream())) << __FILE__ << "[" << __LINE__ << \ - "]: " << ##X << endl; X \ - DEBUGUNLOCK; \ -} -#endif // _WINDOWS - -#endif // DEBUG - -//#undef DEBUGLOCK -//#undef DEBUGUNLOCK - -class MsgManager -{ - protected: - MsgManager(); - - public: - static int setAllStreams(OutputDevice *device); - static int ReplaceAllStreams(FileD *output_device, IN char *device_filename, IN char *copy_filename); - static int setDebugStream(OutputDevice *device); - static int setInfoStream(OutputDevice *device); - static int setWarnStream(OutputDevice *device); - static int setErrorStream(OutputDevice *device); - - static void enableDebug(int flag); - static void enableInfo(int flag); - static void enableWarn(int flag); - static void enableError(int flag); - - static ostream *debugStream(void); - static ostream *infoStream(void); - static ostream *warnStream(void); - static ostream *errorStream(void); -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/wstring.cpp b/Generals/Code/Tools/mangler/wlib/wstring.cpp deleted file mode 100644 index e7fa32cff35..00000000000 --- a/Generals/Code/Tools/mangler/wlib/wstring.cpp +++ /dev/null @@ -1,597 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -* C O N F I D E N T I A L --- W E S T W O O D S T U D I O S * -****************************************************************************** -Project Name: Carpenter (The RedAlert ladder creator) -File Name : string.cpp -Author : Neal Kettler -Start Date : June 1, 1997 -Last Update : June 17, 1997 - -A fairly typical string class. This string class always copies any input -string to it's own memory (for assignment or construction). -\***************************************************************************/ - -#include -#include -#include -#include -#include - -#include "wstring.h" - -#define PADSIZE 32 // include a little padding on alloc for future growth - -Wstring::Wstring() : str(NULL), strsize(0) -{ } - -Wstring::Wstring(const char *string):str(NULL), strsize(0) -{ set(string); } - -Wstring::Wstring(const Wstring &other):str(NULL), strsize(0) -{ - if (other.str!=NULL) - { - str=new char[strlen(other.str)+PADSIZE+1]; - strsize=strlen(other.str)+PADSIZE+1; - strcpy(str,other.str); - } -} - -Wstring::~Wstring() -{ - clear(); -} - -bool Wstring::operator<(const Wstring &other) const -{ - if (str == NULL && other.str == NULL) - return false; - - if (str == NULL) - return true; - - return ( strcmp(str, other.str) < 0 ); -} - -bit8 Wstring::operator==(const char *other) const -{ - if ((str==NULL)&&(other==NULL)) - return(TRUE); - if(strcmp(str, other) != 0) - return(FALSE); - else - return(TRUE); -} - -bit8 Wstring::operator==(const Wstring &other) const -{ - if((str == NULL) && (other.str == NULL)) - return(TRUE); - - if((str == NULL) || (other.str == NULL)) - return(FALSE); - - if(strcmp(str, other.str) != 0) - return(FALSE); - else - return(TRUE); -} - - -bit8 Wstring::operator!=(const char *other) const -{ - if(strcmp(str, other) != 0) - return(TRUE); - else - return(FALSE); -} - - -bit8 Wstring::operator!=(const Wstring &other) const -{ - if((str == NULL) && (other.str == NULL)) - return(FALSE); - - if((str == NULL) || (other.str == NULL)) - return(TRUE); - - if(strcmp(str, other.str) != 0) - return(TRUE); - else - return(FALSE); -} - - -Wstring &Wstring::operator=(const char *other) -{ - set(other); - return(*this); -} - - -Wstring &Wstring::operator=(const Wstring &other) -{ - if(*this == other) - return(*this); - - set(other.get()); - return(*this); -} - - -bit8 Wstring::cat(const char *s) -{ - uint32 len; - - if (s==NULL) // it's OK to cat nothing - return(TRUE); - - // Determine the length of the resultant string. - len = strlen(s) + 1; - if(str) - len += strlen(str); - - // Space check - strgrow(len); - - strcat(str, s); - - return(TRUE); -} - - -bit8 Wstring::cat(uint32 size, const char *s) -{ - uint32 len; - - // Determine the length of the resultant string. - len = size + 1; - if(str) - len += strlen(str); - - // Allocate memory for the new string. - strgrow(len); - - strncat(str, s, size); - str[len-1]=0; // make sure null term'd - - return(TRUE); -} - -bit8 Wstring::cat(const Wstring &other) -{ - return cat(other.get()); -} - -Wstring &Wstring::operator+=(const char *string) -{ - cat(string); - return(*this); -} - -Wstring &Wstring::operator+=(const Wstring &other) -{ - cat(other.get()); - return(*this); -} - -Wstring Wstring::operator+(const char *string) -{ - Wstring temp = *this; - temp.cat(string); - return(temp); -} - -Wstring Wstring::operator+(const Wstring &s) -{ - Wstring temp = *this; - temp.cat(s); - return(temp); -} - -// -// This function deletes 'count' characters indexed by `pos' from the Wstring. -// If `pos'+'count' is > the length of the array, the last 'count' characters -// of the string are removed. If an error occurs, FALSE is returned. -// Otherwise, TRUE is returned. Note: count has a default value of 1. -// -// -char Wstring::remove(sint32 pos,sint32 count) -{ - //char *s; - sint32 len; - - len = (sint32)strlen(str); - - if(pos+count > len) - pos = len - count; - if (pos < 0) - { - count+=pos; // If they remove before 0, ignore up till beginning - pos=0; - } - if (count<=0) - return(FALSE); - - memmove(str+pos,str+pos+count,len-pos-count+1); - - return(TRUE); -} - -// Remove all instances of a char from the string -bit8 Wstring::removeChar(char c) -{ - int len=0; - char *cptr=NULL; - bit8 removed=FALSE; - - if (str==NULL) - return(FALSE); - - len=strlen(str); - while ((cptr=strchr(str,c)) !=NULL) - { - memmove(cptr,cptr+1,len-1-((int)(cptr-str))); - len--; - str[len]=0; - removed=TRUE; - } - return(removed); -} - -void Wstring::removeSpaces(void) -{ - removeChar(' '); - removeChar('\t'); -} - -void Wstring::clear(void) -{ - if(str) - delete[](str); - strsize=0; - str=NULL; -} - -// This is usually used for raw storage instead of string ops... -void Wstring::setSize(sint32 size) -{ - clear(); - if (size<0) - return; - - str=new char[size]; - strsize=size; - memset(str,0,size); -} - -void Wstring::cellCopy(char *dest, uint32 len) -{ - uint32 i; - - strncpy(dest, str, len); - for(i = (uint32)strlen(str); i < len; i++) - dest[i] = ' '; - dest[len] = 0; -} - -const char *Wstring::get(void) const -{ - if(!str) - return ""; - return str; -} - -char Wstring::get(uint32 index) const -{ - if(index < strlen(str)) - return str[index]; - return(0); -} - -uint32 Wstring::length(void) const -{ - if(str == NULL) - return(0); - return((uint32)strlen(str)); -} - - -// Insert at given position and shift old stuff to right -bit8 Wstring::insert(const char *instring, uint32 pos) -{ - if (str==NULL) - return(set(instring)); - if (pos>strlen(str)) - pos=strlen(str); - - strgrow(strlen(str)+strlen(instring)+1); - memmove(str+pos+strlen(instring),str+pos,strlen(str)-pos+1); - memmove(str+pos,instring,strlen(instring)); - - return(TRUE); -} - -// This function inserts the character specified by `k' into the string at the -// position indexed by `pos'. If `pos' is >= the length of the string, it is -// appended to the string. If an error occurs, FALSE is returned. Otherwise, -// TRUE is returned. -bit8 Wstring::insert(char k, uint32 pos) -{ - char temp[2]; - temp[0]=k; - temp[1]=0; - return(insert(temp,pos)); -} - - -// Joe Howes (05/19/2000): This function inserts commas to nicely format a -// large number (i.e. 1234567890 -> 1,234,567,890). It doesn't really care -// if the string is really a number or not. -bit8 Wstring::beautifyNumber() -{ - int len = length(); - int accum = 3 - (len % 3); - int numcommas = 0; - - - if( accum == 3 ) accum = -1; - for(int i = 0; i < len; i++) - { - if( accum == 3 ) - { - insert(',', i + numcommas); - numcommas++; - } - accum = ( accum == 3 || accum == -1 ) ? 1 : accum + 1; - } - - return(TRUE); -} - - -// This function replaces any occurences of the string pointed to by -// `replaceThis' with the string pointed to by `withThis'. If an error -// occurs, FALSE is returned. Otherwise, TRUE is returned. -bit8 Wstring::replace(const char *replaceThis,const char *withThis) -{ - Wstring dest; - const char *foundStr, *src; - uint32 len; - - src=get(); - while(src && src[0]) - { - foundStr = strstr(src, replaceThis); - if(foundStr) - { - len = (uint32)foundStr - (uint32)src; - if(len) - { - if(!dest.cat(len, src)) - return(FALSE); - } - if(!dest.cat(withThis)) - return(FALSE); - src = foundStr + strlen(replaceThis); - } - else - { - if(!dest.cat(src)) - return(FALSE); - - src=NULL; - } - } - return(set(dest.get())); -} - - -bit8 Wstring::set(const char *s) -{ - //uint32 len; - - strgrow(strlen(s)+1); - strcpy(str,s); - - return(TRUE); -} - - -bit8 Wstring::set(char c, uint32 index) -{ - if(index >= (uint32)strlen(str)) - return FALSE; - - str[index] = c; - - return TRUE; -} - - -char Wstring::set(uint32 size, const char *string) -{ - //uint32 len; - - strgrow(size+1); - strncpy(str,string,size); - str[size]=0; - - return(TRUE); -} - - -// Added by Joe Howes. Takes a printf formatted string and a set of args. -// The expanded string must not exceed 1k or twice the length of the format -// string, whichever is larger. It would probably be better to traverse -// the format string and properly calculate, the length so this will -// work in all cases, but this should be good enough for 99% of Wstring usage. -char Wstring::setFormatted(const char *msg, ...) -{ - if( msg == NULL || strlen(msg) <= 0 ) return FALSE; - - char* string; - va_list args; - int len = (strlen(msg) < 1024) ? 1024 : (strlen(msg)*2); - - string = new char[len]; - va_start(args, msg); - vsprintf(string, msg, args); - va_end(args); - set(string); - delete[] string; - return(TRUE); -} - - -// This function converts all alphabetical characters in the string to lower -// case. -void Wstring::toLower(void) -{ - uint32 i; - int strlength=length(); - - for(i = 0; i < (uint32)strlength; i++) - { - if((str[i] >= 'A') && (str[i] <= 'Z')) - str[i] = (sint8)tolower(str[i]); - } -} - - -// This function converts all alphabetical characters in the string to upper -// case. -void Wstring::toUpper(void) -{ - uint32 i; - int strlength=length(); - - for(i = 0; i < (uint32)strlength; i++) - { - if((str[i] >= 'a') && (str[i] <= 'z')) - str[i] = (sint8)toupper(str[i]); - } -} - - -// This function truncates the string so its length will match the specified -// `len'. If an error occurs, FALSE is returned. Otherwise, TRUE is returned. -bit8 Wstring::truncate(uint32 len) -{ - strgrow(len+1); - str[len]=0; - return(TRUE); -} - -// Truncate the string after the character 'c' (gets rid of 'c' as well) -// Do nothing if 'c' isn't in the string -bit8 Wstring::truncate(char c) -{ - sint32 len; - - if (str==NULL) - return(FALSE); - - char *cptr=strchr(str,c); - if (cptr==NULL) - return(FALSE); - len=(sint32)(cptr-str); - truncate((uint32)len); - return(TRUE); -} - -// Get a token from this string that's seperated by one or more -// chars from the 'delim' string , start at offset & return offset -sint32 Wstring::getToken(int offset,const char *delim,Wstring &out) const -{ - int i; - sint32 start; - sint32 stop; - - if (offset<0) // check for bad input - return(-1); - - for (i=offset; i<(int)length(); i++) { - if(strchr(delim,str[i])==NULL) - break; - } - if (i>=(int)length()) - return(-1); - start=i; - - for (; i<(int)length(); i++) { - if(strchr(delim,str[i])!=NULL) - break; - } - stop=i-1; - out.set(str+start); - out.truncate((uint32)stop-start+1); - return(stop+1); -} - -// Get the first line of text after offset. Lines are terminated by '\r\n' or '\n' -sint32 Wstring::getLine(int offset, Wstring &out) -{ - int i; - sint32 start; - sint32 stop; - - start=i=offset; - if (start >= (sint32)length()) - return(-1); - - for (; i<(int)length(); i++) { - if(strchr("\r\n",str[i])!=NULL) - break; - } - stop=i; - if ((str[stop]=='\r')&&(str[stop+1]=='\n')) - stop++; - - out.set(str+start); - out.truncate((uint32)stop-start+1); - return(stop+1); -} - -// -// Make sure there's AT LEAST length bytes in this string object -// -void Wstring::strgrow(int length) -{ - if (str==NULL) - { - str=new char[length+PADSIZE]; - str[0]=0; - strsize=length+PADSIZE; - return; - } - else if (strsize >= length) // no need to alloc more data - return; - else // bah, gotta grow... - { - char *newstr=new char[length+PADSIZE]; - strsize=length+PADSIZE; - strcpy(newstr,str); - delete[](str); - str=newstr; - return; - } -} diff --git a/Generals/Code/Tools/mangler/wlib/wstring.h b/Generals/Code/Tools/mangler/wlib/wstring.h deleted file mode 100644 index 484815c1bac..00000000000 --- a/Generals/Code/Tools/mangler/wlib/wstring.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -* C O N F I D E N T I A L --- W E S T W O O D S T U D I O S * -****************************************************************************** -Project Name: Carpenter (The RedAlert ladder creator) -File Name : main.cpp -Author : Neal Kettler -Start Date : June 1, 1997 -Last Update : June 17, 1997 -\****************************************************************************/ - -#ifndef WSTRING_HEADER -#define WSTRING_HEADER - -#include -#include -#include "wstypes.h" - -class Wstring -{ - public: - Wstring(); - Wstring(const Wstring &other); - Wstring(const char *string); - ~Wstring(); - - void clear(void); - - bit8 cat(const char *string); - bit8 cat(uint32 size,const char *string); - bit8 cat(const Wstring &string); - - void cellCopy(OUT char *dest, uint32 len); - char remove(sint32 pos, sint32 count); - bit8 removeChar(char c); - void removeSpaces(void); - const char *get(void) const; - char get(uint32 index) const; - uint32 length(void) const; - bit8 insert(char c, uint32 pos); - bit8 insert(const char *instring, uint32 pos); - bit8 beautifyNumber(); - bit8 replace(const char *replaceThis,const char *withThis); - char set(const char *str); - char set(uint32 size,const char *str); - bit8 set(char c, uint32 index); - char setFormatted(const char *str, ...); // Added by Joe Howes - void setSize(sint32 bytes); // create an empty string - void toLower(void); - void toUpper(void); - bit8 truncate(uint32 len); - bit8 truncate(char c); // trunc after char c - sint32 getToken(int offset,const char *delim,Wstring &out) const; - sint32 getLine(int offset, Wstring &out); - void strgrow(int length); - - bit8 operator==(const char *other) const; - bit8 operator==(const Wstring &other) const; - bit8 operator!=(const char *other) const; - bit8 operator!=(const Wstring &other) const; - - Wstring &operator=(const char *other); - Wstring &operator=(const Wstring &other); - Wstring &operator+=(const char *other); - Wstring &operator+=(const Wstring &other); - Wstring operator+(const char *other); - Wstring operator+(const Wstring &other); - - bool operator<(const Wstring &other) const; - - private: - char *str; // Pointer to allocated string. - int strsize; // allocated data length -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/wstypes.h b/Generals/Code/Tools/mangler/wlib/wstypes.h deleted file mode 100644 index dbc58245638..00000000000 --- a/Generals/Code/Tools/mangler/wlib/wstypes.h +++ /dev/null @@ -1,118 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -* C O N F I D E N T I A L --- W E S T W O O D S T U D I O S * -****************************************************************************** -Project Name: Carpenter (The RedAlert ladder creator) -File Name : wstypes.h -Author : Neal Kettler -Start Date : June 3, 1997 -Last Update : June 17, 1997 - -Standard type definitions for the sake of portability and readability. -\***************************************************************************/ - -#ifndef WSTYPES_HEADER -#define WSTYPES_HEADER - -#ifdef _REENTRANT // reentrant = threaded -// Headers with non threadsafe libs need to come before my hacky -// threadsafe.h otherwise they won't compile - -#include -#ifndef _WINDOWS -#define _POSIX_C_SOURCE 199506L -#define _POSIX_PTHREAD_SEMANTICS -#define __EXTENSIONS__ -#endif -#include -#include -#include -#ifndef _WINDOWS -#include -#include -#include -#else -#include -#include -#endif -#include "threadsafe.h" // enforce threadsafe-only calls -#endif - -#define adelete(X) (delete[](X)) - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef MIN -#define MIN(x,y) (((x)<(y))?(x):(y)) -#endif - -#ifndef MAX -#define MAX(x,y) (((x)>(y))?(x):(y)) -#endif - -#ifndef NULL -#define NULL 0 -#endif - -//These are used for readability purposes mostly, when a method takes a -// pointer or reference these help specify what will happen to the data -// that is sent in. -#ifdef IN -#undef IN -#endif -#define IN const -#define OUT -#define INOUT -#define _IN_ const - -// Used to declare a function or method as const or Read Only -#define RO const - -typedef char bit8; -typedef char sint8; -typedef unsigned char uint8; -typedef signed short int sint16; -typedef unsigned short int uint16; -typedef signed int sint32; -typedef unsigned int uint32; - -typedef float float32; -typedef double float64; - -#define MAX_BIT8 0x1 -#define MAX_UINT32 0xFFFFFFFF -#define MAX_UINT16 0xFFFF -#define MAX_UINT8 0xFF -#define MAX_SINT32 0x7FFFFFFF -#define MAX_SINT16 0x7FFF -#define MAX_SINT8 0x7F - -#ifdef _WINDOWS -#define strncasecmp _strnicmp -#define strcasecmp _stricmp -#endif - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/wtime.cpp b/Generals/Code/Tools/mangler/wlib/wtime.cpp deleted file mode 100644 index 5b40cb1df1d..00000000000 --- a/Generals/Code/Tools/mangler/wlib/wtime.cpp +++ /dev/null @@ -1,802 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -wtime Neal Kettler -\****************************************************************************/ - -#include -#include "wtime.h" - -static const char *DAYS[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; - -static const char *FULLDAYS[]={"Sunday","Monday","Tuesday","Wednesday","Thursday", - "Friday","Saturday"}; - -static const char *MONTHS[]={"Jan","Feb","Mar","Apr","May","Jun","Jul", - "Aug","Sep","Oct","Nov","Dec"}; - -static const char *FULLMONTHS[]={"January","February","March","April","May","June", - "July","August","September","October","November","December"}; - -// MDC: Windows doesn't provide a localtime_r, so make our own... -#ifdef _WINDOWS -#ifdef _REENTRANT -#include "critsec.h" -static CritSec localtime_critsec; -#undef localtime -struct tm *localtime(const time_t *clockval); -#endif // _REENTRANT - -static struct tm *localtime_r(const time_t *clockval, struct tm *res) { -#ifdef _REENTRANT - localtime_critsec.lock(); -#endif - struct tm *static_tm = localtime(clockval); - res = (struct tm *)memcpy(res, static_tm, sizeof(tm)); -#ifdef _REENTRANT - localtime_critsec.unlock(); -#endif - return res; -} -#endif // _WINDOWS - -Wtime::Wtime(void) -{ - Update(); -} - -Wtime::Wtime( Wtime &other ) -{ - sign=other.sign; - sec=other.sec; - usec=other.usec; -} - -Wtime::Wtime( uint32 other ) -{ - sign=POSITIVE; - sec=other; - usec=0; -} - -Wtime::~Wtime() -{ -} - -void Wtime::Update(void) -{ - sign=POSITIVE; - #ifdef _WINDOWS - struct _timeb wintime; - _ftime(&wintime); - sec=wintime.time; - usec=(wintime.millitm)*1000; - #endif - #ifndef _WINDOWS - struct timeval unixtime; - struct timezone unixtzone; - gettimeofday(&unixtime,&unixtzone); - sec=unixtime.tv_sec; - usec=unixtime.tv_usec; - #endif -} - - -// Parses a date string that's in modified RFC 1123 format -// Can have a +minutes after the normal time -// eg: Thu, 20 Jun 1996 17:33:49 +100 -// Returns true if successfully parsed, false otherwise -bit8 Wtime::ParseDate(char *in) -{ - int i; - uint32 minOffset; - struct tm t; - char *ptr=in; - while ((!isgraph(*ptr))&&(*ptr!=0)) ptr++; // skip to start of string - if (*ptr==0) return(FALSE); - t.tm_wday=-1; - for (i=0; i<7; i++) // parse day of week - if (strncmp(ptr,DAYS[i],strlen(DAYS[i]))==0) - t.tm_wday=i; - if (t.tm_wday==-1) - return(FALSE); - while ((!isdigit(*ptr))&&(*ptr!=0)) ptr++; // skip to day of month - if (*ptr==0) return(FALSE); - t.tm_mday=atoi(ptr); - while ((!isalpha(*ptr))&&(*ptr!=0)) ptr++; // skip to month - if (*ptr==0) return(FALSE); - t.tm_mon=-1; - for (i=0; i<12; i++) // match month - if (strncmp(ptr,MONTHS[i],strlen(MONTHS[i]))==0) t.tm_mon=i; - if (t.tm_mon==-1) return(FALSE); - while ((!isdigit(*ptr))&&(*ptr!=0)) ptr++; - if (*ptr==0) return(FALSE); - t.tm_year=atoi(ptr); - if (t.tm_year<70) // if they specify a 2 digit year, we'll be nice - t.tm_year+=2000; - else if (t.tm_year<100) - t.tm_year+=1900; - if (t.tm_year>2200) // I doubt my code will be around for another 203 years - return(FALSE); - while ((isdigit(*ptr))&&(*ptr!=0)) ptr++; // skip to end of year - if (*ptr==0) return(FALSE); - - while ((!isgraph(*ptr))&&(*ptr!=0)) ptr++; // skip to start of time - if (*ptr==0) return(FALSE); - - t.tm_hour=atoi(ptr); - while ((*ptr!=':')&&(*ptr!=0)) ptr++; - ptr++; // skip past colon - if (*ptr==0) return(FALSE); - t.tm_min=atoi(ptr); - while ((*ptr!=':')&&(*ptr!=0)) ptr++; - ptr++; // skip past colon - if (*ptr==0) return(FALSE); - t.tm_sec=atoi(ptr); - t.tm_year%=100; // 1996 is stored as 96, not 1996 - t.tm_isdst=-1; // daylight savings info isn't available - - sec=(uint32)(mktime(&t)); - if ((sint32)sec==-1) - return(FALSE); - - - // The next part of the time is OPTIONAL (+minutes) - - // first skip past the seconds - while ((isdigit(*ptr))&&(*ptr!=0)) ptr++; - if (*ptr==0) return(TRUE); - - // skip past any spaces - while ((isspace(*ptr))&&(*ptr!=0)) ptr++; - if (*ptr!='+') - { - //printf("\nNOPE ptr was '%s'\n",ptr); - return(TRUE); - } - ptr++; - if (*ptr==0) - { - //printf("\nPTR WAS 0\n"); - return(TRUE); - } - - minOffset=atol(ptr); - //printf("\n\nAdding %d minutes!\n\n",minOffset); - sec+=minOffset*60; // add the minutes as seconds - return(TRUE); -} - - -// This takes the standard Microsoft time formatting string -// make sure the out string is big enough -// An example format would be "mm/dd/yy hh:mm:ss" -// CHANGE: Joe Howes 06/30/99 -// To specify 12-hour format, use "aa" instead of "hh". -// The hours will be 12 hour and the string will be -// appended with " AM" or " PM". -bit8 Wtime::FormatTime(char *out, const char *format) -{ - int lastWasH=0; - int ampmflag = 0; - out[0]=0; - const char *ptr=format; - - if (*ptr=='"') ptr++; // skip past open quote if exists - - while (*ptr!=0) - { - if (lastWasH>0) - lastWasH--; - - if (isspace(*ptr)) - { - if (lastWasH==1) lastWasH=2; - sprintf(out+strlen(out),"%c",*ptr); - ptr+=1; - } - else if (strncmp(ptr,"\"",1)==0) - { - break; - } - else if (strncmp(ptr,":",1)==0) - { - if (lastWasH==1) lastWasH=2; - sprintf(out+strlen(out),":"); - ptr+=1; - } - else if (strncmp(ptr,"/",1)==0) - { - sprintf(out+strlen(out),"/"); - ptr+=1; - } - else if (strncmp(ptr,"c",1)==0) - { - sprintf(out+strlen(out),"%ld/%ld/%02ld %ld:%02ld:%02ld",GetMonth(), - GetMDay(),GetYear()%100,GetHour(),GetMinute(),GetSecond()); - ptr+=1; - } - else if (strncmp(ptr,"dddddd",6)==0) - { - sprintf(out+strlen(out),"%s %02ld, %ld",FULLMONTHS[GetMonth()-1], - GetMDay(),GetYear()); - ptr+=6; - } - else if (strncmp(ptr,"ddddd",5)==0) - { - sprintf(out+strlen(out),"%ld/%ld/%02ld",GetMonth(),GetMDay(), - GetYear()%100); - ptr+=5; - } - else if (strncmp(ptr,"dddd",4)==0) - { - sprintf(out+strlen(out),"%s",FULLDAYS[GetWDay()-1]); - ptr+=4; - } - else if (strncmp(ptr,"ddd",3)==0) - { - sprintf(out+strlen(out),"%s",DAYS[GetWDay()-1]); - ptr+=3; - } - else if (strncmp(ptr,"dd",2)==0) - { - sprintf(out+strlen(out),"%02ld",GetMDay()); - ptr+=2; - } - else if (strncmp(ptr,"d",1)==0) - { - sprintf(out+strlen(out),"%ld",GetMDay()); - ptr+=1; - } - else if (strncmp(ptr,"ww",2)==0) - { - sprintf(out+strlen(out),"%02ld",GetYWeek()); - ptr+=2; - } - else if (strncmp(ptr,"w",1)==0) - { - sprintf(out+strlen(out),"%ld",GetWDay()); - ptr+=1; - } - else if (strncmp(ptr,"mmmm",4)==0) - { - sprintf(out+strlen(out),"%s",FULLMONTHS[GetMonth()-1]); - ptr+=4; - } - else if (strncmp(ptr,"mmm",3)==0) - { - sprintf(out+strlen(out),"%s",MONTHS[GetMonth()-1]); - ptr+=3; - } - else if (strncmp(ptr,"mm",2)==0) - { - if (lastWasH==1) - sprintf(out+strlen(out),"%02ld",GetMinute()); - else - sprintf(out+strlen(out),"%02ld",GetMonth()); - ptr+=2; - } - else if (strncmp(ptr,"m",1)==0) - { - if (lastWasH==1) - sprintf(out+strlen(out),"%ld",GetMinute()); - else - sprintf(out+strlen(out),"%ld",GetMonth()); - ptr+=1; - } - else if (strncmp(ptr,"q",1)==0) - { - sprintf(out+strlen(out),"%ld",((GetMonth()-1)/4)+1); // GetQuarter - ptr+=1; - } - else if (strncmp(ptr,"yyyy",4)==0) - { - sprintf(out+strlen(out),"%ld",GetYear()); - ptr+=4; - } - else if (strncmp(ptr,"yy",2)==0) - { - sprintf(out+strlen(out),"%02ld",GetYear()%100); - ptr+=2; - } - else if (strncmp(ptr,"y",1)==0) - { - sprintf(out+strlen(out),"%ld",GetYDay()); - ptr+=1; - } - else if (strncmp(ptr,"hh",2)==0) - { - sprintf(out+strlen(out),"%02ld",GetHour()); - lastWasH=2; // needs to be 1 after top of loop decs it - ptr+=2; - } - else if (strncmp(ptr,"h",1)==0) - { - sprintf(out+strlen(out),"%ld",GetHour()); - lastWasH=2; // needs to be 1 after top of loop decs it - ptr+=1; - } - else if (strncmp(ptr,"nn",2)==0) - { - sprintf(out+strlen(out),"%02ld",GetMinute()); - ptr+=2; - } - else if (strncmp(ptr,"n",1)==0) - { - sprintf(out+strlen(out),"%ld",GetMinute()); - ptr+=1; - } - else if (strncmp(ptr,"ss",2)==0) - { - sprintf(out+strlen(out),"%02ld",GetSecond()); - ptr+=2; - } - else if (strncmp(ptr,"s",1)==0) - { - sprintf(out+strlen(out),"%ld",GetSecond()); - ptr+=1; - } - else if (strncmp(ptr,"ttttt",5)==0) - { - sprintf(out+strlen(out),"%ld:%02ld:%02ld",GetHour(),GetMinute(), - GetSecond()); - ptr+=5; - } - else if (strncmp(ptr,"aa",2)==0) - { - uint32 tmp = (GetHour() <= 12) ? GetHour() : GetHour() - 12; - sprintf(out+strlen(out),"%02ld", tmp); - lastWasH=2; // needs to be 1 after top of loop decs it - ptr+=2; - ampmflag = 1; - } - else // an unknown char, move to next - ptr++; - } - if(ampmflag) - { - char ampm[4]; - if( GetHour() < 12 ) - strcpy(ampm, " AM"); - else - strcpy(ampm, " PM"); - sprintf(out+strlen(out), "%s", ampm); - } - return(TRUE); -} - - - -// In addition to PrintTime & PrintDate there is the 'Print' function -// which prints both in RFC 1123 format - -void Wtime::PrintTime(FILE *out) const -{ - char string[80]; - PrintTime(string); - fprintf(out,"%s",string); -} - -void Wtime::PrintTime(char *out) const -{ - sprintf(out," %02lu:%02lu:%02lu",GetHour(),GetMinute(),GetSecond()); -} - -void Wtime::PrintDate(FILE *out) const -{ - char string[80]; - PrintDate(string); - fprintf(out,"%s",string); -} - -void Wtime::PrintDate(char *out) const -{ - sprintf(out,"%s, %lu %s %lu",DAYS[GetWDay()-1],GetMDay(),MONTHS[GetMonth()-1], - GetYear()); -} - -uint32 Wtime::GetSec(void) const -{ - return(sec); -} - -uint32 Wtime::GetUsec(void) const -{ - return(usec); -} - -void Wtime::SetSec(uint32 newsec) -{ - sec=newsec; -} - -void Wtime::SetUsec(uint32 newusec) -{ - usec=newusec; -} - -void Wtime::Set(uint32 newsec, uint32 newusec) -{ - sec=newsec; - usec=newusec; -} - -// Get a timeval ptr from a Wtime class -struct timeval *Wtime::GetTimeval(void) -{ - static struct timeval tv; - tv.tv_sec=sec; - tv.tv_usec=usec; - return(&tv); -} - -// Get a timeval ptr from a Wtime class -void Wtime::GetTimevalMT(struct timeval &tv) -{ - tv.tv_sec=sec; - tv.tv_usec=usec; -} - - -uint32 Wtime::GetSecond(void) const -{ - struct tm t; - struct tm *tptr; - tptr=localtime_r((time_t *)&sec,&t); - return(tptr->tm_sec); -} -uint32 Wtime::GetMinute(void) const -{ - struct tm t; - struct tm *tptr; - tptr=localtime_r((time_t *)&sec,&t); - return(tptr->tm_min); -} -uint32 Wtime::GetHour(void) const -{ - struct tm t; - struct tm *tptr; - tptr=localtime_r((time_t *)&sec,&t); - return(tptr->tm_hour); -} -uint32 Wtime::GetMDay(void) const -{ - struct tm t; - struct tm *tptr; - tptr=localtime_r((time_t *)&sec,&t); - return(tptr->tm_mday); -} -uint32 Wtime::GetWDay(void) const -{ - struct tm t; - struct tm *tptr; - tptr=localtime_r((time_t *)&sec,&t); - return(tptr->tm_wday+1); -} -uint32 Wtime::GetYDay(void) const -{ - struct tm t; - struct tm *tptr; - tptr=localtime_r((time_t *)&sec,&t); - return(tptr->tm_yday+1); -} -uint32 Wtime::GetYWeek(void) const -{ - uint32 yweek; - uint32 yday=GetYDay(); - uint32 wday=GetWDay(); - //phase holds the first weekday of the year. If (Jan 1 = Sun) phase = 0 - sint32 phase=((wday-yday)%7); - if (phase<0) phase+=7; - yweek=((yday+phase-1)/7)+1; - return(yweek); -} -uint32 Wtime::GetMonth(void) const -{ - struct tm t; - struct tm *tptr; - tptr=localtime_r((time_t *)&sec,&t); - return(tptr->tm_mon+1); -} - -uint32 Wtime::GetYear(void) const -{ - struct tm t; - struct tm *tptr; - tptr=localtime_r((time_t *)&sec,&t); - if ((tptr->tm_year)>=70) - return((tptr->tm_year)+1900); - else - return((tptr->tm_year)+2000); -} - - -bit8 Wtime::GetSign(void) const -{ - return(sign); -} - -// 1 = *this > other -//-1 = *this < other -// 0 = *this == other -int Wtime::Compare(const Wtime &other) const -{ - if ((sec==other.sec)&&(usec==other.usec)) - return(0); // equal - - else if (sec>other.sec) - return(1); - else if (secother.usec) - return(1); - else - return(-1); -} - - -bit8 Wtime::operator == ( const Wtime &other ) const -{ - bit8 retval=Compare(other); - if (retval==0) - return(TRUE); - else - return(FALSE); -} - -bit8 Wtime::operator != ( const Wtime &other ) const -{ - bit8 retval=Compare(other); - if (retval==0) - return(FALSE); - else - return(TRUE); -} - -bit8 Wtime::operator < ( const Wtime &other ) const -{ - int retval=Compare(other); - if (retval==-1) - return(TRUE); - else - return(FALSE); -} - -bit8 Wtime::operator > ( const Wtime &other ) const -{ - int retval=Compare(other); - if (retval==1) - return(TRUE); - else - return(FALSE); -} - -bit8 Wtime::operator <= ( const Wtime &other ) const -{ - int retval=Compare(other); - if ((retval==-1)||(retval==0)) - return(TRUE); - else - return(FALSE); -} - -bit8 Wtime::operator >= ( const Wtime &other ) const -{ - int retval=Compare(other); - if ((retval==1)||(retval==0)) - return(TRUE); - else - return(FALSE); -} - - -// None of the operators pay attention to sign -// only the functions that begin with 'Signed' -void Wtime::SignedAdd(const Wtime &other) -{ - Wtime temp; - - if ((sign==POSITIVE)&&(other.sign==POSITIVE)) - { - *this+=other; - sign=POSITIVE; - } - else if ((sign==POSITIVE)&&(other.sign==NEGATIVE)) - { - if (*this>other) - { - *this-=other; - sign=POSITIVE; - } - else - { - temp=other; - temp-=*this; - *this=temp; - sign=NEGATIVE; - } - } - else if ((sign==NEGATIVE)&&(other.sign==POSITIVE)) - { - if (*thisother) - { - *this-=other; - sign=POSITIVE; - } - else - { - temp=other; - temp-=*this; - *this=temp; - sign=NEGATIVE; - } - } - else if ((sign==NEGATIVE)&&(other.sign==NEGATIVE)) - { - if (*this1000000) - { - sec++; - usec-=1000000; - } - return *this; -} - -Wtime &Wtime::operator -= (const Wtime &other) -{ - sint32 temp; - if (Compare(other)==-1) - { - sec=0; // can't handle negative time - usec=0; - return *this; - } - sec-=other.sec; - temp=(sint32)usec; - temp-=(sint32)other.usec; - if (temp<0) - { - sec--; - temp+=1000000; - } - usec=temp; - return *this; -} - -Wtime Wtime::operator - (Wtime &other) -{ - Wtime temp(*this); - temp-=other; - return(temp); -} - -Wtime Wtime::operator + (Wtime &other) -{ - Wtime temp(*this); - temp+=other; - return(temp); -} - - -Wtime &Wtime::operator = (const Wtime &other) -{ - sign=other.sign; - sec=other.sec; - usec=other.usec; - return *this; -} - - -Wtime &Wtime::operator += (const uint32 other) -{ - sec+=other; - return *this; -} - - -Wtime &Wtime::operator -= (const uint32 other) -{ - sec-=other; - return *this; -} - - -Wtime Wtime::operator - (uint32 other) -{ - Wtime temp(*this); - temp-=other; - return(temp); -} - - -Wtime Wtime::operator + (uint32 other) -{ - Wtime temp(*this); - temp+=other; - return(temp); -} - - -Wtime &Wtime::operator = (const uint32 other) -{ - sign=POSITIVE; - sec=other; - usec=0; - return *this; -} diff --git a/Generals/Code/Tools/mangler/wlib/wtime.h b/Generals/Code/Tools/mangler/wlib/wtime.h deleted file mode 100644 index 3f0d1cf723a..00000000000 --- a/Generals/Code/Tools/mangler/wlib/wtime.h +++ /dev/null @@ -1,128 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -wtime Neal Kettler - -\****************************************************************************/ -#ifndef WTIME_HEADER -#define WTIME_HEADER - - -#include -#include -#include -#include - -#ifndef _WINDOWS -#include -#include -#include -#else -#include -#include -#endif - -#include -#include - -#include "wstypes.h" - -class Wtime -{ - public: - - enum - { - POSITIVE=0, - NEGATIVE=1 - }; - - Wtime(); // init to system time - Wtime( Wtime &other ); - Wtime( uint32 other ); - ~Wtime(); - - void Update(); // Update members sec & usec to system time - - - void PrintTime(FILE *out) const; - void PrintTime(char *out) const; - void PrintDate(FILE *out) const; - void PrintDate(char *out) const; - - uint32 GetSec(void) const; // Get member variable 'sec' - uint32 GetUsec(void) const; // Get member variable 'usec' - void SetSec(uint32 newsec); - void SetUsec(uint32 newusec); - void Set(uint32 newsec,uint32 newusec); - bit8 ParseDate(char *in); - bit8 FormatTime(char *out, const char *format); - - struct timeval *GetTimeval(void); - void GetTimevalMT(struct timeval &tv); - - uint32 GetSecond(void) const; // Second (0- 60) (60 is for a leap second) - uint32 GetMinute(void) const; // Minute (0 - 59) - uint32 GetHour(void) const; // Hour (0-23) - uint32 GetMDay(void) const; // Day of Month (1-31) - uint32 GetWDay(void) const; // Day of Week (1-7) - uint32 GetYDay(void) const; // Day of Year (1-366) - uint32 GetMonth(void) const; // Month (1-12) - uint32 GetYWeek(void) const; // Week of Year (1-53) - uint32 GetYear(void) const; // Year (e.g. 1997) - - bit8 GetSign(void) const; // 0 = pos 1 = neg - - int Compare(const Wtime &other) const; - - // comparisons - bit8 operator == ( const Wtime &other ) const; - bit8 operator != ( const Wtime &other ) const; - bit8 operator < ( const Wtime &other ) const; - bit8 operator > ( const Wtime &other ) const; - bit8 operator <= ( const Wtime &other ) const; - bit8 operator >= ( const Wtime &other ) const; - - // assignments - Wtime &operator = (const Wtime &other); - Wtime &operator = (const uint32 other); - - // math - // signed - void SignedAdd(const Wtime &other); - void SignedSubtract(const Wtime &other); - - // unsigned - Wtime &operator += (const Wtime &other); - Wtime &operator -= (const Wtime &other); - Wtime operator + (Wtime &other); - Wtime operator - (Wtime &other); - - Wtime &operator += (const uint32 other); - Wtime &operator -= (const uint32 other); - Wtime operator + (uint32 other); - Wtime operator - (uint32 other); - - protected: - uint32 sec; // seconds since Jan 1, 1970 - uint32 usec; // microseconds (millionths of a second) - bit8 sign; // for time differences 0 = pos 1 = neg -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wlib/xtime.cpp b/Generals/Code/Tools/mangler/wlib/xtime.cpp deleted file mode 100644 index 28181d6f36b..00000000000 --- a/Generals/Code/Tools/mangler/wlib/xtime.cpp +++ /dev/null @@ -1,1015 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ - -xtime Neal Kettler - -Improved version of the Wtime library (V->W->X...) - -Handles signed times better and dates long -long long after you'll be dead. - -\****************************************************************************/ - -#include -#include -#ifndef _WINDOWS -#include -#endif -#include "xtime.h" - -static const char *DAYS[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; - -static const char *FULLDAYS[]={"Sunday","Monday","Tuesday","Wednesday","Thursday", - "Friday","Saturday"}; - -static const char *MONTHS[]={"Jan","Feb","Mar","Apr","May","Jun","Jul", - "Aug","Sep","Oct","Nov","Dec"}; - -static const char *FULLMONTHS[]={"January","February","March","April","May","June", - "July","August","September","October","November","December"}; - - -#define IS_LEAP(y) ((y) % 4) == 0 && (! ((y) % 100) == 0 || ((y) % 400) == 0) -#define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400) - - -/////////////// Utility functions /////////////////// - -// -// Return the daycount since year 0 for the specified date. -// month = 1-12, day = 1-31 year = 0... -// -static sint32 Get_Day(int month, int day, int year) -{ - time_t days; - - static int DaysAtMonth[] = - {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; - - /* Add up number of straight days + number of leap days + days */ - /* up to the month + the day of month. */ - - days = (year * 365) + (year / 4) - (year / 100) + (year / 400) + - DaysAtMonth[month-1] + day; - - /* If we haven't hit Feb 29, and this is a leap year, we need to */ - /* subtract out the leap day that was added above for this year */ - - if (month < 3 && IS_LEAP(year)) - --days; - return(days); -} - - - -// -// Get the year from a daycount since year 0 -// Also get the daycount since the start of the year -// -// Ayecarumba what a pain in the ass! -// -static bit8 Get_Date_From_Day(sint32 days, OUT sint32 &year, OUT sint32 &yday) -{ - //register long int rem; - register long int y; - //register const unsigned short int *ip; - - if (days <= 365) - { - year=0; - yday=days+1; // 1 based - return(TRUE); - } - - y = 1; - days-=365; - - days--; // zero based - - // - // As far as I can tell there's no non-iteritive way to - // do this... - // - while (days < 0 || days >= (IS_LEAP (y) ? 366 : 365)) - { - /* Guess a corrected year, assuming 365 days per year. */ - long int yg = y + days / 365 - (days % 365 < 0); - - /* Adjust DAYS and Y to match the guessed year. */ - days -= ((yg - y) * 365 - + LEAPS_THRU_END_OF (yg - 1) - - LEAPS_THRU_END_OF (y - 1)); - y = yg; - } - year=y; - yday=days+1; // 1 based - return(TRUE); -} - - -// -// Get the max day of a given month in a given year -// -int Max_Day(int month, int year) -{ - static char dayTable[2][13] = { - {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, - {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} - }; - bit8 isleap=IS_LEAP(year); - return(dayTable[isleap][month]); -} - - - -/********************************************************** -int main(int argc, char *argv[]) -{ - Xtime wtime; - int month,mday,year,hour,minute,second,day; - int i; - int dayoffset; - int yr; - int yday; - int ydaycount; - - wtime.set(719528,0); - -*********************************************** - for (year=0; year<10000; year++) - { - ydaycount=1; - for (month=1; month<=12; month++) - { - for (day=1; day<=Max_Day(month,year); day++) - { - dayoffset=Get_Day(month,day,year); - assert (GetDateFromDay(dayoffset,yr,yday)==TRUE); - - //printf("Yday=%d YdayCount=%d\n",yday,ydaycount); - - if (yr!=year) - { - printf("MO=%d DAY=%d YEAR=%d YR=%d\n",month,day,year,yr); - assert(0); - } - if (yday != ydaycount) - { - printf("MO=%d DAY=%d YEAR=%d YR=%d\n",month,day,year,yr); - printf("Yday=%d YdayCount=%d\n",yday,ydaycount); - assert(0); - } - ydaycount++; - } - } - printf("(%d) ",year); - } -*************************************** - - ///////wtime.addSeconds((60*60*24)-(60*60*8)); - ////////wtime.addSeconds(-(60*60*8)); // timezone delta - - dayoffset=Get_Day(1,1,1970); - printf("DAYOFFSET = %d\n",dayoffset); - - - wtime.getTime(month, mday, year, hour, minute, second); - printf("\n%s %d %d %d:%02d:%02d\n\n", - MONTHS[month-1],mday,year,hour,minute,second); - - struct timeval unixtime; - struct timezone unixtzone; - time_t ttime; - tm tmtime; - - memset(&tmtime,0,sizeof(tmtime)); - ttime=0; - unixtime.tv_sec=0; - unixtime.tv_usec=0; - - //gettimeofday(&unixtime,&unixtzone); - //ttime=time(NULL); - tmtime=*gmtime(&ttime); - - printf("TIME->CTIME = %s\n",ctime(&ttime)); - printf("GTOD->CTIE = %s\n",ctime(&(unixtime.tv_sec))); - printf("TIME->GMT->ASCTIME = %s\n",asctime(&tmtime)); -} -***************************************************************/ - - - -// -// Construct with current clock time -// -Xtime::Xtime(void) -{ - update(); -} - -// -// Copy constructor -// -Xtime::Xtime( Xtime &other ) -{ - day_=other.day_; - msec_=other.msec_; -} - -// -// Set to a time_t (1970-2038) -// -Xtime::Xtime( time_t other ) -{ - day_=719528; // days from year 0 to Jan1, 1970 - // Add seconds from time_t - addSeconds(other); - msec_=0; -} - -Xtime::~Xtime() -{ -} - -// -// Add some number of seconds to the time (seconds can be negative) -// -void Xtime::addSeconds(sint32 seconds) -{ - // Add to day counter first - day_+=(seconds/86400); - msec_+=(seconds % 86400)*1000; - - // Now normalize in case msec is > 1 days worth - normalize(); -} - -// -// If msec is > 1 days worth, adjust the day count -// & decrement the msec counter until OK. -// -void Xtime::normalize(void) -{ - day_+=(msec_/86400000); - msec_%=86400000; - - while (msec_ < 0) - { - day_--; - msec_+=86400000; - } -} - -// -// Update time to hold the current clock time -// (breaks in 2038 :-) -// -void Xtime::update(void) -{ - day_=719528; // day_s from year 0 to Jan1, 1970 - msec_=0; - - #ifdef _WINDOWS - struct _timeb wintime; - _ftime(&wintime); - addSeconds(wintime.time); - msec_+=wintime.millitm; - #endif - #ifndef _WINDOWS - struct timeval unixtime; - struct timezone unixtzone; - gettimeofday(&unixtime,&unixtzone); - addSeconds(unixtime.tv_sec); - msec_+=(unixtime.tv_usec/1000); - #endif - - // Now normalize in case msec is > 1 days worth - normalize(); -} - - -// This takes the standard Microsoft time formatting string -// make sure the out string is big enough -// An example format would be "mm/dd/yy hh:mm:ss" -// CHANGE: Joe Howes 06/30/99 -// To specify 12-hour format, use "aa" instead of "hh". -// The hours will be 12 hour and the string will be -// appended with " AM" or " PM". -bit8 Xtime::FormatTime(char *out, const char *format) -{ - int lastWasH=0; - int ampmflag = 0; - out[0]=0; - const char *ptr=format; - - if (*ptr=='"') ptr++; // skip past open quote if exists - - while (*ptr!=0) - { - if (lastWasH>0) - lastWasH--; - - if (isspace(*ptr)) - { - if (lastWasH==1) lastWasH=2; - sprintf(out+strlen(out),"%c",*ptr); - ptr+=1; - } - else if (strncmp(ptr,"\"",1)==0) - { - break; - } - else if (strncmp(ptr,":",1)==0) - { - if (lastWasH==1) lastWasH=2; - sprintf(out+strlen(out),":"); - ptr+=1; - } - else if (strncmp(ptr,"/",1)==0) - { - sprintf(out+strlen(out),"/"); - ptr+=1; - } - else if (strncmp(ptr,"c",1)==0) - { - sprintf(out+strlen(out),"%ld/%ld/%02ld %ld:%02ld:%02ld",getMonth(), - getMDay(),getYear()%100,getHour(),getMinute(),getSecond()); - ptr+=1; - } - else if (strncmp(ptr,"dddddd",6)==0) - { - sprintf(out+strlen(out),"%s %02ld, %ld",FULLMONTHS[getMonth()-1], - getMDay(),getYear()); - ptr+=6; - } - else if (strncmp(ptr,"ddddd",5)==0) - { - sprintf(out+strlen(out),"%ld/%ld/%02ld",getMonth(),getMDay(), - getYear()%100); - ptr+=5; - } - /*else if (strncmp(ptr,"dddd",4)==0) - { - sprintf(out+strlen(out),"%s",FULLDAYS[getWDay()-1]); - ptr+=4; - } - else if (strncmp(ptr,"ddd",3)==0) - { - sprintf(out+strlen(out),"%s",DAYS[getWDay()-1]); - ptr+=3; - }*/ - else if (strncmp(ptr,"dd",2)==0) - { - sprintf(out+strlen(out),"%02ld",getMDay()); - ptr+=2; - } - else if (strncmp(ptr,"d",1)==0) - { - sprintf(out+strlen(out),"%ld",getMDay()); - ptr+=1; - } - /*else if (strncmp(ptr,"ww",2)==0) - { - sprintf(out+strlen(out),"%02ld",getYWeek()); - ptr+=2; - }*/ - /*else if (strncmp(ptr,"w",1)==0) - { - sprintf(out+strlen(out),"%ld",getWDay()); - ptr+=1; - }*/ - else if (strncmp(ptr,"mmmm",4)==0) - { - sprintf(out+strlen(out),"%s",FULLMONTHS[getMonth()-1]); - ptr+=4; - } - else if (strncmp(ptr,"mmm",3)==0) - { - sprintf(out+strlen(out),"%s",MONTHS[getMonth()-1]); - ptr+=3; - } - else if (strncmp(ptr,"mm",2)==0) - { - if (lastWasH==1) - sprintf(out+strlen(out),"%02ld",getMinute()); - else - sprintf(out+strlen(out),"%02ld",getMonth()); - ptr+=2; - } - else if (strncmp(ptr,"m",1)==0) - { - if (lastWasH==1) - sprintf(out+strlen(out),"%ld",getMinute()); - else - sprintf(out+strlen(out),"%ld",getMonth()); - ptr+=1; - } - else if (strncmp(ptr,"q",1)==0) - { - sprintf(out+strlen(out),"%ld",((getMonth()-1)/4)+1); // GetQuarter - ptr+=1; - } - else if (strncmp(ptr,"yyyy",4)==0) - { - sprintf(out+strlen(out),"%ld",getYear()); - ptr+=4; - } - else if (strncmp(ptr,"yy",2)==0) - { - sprintf(out+strlen(out),"%02ld",getYear()%100); - ptr+=2; - } - /*else if (strncmp(ptr,"y",1)==0) - { - sprintf(out+strlen(out),"%ld",getYDay()); - ptr+=1; - }*/ - else if (strncmp(ptr,"hh",2)==0) - { - sprintf(out+strlen(out),"%02ld",getHour()); - lastWasH=2; // needs to be 1 after top of loop decs it - ptr+=2; - } - else if (strncmp(ptr,"h",1)==0) - { - sprintf(out+strlen(out),"%ld",getHour()); - lastWasH=2; // needs to be 1 after top of loop decs it - ptr+=1; - } - else if (strncmp(ptr,"nn",2)==0) - { - sprintf(out+strlen(out),"%02ld",getMinute()); - ptr+=2; - } - else if (strncmp(ptr,"n",1)==0) - { - sprintf(out+strlen(out),"%ld",getMinute()); - ptr+=1; - } - else if (strncmp(ptr,"ss",2)==0) - { - sprintf(out+strlen(out),"%02ld",getSecond()); - ptr+=2; - } - else if (strncmp(ptr,"s",1)==0) - { - sprintf(out+strlen(out),"%ld",getSecond()); - ptr+=1; - } - else if (strncmp(ptr,"ttttt",5)==0) - { - sprintf(out+strlen(out),"%ld:%02ld:%02ld",getHour(),getMinute(), - getSecond()); - ptr+=5; - } - else if (strncmp(ptr,"aa",2)==0) - { - uint32 tmp = (getHour() <= 12) ? getHour() : getHour() - 12; - sprintf(out+strlen(out),"%02ld", tmp); - lastWasH=2; // needs to be 1 after top of loop decs it - ptr+=2; - ampmflag = 1; - } - else // an unknown char, move to next - ptr++; - } - if(ampmflag) - { - char ampm[4]; - if( getHour() < 12 ) - strcpy(ampm, " AM"); - else - strcpy(ampm, " PM"); - sprintf(out+strlen(out), "%s", ampm); - } - return(TRUE); -} - -/************************************** - - REPLACE THIS CRAP - -// Parses a date string that's in modified RFC 1123 format -// Can have a +minutes after the normal time -// eg: Thu, 20 Jun 1996 17:33:49 +100 -// Returns true if successfully parsed, false otherwise -bit8 Xtime::ParseDate(char *in) -{ - int i; - uint32 minOffset; - struct tm t; - char *ptr=in; - while ((!isgraph(*ptr))&&(*ptr!=0)) ptr++; // skip to start of string - if (*ptr==0) return(FALSE); - t.tm_wday_=-1; - for (i=0; i<7; i++) // parse day_ of week - if (strncmp(ptr,DAYS[i],strlen(DAYS[i]))==0) - t.tm_wday_=i; - if (t.tm_wday_==-1) - return(FALSE); - while ((!isdigit(*ptr))&&(*ptr!=0)) ptr++; // skip to day_ of month - if (*ptr==0) return(FALSE); - t.tm_mday_=atoi(ptr); - while ((!isalpha(*ptr))&&(*ptr!=0)) ptr++; // skip to month - if (*ptr==0) return(FALSE); - t.tm_mon=-1; - for (i=0; i<12; i++) // match month - if (strncmp(ptr,MONTHS[i],strlen(MONTHS[i]))==0) t.tm_mon=i; - if (t.tm_mon==-1) return(FALSE); - while ((!isdigit(*ptr))&&(*ptr!=0)) ptr++; - if (*ptr==0) return(FALSE); - t.tm_year=atoi(ptr); - if (t.tm_year<70) // if they specify a 2 digit year, we'll be nice - t.tm_year+=2000; - else if (t.tm_year<100) - t.tm_year+=1900; - if (t.tm_year>2200) // I doubt my code will be around for another 203 years - return(FALSE); - while ((isdigit(*ptr))&&(*ptr!=0)) ptr++; // skip to end of year - if (*ptr==0) return(FALSE); - - while ((!isgraph(*ptr))&&(*ptr!=0)) ptr++; // skip to start of time - if (*ptr==0) return(FALSE); - - t.tm_hour=atoi(ptr); - while ((*ptr!=':')&&(*ptr!=0)) ptr++; - ptr++; // skip past colon - if (*ptr==0) return(FALSE); - t.tm_min=atoi(ptr); - while ((*ptr!=':')&&(*ptr!=0)) ptr++; - ptr++; // skip past colon - if (*ptr==0) return(FALSE); - t.tm_sec=atoi(ptr); - t.tm_year%=100; // 1996 is stored as 96, not 1996 - t.tm_isdst=-1; // day_light savings info isn't available - - sec=(uint32)(mktime(&t)); - if ((sint32)sec==-1) - return(FALSE); - - - // The next part of the time is OPTIONAL (+minutes) - - // first skip past the seconds - while ((isdigit(*ptr))&&(*ptr!=0)) ptr++; - if (*ptr==0) return(TRUE); - - // skip past any spaces - while ((isspace(*ptr))&&(*ptr!=0)) ptr++; - if (*ptr!='+') - { - //printf("\nNOPE ptr was '%s'\n",ptr); - return(TRUE); - } - ptr++; - if (*ptr==0) - { - //printf("\nPTR WAS 0\n"); - return(TRUE); - } - - minOffset=atol(ptr); - //printf("\n\nAdding %d minutes!\n\n",minOffset); - sec+=minOffset*60; // add the minutes as seconds - return(TRUE); -} - - - -// In addition to PrintTime & PrintDate there is the 'Print' function -// which prints both in RFC 1123 format - -void Xtime::PrintTime(FILE *out) const -{ - char string[80]; - PrintTime(string); - fprintf(out,"%s",string); -} - -void Xtime::PrintTime(char *out) const -{ - sprintf(out," %02lu:%02lu:%02lu",GetHour(),GetMinute(),GetSecond()); -} - -void Xtime::PrintDate(FILE *out) const -{ - char string[80]; - PrintDate(string); - fprintf(out,"%s",string); -} - -void Xtime::PrintDate(char *out) const -{ - sprintf(out,"%s, %lu %s %lu",DAYS[GetWDay()-1],GetMDay(),MONTHS[GetMonth()-1], - GetYear()); -} -********************************************/ - -// Get day_s since year 0 -sint32 Xtime::getDay(void) const -{ - return(day_); -} - -// Get msecs since start of day -sint32 Xtime::getMsec(void) const -{ - return(msec_); -} - -// Set days since year 0 -void Xtime::setDay(sint32 newday) -{ - day_=newday; -} - -// Set msec since start of this day -void Xtime::setMsec(sint32 newmsec) -{ - msec_=newmsec; -} - -// Set both -void Xtime::set(sint32 newday, sint32 newmsec) -{ - day_=newday; - msec_=newmsec; -} - - -// -// Get a timeval ptr from a Xtime class -// May fail if timeval can't hold a year this big or small -// -bit8 Xtime::getTimeval(struct timeval &tv) -{ - // A timeval can only hold dates from 1970-2038 - if ((day_ < 719528) || (day_ >= 719528+24855)) - return(FALSE); - - // Compute seconds since Jan 1, 1970 - uint32 seconds=day_-719528; - seconds*=(60*60*24); - seconds+=(msec_/1000); - - tv.tv_sec=seconds; - tv.tv_usec=(msec_%1000)*1000; - return(TRUE); -} - -// -// Set the time -// -bit8 Xtime::setTime(int month, int mday, int year, int hour, int minute, int second) -{ - day_=Get_Day(month,mday,year); - msec_=(hour*1000*60*60)+(minute*1000*60)+(second*1000); - return(TRUE); -} - - - -int Xtime::getYDay(void) const // Day of Year (1-366) (366 = leap yr) -{ - int year; - sint32 dayofyear; - if (Get_Date_From_Day(day_,year,dayofyear)==FALSE) - return(-1); - return dayofyear; -} - - -// -// Get all the components of the time in the usual normalized format. -// -// Most of the uglyness is in Get_Date_From_Day() -// -bit8 Xtime::getTime(int &month, int &mday, int &year, int &hour, int &minute, int &second) const -{ - int i; - sint32 dayofyear; - if (Get_Date_From_Day(day_,year,dayofyear)==FALSE) - return(FALSE); - - static int DaysAtMonth[2][12] = { - {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}, // normal - {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335} // leap year - }; - - month=0; - - bit8 isleap=IS_LEAP(year); - for (i=0; i<12; i++) - { - if (DaysAtMonth[isleap][i] >= dayofyear) - break; - month=i; - } - month++; // 1 based - - mday=dayofyear-DaysAtMonth[isleap][month-1]; - - // Whew! Now all we have to do is figure out H/M/S from the msec! - hour=(msec_/3600000)%24; // 1000*60*60 - minute=(msec_/60000)%60; // 1000*60 - second=(msec_/ 1000)%60; // 1000 - - return(TRUE); -} - -// -// These are for getting components of the time in the -// standard ranges. Like Day 1-31, Second 0-59, etc... -// -int Xtime::getSecond(void) const -{ - int month,mday,year,hour,minute,second; - getTime(month, mday, year, hour, minute, second); - return(second); -} -int Xtime::getMinute(void) const -{ - int month,mday,year,hour,minute,second; - getTime(month, mday, year, hour, minute, second); - return(minute); -} -int Xtime::getHour(void) const -{ - int month,mday,year,hour,minute,second; - getTime(month, mday, year, hour, minute, second); - return(hour); -} -int Xtime::getMDay(void) const -{ - int month,mday,year,hour,minute,second; - getTime(month, mday, year, hour, minute, second); - return(mday); -} - -int Xtime::getMonth(void) const -{ - int month,mday,year,hour,minute,second; - getTime(month, mday, year, hour, minute, second); - return(month); -} - -// based at year 0 (real 0, not 1970) -int Xtime::getYear(void) const -{ - int month,mday,year,hour,minute,second; - getTime(month, mday, year, hour, minute, second); - return(year); -} - - -// -// Set the seconds value (0-59) -// -bit8 Xtime::setSecond(sint32 sec) -{ - sint32 second=(msec_/ 1000)%60; - msec_-=(second*1000); - msec_+=(sec*1000); - return(TRUE); -} - -// -// Set the minutes value (0-59) -// -bit8 Xtime::setMinute(sint32 min) -{ - sint32 minute=(msec_/60000)%60; // 1000*60 - msec_-=(minute*60000); - msec_+=(min*60000); - return(TRUE); -} - -// -// Set the minutes value (0-23) -// -bit8 Xtime::setHour(sint32 hour) -{ - hour=(msec_/3600000)%24; // 1000*60*60 - msec_-=(hour*3600000); - msec_+=(hour*3600000); - return(TRUE); -} - -// -// Set the year value -// Results are undefined if you're moving from Feb 29, to a non leap year -// -bit8 Xtime::setYear(sint32 _year) -{ - // extract the date - int month,mday,year,hour,min,sec; - getTime(month,mday,year,hour,min,sec); - - // modify & rebuild - year=_year; - day_=Get_Day(month,mday,year); - return(TRUE); -} - -// -// Modify the month -// -bit8 Xtime::setMonth(sint32 _month) -{ - // extract the date - int month,mday,year,hour,min,sec; - getTime(month,mday,year,hour,min,sec); - - // modify & rebuild - month=_month; - day_=Get_Day(month,mday,year); - return(TRUE); -} - - -// -// Modify the day of the month -// -bit8 Xtime::setMDay(sint32 _mday) -{ - // extract the date - int month,mday,year,hour,min,sec; - getTime(month,mday,year,hour,min,sec); - - // modify & rebuild - mday=_mday; - day_=Get_Day(month,mday,year); - return(TRUE); -} - - -// -// Compare two times. The time better be normalized -// which it would be unless you've put bad stuff in it! -// -// 1 = *this > other -//-1 = *this < other -// 0 = *this == other -int Xtime::compare(const Xtime &other) const -{ - if ((day_==other.day_)&&(msec_==other.msec_)) - return(0); // equal - - else if (day_>other.day_) - return(1); - else if (day_other.msec_) - return(1); - else - return(-1); -} - - -bit8 Xtime::operator == ( const Xtime &other ) const -{ - bit8 retval=compare(other); - if (retval==0) - return(TRUE); - else - return(FALSE); -} - -bit8 Xtime::operator != ( const Xtime &other ) const -{ - bit8 retval=compare(other); - if (retval==0) - return(FALSE); - else - return(TRUE); -} - -bit8 Xtime::operator < ( const Xtime &other ) const -{ - int retval=compare(other); - if (retval==-1) - return(TRUE); - else - return(FALSE); -} - -bit8 Xtime::operator > ( const Xtime &other ) const -{ - int retval=compare(other); - if (retval==1) - return(TRUE); - else - return(FALSE); -} - -bit8 Xtime::operator <= ( const Xtime &other ) const -{ - int retval=compare(other); - if ((retval==-1)||(retval==0)) - return(TRUE); - else - return(FALSE); -} - -bit8 Xtime::operator >= ( const Xtime &other ) const -{ - int retval=compare(other); - if ((retval==1)||(retval==0)) - return(TRUE); - else - return(FALSE); -} - - -Xtime &Xtime::operator += (const Xtime &other) -{ - day_+=other.day_; - msec_+=other.msec_; - normalize(); - return *this; -} - -Xtime &Xtime::operator -= (const Xtime &other) -{ - day_-=other.day_; - msec_-=other.msec_; - normalize(); - return *this; -} - -Xtime Xtime::operator - (Xtime &other) -{ - Xtime temp(*this); - temp-=other; - return(temp); -} - -Xtime Xtime::operator + (Xtime &other) -{ - Xtime temp(*this); - temp+=other; - return(temp); -} - - -Xtime &Xtime::operator = (const Xtime &other) -{ - day_=other.day_; - msec_=other.msec_; - return *this; -} - - -Xtime &Xtime::operator += (const time_t other) -{ - addSeconds(other); - return *this; -} - - -Xtime &Xtime::operator -= (const time_t other) -{ - addSeconds(-((sint32)other)); - return *this; -} - - -Xtime Xtime::operator - (time_t other) -{ - Xtime temp(*this); - temp-=other; - return(temp); -} - - -Xtime Xtime::operator + (time_t other) -{ - Xtime temp(*this); - temp+=other; - return(temp); -} - -Xtime &Xtime::operator = (const time_t other) -{ - msec_=0; - day_=719528; // Jan 1, 1970 - addSeconds(other); - return *this; -} diff --git a/Generals/Code/Tools/mangler/wlib/xtime.h b/Generals/Code/Tools/mangler/wlib/xtime.h deleted file mode 100644 index b6210eee2cf..00000000000 --- a/Generals/Code/Tools/mangler/wlib/xtime.h +++ /dev/null @@ -1,146 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -xtime Neal Kettler - -This is version 2 of the Wtime library (now xtime). It now supports -time storage from the year 0 to well after the sun -will have gone supernova (OK, OK I admit it'll break in the -year 5 Million.) - -The call to update the current time will break in 2038. -Hopefully by then somebody will replace the lame time() -function :-) -\****************************************************************************/ - -#ifndef XTIME_HEADER -#define XTIME_HEADER - - -#include -#include -#include -#include - -#ifndef _WINDOWS -#include -#include -#include -#else -#include -#include -#endif - -#include -#include - -#include "wstypes.h" - -class Xtime -{ - public: - - Xtime(); // init to system time - Xtime( Xtime &other ); - Xtime( time_t other ); // 1970-2038 - ~Xtime(); - - void addSeconds(sint32 seconds); - - bit8 getTime(int &month, int &mday, int &year, int &hour, int &minute, - int &second) const; - - bit8 setTime(int month, int mday, int year, int hour, int minute, - int second); - - void update(); // Update members sec & usec to system time - // This will break after 2038 - -/******** - void PrintTime(FILE *out) const; - void PrintTime(char *out) const; - void PrintDate(FILE *out) const; - void PrintDate(char *out) const; -**********/ - - sint32 getDay(void) const; // Get days since year 0 - sint32 getMsec(void) const; // Get milliseconds into the day - - void setDay(sint32 day); - void setMsec(sint32 msec); - - void set(sint32 newday, sint32 newmsec); - bit8 ParseDate(char *in); - bit8 FormatTime(char *out, const char *format); - - bit8 getTimeval(struct timeval &tv); - - // All of these may return -1 if the time is invalid - int getSecond(void) const; // Second (0-60) (60 is for a leap second) - int getMinute(void) const; // Minute (0-59) - int getHour(void) const; // Hour (0-23) - int getMDay(void) const; // Day of Month (1-31) - int getWDay(void) const; // Day of Week (1-7) - int getYDay(void) const; // Day of Year (1-366) (366 = leap yr) - int getMonth(void) const; // Month (1-12) - int getYWeek(void) const; // Week of Year (1-53) - int getYear(void) const; // Year (e.g. 1997) - - // Modify the time components. Return FALSE if fail - bit8 setSecond(sint32 sec); - bit8 setMinute(sint32 min); - bit8 setHour(sint32 hour); - bit8 setYear(sint32 year); - bit8 setMonth(sint32 month); - bit8 setMDay(sint32 mday); - - void normalize(void); // move msec overflows to the day - - // Compare two times - int compare(const Xtime &other) const; - - // comparisons - bit8 operator == ( const Xtime &other ) const; - bit8 operator != ( const Xtime &other ) const; - bit8 operator < ( const Xtime &other ) const; - bit8 operator > ( const Xtime &other ) const; - bit8 operator <= ( const Xtime &other ) const; - bit8 operator >= ( const Xtime &other ) const; - - // assignments - Xtime &operator = (const Xtime &other); - Xtime &operator = (const time_t other); - - // signed - Xtime &operator += (const Xtime &other); - Xtime &operator -= (const Xtime &other); - Xtime operator + (Xtime &other); - Xtime operator - (Xtime &other); - - Xtime &operator += (const time_t other); - Xtime &operator -= (const time_t other); - Xtime operator + (time_t other); - Xtime operator - (time_t other); - - protected: - sint32 day_; // days since Jan 1, 0 - sint32 msec_; // milliseconds (thousandths of a sec) -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wnet/Makefile b/Generals/Code/Tools/mangler/wnet/Makefile deleted file mode 100644 index e5321ff0a3b..00000000000 --- a/Generals/Code/Tools/mangler/wnet/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -########################################################################### -# TCP library makefile -########################################################################## - -#Define cc to be your C compiler -CC = g++ -CFLAGS = -gstabs ${INCLUDE} -D_REENTRANT #-DDEBUG - -#This tells make how to go from a .cpp to a .o -.SUFFIXES: .cpp -.cpp.o: - ${CC} ${CFLAGS} -c $< - -INCLUDE = -I.. -I. - -AR = ar -r -RM = rm -f -RANLIB = ranlib - -############################################################################ -#Dont mess with any of this stuff -OBJECTS = tcp.o udp.o packet.o field.o -LIBRARY = libwnet.a - -all: $(LIBRARY) - -$(LIBRARY): $(OBJECTS) - $(RM) $(LIBRARY) - $(AR) $(LIBRARY) $(OBJECTS) - $(RANLIB) $(LIBRARY) - -clean: - - rm -f $(LIBRARY) $(OBJECTS) core diff --git a/Generals/Code/Tools/mangler/wnet/field.cpp b/Generals/Code/Tools/mangler/wnet/field.cpp deleted file mode 100644 index 35973709371..00000000000 --- a/Generals/Code/Tools/mangler/wnet/field.cpp +++ /dev/null @@ -1,319 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/*************************************************************************** - * * - * Project Name : Westwood Auto Registration App * - * * - * File Name : FIELD.CPP * - * * - * Programmer : Philip W. Gorrow * - * * - * Start Date : 04/22/96 * - * * - * Last Update : April 22, 1996 [PWG] * - * * - * Actual member function for the field class. * - *-------------------------------------------------------------------------* - * Functions: * - * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#include -#include -#ifndef _WINDOWS -#include -#else -#define Win32_Winsock -#include -#endif -#include "field.h" - - -// private member func -void FieldClass::Clear(void) -{ - delete[](Data); - - strcpy(ID,""); - DataType=0; - Size=0; - Data=NULL; - Next=NULL; -} - - -FieldClass::FieldClass(char *id, char data) -{ - Data=NULL; - Set(id,data); -} - -FieldClass::FieldClass(char *id, unsigned char data) -{ - Data=NULL; - Set(id,data); -} - -FieldClass::FieldClass(char *id, short data) -{ - Data=NULL; - Set(id,data); -} - -FieldClass::FieldClass(char *id, unsigned short data) -{ - Data=NULL; - Set(id,data); -} - -FieldClass::FieldClass(char *id, long data) -{ - Data=NULL; - Set(id,data); -} - -FieldClass::FieldClass(char *id, unsigned long data) -{ - Data=NULL; - Set(id,data); -} - -FieldClass::FieldClass(char *id, char *data) -{ - Data=NULL; - Set(id,data); -} - -FieldClass::FieldClass(char *id, void *data, int length) -{ - Data=NULL; - Set(id,data,length); -} - -void FieldClass::Set(char *id, char data) -{ - FieldClass *Nextsave=Next; - - Clear(); - strncpy(ID, id, sizeof(ID)); - DataType = TYPE_CHAR; - Size = sizeof(data); - Data = new char[Size]; - memcpy(Data, &data, Size); - Next = Nextsave; -} - -void FieldClass::Set(char *id, unsigned char data) -{ - FieldClass *Nextsave=Next; - Clear(); - strncpy(ID, id, sizeof(ID)); - DataType = TYPE_UNSIGNED_CHAR; - Size = sizeof(data); - Data = new char[Size]; - memcpy(Data, &data, Size); - Next = Nextsave; -} - -void FieldClass::Set(char *id, short data) -{ - FieldClass *Nextsave=Next; - Clear(); - strncpy(ID, id, sizeof(ID)); - DataType = TYPE_SHORT; - Size = sizeof(data); - Data = new char[Size]; - memcpy(Data, &data, Size); - Next = Nextsave; -} - -void FieldClass::Set(char *id, unsigned short data) -{ - FieldClass *Nextsave=Next; - Clear(); - strncpy(ID, id, sizeof(ID)); - DataType = TYPE_UNSIGNED_SHORT; - Size = sizeof(data); - Data = new char[Size]; - memcpy(Data, &data, Size); - Next = Nextsave; -} - -void FieldClass::Set(char *id, long data) -{ - FieldClass *Nextsave=Next; - Clear(); - strncpy(ID, id, sizeof(ID)); - DataType = TYPE_LONG; - Size = sizeof(data); - Data = new char[Size]; - memcpy(Data, &data, Size); - Next = Nextsave; -} - -void FieldClass::Set(char *id, unsigned long data) -{ - FieldClass *Nextsave=Next; - Clear(); - strncpy(ID, id, sizeof(ID)); - DataType = TYPE_UNSIGNED_LONG; - Size = sizeof(data); - Data = new char[Size]; - memcpy(Data, &data, Size); - Next = Nextsave; -} - -void FieldClass::Set(char *id, char *data) -{ - FieldClass *Nextsave=Next; - Clear(); - strncpy(ID, id, sizeof(ID)); - DataType = TYPE_STRING; - Size = (unsigned short)(strlen(data)+1); - Data = new char[Size]; - memcpy(Data, data, Size); - Next = Nextsave; -} - - -void FieldClass::Set(char *id, void *data, int length) -{ - FieldClass *Nextsave=Next; - Clear(); - strncpy(ID, id, sizeof(ID)); - DataType = TYPE_CHUNK; - Size = (unsigned short)length; - Data = new char[Size]; - memcpy(Data, data, Size); - Next = Nextsave; -} - - -FieldClass::~FieldClass() -{ - Clear(); -} - -// Fetch the datatype -int FieldClass::Get_Type(void) -{ - return(DataType); -} - -void *FieldClass::Get_Data(void) -{ -return(Data); -} - -char *FieldClass::Get_ID(void) -{ -return(ID); -} - -/************************************************************************** - * PACKETCLASS::HOST_TO_NET_FIELD -- Converts host field to net format * - * * - * INPUT: FIELD * to the data field we need to convert * - * * - * OUTPUT: none * - * * - * HISTORY: * - * 04/22/1996 PWG : Created. * - *========================================================================*/ -void FieldClass::Host_To_Net(void) -{ - // - // Before we convert the data type, we should convert the actual data - // sent. - // - switch (DataType) { - case TYPE_CHAR: - case TYPE_UNSIGNED_CHAR: - case TYPE_STRING: - break; - - case TYPE_SHORT: - case TYPE_UNSIGNED_SHORT: - *((unsigned short *)Data) = htons(*((unsigned short *)Data)); - break; - - case TYPE_LONG: - case TYPE_UNSIGNED_LONG: - *((unsigned long *)Data) = htonl(*((unsigned long *)Data)); - break; - - // - // Might be good to insert some type of error message here for unknown - // datatypes -- but will leave that for later. - // - default: - break; - } - // - // Finally convert over the data type and the size of the packet. - // - DataType = htons(DataType); - Size = htons(Size); -} - -/************************************************************************** - * PACKETCLASS::NET_TO_HOST_FIELD -- Converts net field to host format * - * * - * INPUT: FIELD * to the data field we need to convert * - * * - * OUTPUT: none * - * * - * HISTORY: * - * 04/22/1996 PWG : Created. * - *========================================================================*/ -void FieldClass::Net_To_Host(void) -{ - // - // Finally convert over the data type and the size of the packet. - // - DataType = ntohs(DataType); - Size = ntohs(Size); - - // - // Before we convert the data type, we should convert the actual data - // sent. - // - switch (DataType) { - case TYPE_CHAR: - case TYPE_UNSIGNED_CHAR: - case TYPE_STRING: - break; - - case TYPE_SHORT: - case TYPE_UNSIGNED_SHORT: - *((unsigned short *)Data) = ntohs(*((unsigned short *)Data)); - break; - - case TYPE_LONG: - case TYPE_UNSIGNED_LONG: - *((unsigned long *)Data) = ntohl(*((unsigned long *)Data)); - break; - - // - // Might be good to insert some type of error message here for unknown - // datatypes -- but will leave that for later. - // - default: - break; - } -} - diff --git a/Generals/Code/Tools/mangler/wnet/field.h b/Generals/Code/Tools/mangler/wnet/field.h deleted file mode 100644 index 8a58f68f551..00000000000 --- a/Generals/Code/Tools/mangler/wnet/field.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/*************************************************************************** - * * - * Project Name : Westwood Auto Registration App * - * * - * File Name : FIELD.H * - * * - * Programmer : Philip W. Gorrow * - * * - * Start Date : 04/22/96 * - * * - * Last Update : April 22, 1996 [PWG] * - * * - * This module takes care of maintaining the field list used to process * - * packets. * - * * - *-------------------------------------------------------------------------* - * Functions: * - * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - -#define FIELD_HEADER_SIZE (sizeof(FieldClass) - (sizeof(void *) * 2)) - -#define TYPE_CHAR 1 -#define TYPE_UNSIGNED_CHAR 2 -#define TYPE_SHORT 3 -#define TYPE_UNSIGNED_SHORT 4 -#define TYPE_LONG 5 -#define TYPE_UNSIGNED_LONG 6 -#define TYPE_STRING 7 -#define TYPE_CHUNK 20 - -class PacketClass; - -class FieldClass -{ - public: - friend PacketClass; - // - // Define constructors to be able to create all the different kinds - // of fields. - // - FieldClass(void) {}; - FieldClass(char *id, char data); - FieldClass(char *id, unsigned char data); - FieldClass(char *id, short data); - FieldClass(char *id, unsigned short data); - FieldClass(char *id, long data); - FieldClass(char *id, unsigned long data); - FieldClass(char *id, char *data); - FieldClass(char *id, void *data, int length); - - ~FieldClass(); - - // Change the field contents - void Set(char *id, char data); - void Set(char *id, unsigned char data); - void Set(char *id, short data); - void Set(char *id, unsigned short data); - void Set(char *id, long data); - void Set(char *id, unsigned long data); - void Set(char *id, char *data); - void Set(char *id, void *data, int length); - - int Get_Type(void); // get the datatype of this field - unsigned short Get_Size(void) { return Size; } - void * Get_Data(void); // get the datatype of this field - char * Get_ID(void); // get the datatype of this field - - void Host_To_Net(void); - void Net_To_Host(void); - - private: - - void Clear(void); // dealloc mem & zero safely - - char ID[4]; // id value of this field - unsigned short DataType; // id of the data type we are using - unsigned short Size; // size of the data portion of this field - char *Data; // pointer to the data portion of this field - FieldClass *Next; // pointer to the next field in the field list -}; - - - diff --git a/Generals/Code/Tools/mangler/wnet/packet.cpp b/Generals/Code/Tools/mangler/wnet/packet.cpp deleted file mode 100644 index a2741dbe481..00000000000 --- a/Generals/Code/Tools/mangler/wnet/packet.cpp +++ /dev/null @@ -1,522 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/*************************************************************************** - * * - * Project Name : Westwood Auto Registration App * - * * - * File Name : PACKET.CPP * - * * - * Programmer : Philip W. Gorrow * - * * - * Start Date : 04/22/96 * - * * - * Last Update : April 24, 1996 [PWG] * - * * - *-------------------------------------------------------------------------* - * Functions: * - * *PacketClass::Find_Field -- Finds a field if it exists in the packets * - * Get_Field -- Find specified name and returns data * - * PacketClass::~PacketClass -- destroys a packet class be freeing list * - * PacketClass::Add_Field -- Adds a FieldClass entry to head of packet li* - * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#include -#include -#include -#include -#ifndef _WINDOWS -#include -#else -#define Win32_Winsock -#include -#endif - -#include "packet.h" - - -/************************************************************************** - * PACKETCLASS::~PACKETCLASS -- destroys a packet class be freeing list * - * * - * INPUT: none * - * * - * OUTPUT: none * - * * - * HISTORY: * - * 04/24/1996 PWG : Created. * - *========================================================================*/ -PacketClass::~PacketClass() -{ - FieldClass *current; - FieldClass *next; - - // - // Loop through the entire field list and delete each entry. - // - for (current = Head; current; current = next) { - next = current->Next; - delete(current); - } -} - - -/************************************************************************** - * PACKETCLASS::ADD_FIELD -- Adds a FieldClass entry to head of packet li * - * * - * INPUT: FieldClass * - a properly constructed field class entry. * - * * - * OUTPUT: none * - * * - * HISTORY: * - * 04/24/1996 PWG : Created. * - *========================================================================*/ -void PacketClass::Add_Field(FieldClass *field) -{ - field->Next = Head; - Head = field; -} - -/************************************************************************** - * PACKETCLASS::PACKETCLASS -- Creates a Packet object from a COMMS packe * - * * - * INPUT: * - * * - * OUTPUT: * - * * - * WARNINGS: * - * * - * HISTORY: * - * 04/22/1996 PWG : Created. * - *========================================================================*/ -PacketClass::PacketClass(char *curbuf) -{ - int remaining_size; - // - // Pull the size and packet ID out of the linear packet stream. - // - Size = *((unsigned short *)curbuf); - curbuf += sizeof(unsigned short); - Size = ntohs(Size); - ID = *((short *)curbuf); - curbuf += sizeof(unsigned short); - ID = ntohs(ID); - Head = NULL; - - // - // Calculate the remaining size so that we can loop through the - // packets and extract them. - // - remaining_size = Size - 4; - - // - // Loop through the linear packet until we run out of room and - // create a field for each. - // - while (remaining_size > 0) - { - FieldClass *field = new FieldClass; - - // - // Copy the adjusted header into the buffer and then advance the buffer - // - memcpy(field, curbuf, FIELD_HEADER_SIZE); - curbuf += FIELD_HEADER_SIZE; - remaining_size -= FIELD_HEADER_SIZE; - - // - // Copy the data into the buffer - // - int size = ntohs(field->Size); - field->Data = new char[size]; - memcpy(field->Data, curbuf, size); - curbuf += size; - remaining_size -= size; - - // - // Make sure we allow for the pad bytes. - // - int pad = (4 - (ntohs(field->Size) & 3)) & 3; - curbuf += pad; - remaining_size -= pad; - - // - // Convert the field back to the host format - // - field->Net_To_Host(); - - // - // Finally add the field to the field list in the packet - // structure. - // - Add_Field(field); - } -} - -/************************************************************************** - * CREATE_COMMS_PACKET -- Walks field list creating a packet * - * * - * INPUT: short - the id of the packet so the server can identify it * - * unsigned short & - the size of the packet returned here * - * * - * OUTPUT: void * pointer to the linear packet data * - * * - * WARNINGS: This routine allocates memory that the user is responsible * - * for freeing. * - * * - * HISTORY: * - * 04/22/1996 PWG : Created. * - *========================================================================*/ -char *PacketClass::Create_Comms_Packet(int &size) -{ - FieldClass *current; - - // - // Size starts at four because that is the size of the packet header. - // - size = 4; - - // - // Take a quick spin through and calculate the size of the packet we - // are building. - // - for (current = Head; current; current=current->Next) - { - size += (unsigned short)FIELD_HEADER_SIZE; // add in packet header size - size += current->Size; // add in data size - size += (4 - (size & 3)) & 3; // add in pad value to dword align next packet - } - - // - // Now that we know the size allocate a buffer big enough to hold the - // packet. - // - char *retval = new char[size]; - char *curbuf = retval; - - // - // write the size into the packet header - // - *((unsigned short *)curbuf) = (unsigned short)htons(size); - curbuf += sizeof(unsigned short); - *((short *)curbuf) = htons(ID); - curbuf += sizeof(unsigned short); - - // - // Ok now that the actual header information has been written we need to write out - // field information. - // - for (current = Head; current; current = current->Next) - { - // - // Temporarily convert the packet to net format (this saves alot of - // effort, and seems safe...) - // - current->Host_To_Net(); - - // - // Copy the adjusted header into the buffer and then advance the buffer - // - memcpy(curbuf, current, FIELD_HEADER_SIZE); - curbuf += FIELD_HEADER_SIZE; - - // - // Copy the data into the buffer and then advance the buffer - // - memcpy(curbuf, current->Data, ntohs(current->Size)); - curbuf += ntohs(current->Size); - - // - // Finally take care of any pad bytes by setting them to 0 - // - int pad = (4 - (ntohs(current->Size) & 3)) & 3; - curbuf += pad; - - current->Net_To_Host(); - } - return(retval); -} - - -/************************************************************************** - * PACKETCLASS::FIND_FIELD -- Finds a field if it exists in the packets * - * * - * INPUT: char * - the id of the field we are looking for. * - * * - * OUTPUT: FieldClass * pointer to the field class * - * * - * HISTORY: * - * 04/23/1996 PWG : Created. * - *========================================================================*/ -FieldClass *PacketClass::Find_Field(char *id) -{ - for (FieldClass *current = Head; current; current = current->Next) - { - if ( strncmp(id, current->ID, 4) == 0) - return current; - } - return NULL; -} - -// gks 9/25/2000 -FieldClass *PacketClass::Get_Field_At(int position) -{ - int i = 0; - FieldClass *current = Head; - for (; (current && (i < position)); current = current->Next, i++) { - } - - if (current) return current; - else return NULL; -} - -// gks 9/25/2000 -int PacketClass::Get_Num_Fields() -{ - int i = 0; - - for (FieldClass *current = Head; current; current = current->Next, i++) {} - - return i; - -} - - -/************************************************************************** - * GET_FIELD -- Find specified name and returns data * - * * - * INPUT: char * - the id of the field that holds the data. * - * char & - the reference to store the data into * - * * - * OUTPUT: true if the field was found, false if it was not. * - * * - * WARNINGS: The data reference is not changed if the field is not * - * found. * - * * - * HISTORY: * - * 04/23/1996 PWG : Created. * - *========================================================================*/ -bit8 PacketClass::Get_Field(char *id, char &data) -{ - FieldClass *field = Find_Field(id); - if (field) { - data = *((char *)field->Data); - } - return((field) ? true : false); -} - - -/************************************************************************** - * GET_FIELD -- Find specified name and returns data * - * * - * INPUT: char * - the id of the field that holds the data. * - * unsigned char & - the reference to store the data into * - * * - * OUTPUT: true if the field was found, false if it was not. * - * * - * WARNINGS: The data reference is not changed if the field is not * - * found. * - * * - * HISTORY: * - * 04/23/1996 PWG : Created. * - *========================================================================*/ -bit8 PacketClass::Get_Field(char *id, unsigned char &data) -{ - FieldClass *field = Find_Field(id); - if (field) { - data = *((unsigned char *)field->Data); - } - return((field) ? true : false); -} - - -/************************************************************************** - * GET_FIELD -- Find specified name and returns data * - * * - * INPUT: char * - the id of the field that holds the data. * - * short & - the reference to store the data into * - * * - * OUTPUT: true if the field was found, false if it was not. * - * * - * WARNINGS: The data reference is not changed if the field is not * - * found. * - * * - * HISTORY: * - * 04/23/1996 PWG : Created. * - *========================================================================*/ -bit8 PacketClass::Get_Field(char *id, short &data) -{ - FieldClass *field = Find_Field(id); - if (field) { - data = *((short *)field->Data); - } - return((field) ? true : false); -} - - -/************************************************************************** - * GET_FIELD -- Find specified name and returns data * - * * - * INPUT: char * - the id of the field that holds the data. * - * unsigned short & - the reference to store the data into * - * * - * OUTPUT: true if the field was found, false if it was not. * - * * - * WARNINGS: The data reference is not changed if the field is not * - * found. * - * * - * HISTORY: * - * 04/23/1996 PWG : Created. * - *========================================================================*/ -bit8 PacketClass::Get_Field(char *id, unsigned short &data) -{ - FieldClass *field = Find_Field(id); - if (field) { - data = *((unsigned short *)field->Data); - } - return((field) ? true : false); -} - - -/************************************************************************** - * GET_FIELD -- Find specified name and returns data * - * * - * INPUT: char * - the id of the field that holds the data. * - * long & - the reference to store the data into * - * * - * OUTPUT: true if the field was found, false if it was not. * - * * - * WARNINGS: The data reference is not changed if the field is not * - * found. * - * * - * HISTORY: * - * 04/23/1996 PWG : Created. * - *========================================================================*/ -bit8 PacketClass::Get_Field(char *id, long &data) -{ - FieldClass *field = Find_Field(id); - if (field) { - data = *((long *)field->Data); - } - return((field) ? true : false); -} - - - -bit8 PacketClass::Get_Field(char *id, int &data) -{ - FieldClass *field = Find_Field(id); - if (field) { - data = *((int *)field->Data); - } - return((field) ? true : false); -} - - - -/************************************************************************** - * GET_FIELD -- Find specified name and returns data as a string * - * * - * INPUT: char * - the id of the field that holds the data. * - * char * - the string to store the data into * - * * - * OUTPUT: true if the field was found, false if it was not. * - * * - * WARNINGS: The string is not changed if the field is not found. It * - * is assumed that the string variabled specified by the * - * pointer is large enough to hold the data. * - * * - * HISTORY: * - * 04/23/1996 PWG : Created. * - *========================================================================*/ -bit8 PacketClass::Get_Field(char *id, char *data) -{ - FieldClass *field = Find_Field(id); - if (field) { - strcpy(data, (char *)field->Data); - } - return((field) ? true : false); -} - -/************************************************************************** - * GET_FIELD -- Find specified name and returns data * - * * - * INPUT: char * - the id of the field that holds the data. * - * unsigned long & - the reference to store the data into * - * * - * OUTPUT: true if the field was found, false if it was not. * - * * - * WARNINGS: The data reference is not changed if the field is not * - * found. * - * * - * HISTORY: * - * 04/23/1996 PWG : Created. * - *========================================================================*/ -bit8 PacketClass::Get_Field(char *id, unsigned long &data) -{ - FieldClass *field = Find_Field(id); - if (field) { - data = *((unsigned long *)field->Data); - } - return((field) ? true : false); -} - -bit8 PacketClass::Get_Field(char *id, unsigned &data) -{ - FieldClass *field = Find_Field(id); - if (field) { - data = *((unsigned *)field->Data); - } - return((field) ? true : false); -} - - - -/************************************************************************** - * GET_FIELD -- Find specified name and returns data * - * * - * INPUT: char * - the id of the field that holds the data. * - * void * - the reference to store the data into * - * int - the length of the buffer passed in * - * * - * OUTPUT: true if the field was found, false if it was not. * - * * - * WARNINGS: The data reference is not changed if the field is not * - * found. * - * * - * HISTORY: * - * 6/4/96 4:46PM ST : Created * - *========================================================================*/ -bit8 PacketClass::Get_Field(char *id, void *data, int &length) -{ - FieldClass *field = Find_Field(id); - if (field) { - memcpy (data, field->Data, MIN(field->Size, length)); - length = (int) field->Size; - } - return((field) ? true : false); -} - - -unsigned short PacketClass::Get_Field_Size(char* id) -{ - FieldClass *field = Find_Field(id); - if (field) - return field->Get_Size(); - else - return 0; -} - diff --git a/Generals/Code/Tools/mangler/wnet/packet.h b/Generals/Code/Tools/mangler/wnet/packet.h deleted file mode 100644 index 1bd2141833c..00000000000 --- a/Generals/Code/Tools/mangler/wnet/packet.h +++ /dev/null @@ -1,108 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/*************************************************************************** - * * - * Project Name : Westwood Auto Registration App * - * * - * File Name : PACKET.H * - * * - * Programmer : Philip W. Gorrow * - * * - * Start Date : 04/19/96 * - * * - * Last Update : April 19, 1996 [PWG] * - * * - * This header defines the functions for the PacketClass. The packet * - * class is used to create a linked list of field entries which can be * - * converted to a linear packet in a COMMS API compatible format. * - * * - * Packets can be created empty and then have fields added to them or can * - * be created from an existing linear packet. * - * * - *-------------------------------------------------------------------------* - * Functions: * - * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - -#include "field.h" -#include - - -class PacketClass -{ - public: - - PacketClass(short id = 0) - { - Size = 0; - ID = id; - Head = 0; - } - PacketClass(char *cur_buf); - ~PacketClass(); - - // - // This function allows us to add a field to the start of the list. As the field is just - // a big linked list it makes no difference which end we add a member to. - // - void Add_Field(FieldClass *field); - - // - // These conveniance functions allow us to add a field directly to the list without - // having to worry about newing one first. - // - void Add_Field(char *field, char data) {Add_Field(new FieldClass(field, data));}; - void Add_Field(char *field, unsigned char data) {Add_Field(new FieldClass(field, data));}; - void Add_Field(char *field, short data) {Add_Field(new FieldClass(field, data));}; - void Add_Field(char *field, unsigned short data) {Add_Field(new FieldClass(field, data));}; - void Add_Field(char *field, long data) {Add_Field(new FieldClass(field, data));}; - void Add_Field(char *field, unsigned long data) {Add_Field(new FieldClass(field, data));}; - void Add_Field(char *field, char *data) {Add_Field(new FieldClass(field, data));}; - void Add_Field(char *field, void *data, int length) {Add_Field(new FieldClass(field, data, length));}; - - // - // These functions search for a field of a given name in the list and - // return the data via a reference value. - // - FieldClass *Find_Field(char *id); - - bit8 Get_Field(char *id, int &data); - bit8 Get_Field(char *id, char &data); - bit8 Get_Field(char *id, unsigned char &data); - bit8 Get_Field(char *id, short &data); - bit8 Get_Field(char *id, unsigned short &data); - bit8 Get_Field(char *id, long &data); - bit8 Get_Field(char *id, unsigned long &data); - bit8 Get_Field(char *id, unsigned &data); - bit8 Get_Field(char *id, char *data); - bit8 Get_Field(char *id, void *data, int &length); - unsigned short Get_Field_Size(char* id); - - // gks 9/25/2000 - FieldClass *Get_Field_At(int position); - int Get_Num_Fields(); - - char *Create_Comms_Packet(int &size); - - private: - unsigned short Size; - short ID; - FieldClass *Head; - FieldClass *Current; -}; - diff --git a/Generals/Code/Tools/mangler/wnet/tcp.cpp b/Generals/Code/Tools/mangler/wnet/tcp.cpp deleted file mode 100644 index 4c26d3231dd..00000000000 --- a/Generals/Code/Tools/mangler/wnet/tcp.cpp +++ /dev/null @@ -1,1242 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -TCP Neal Kettler neal@westwood.com -****************************************************************************** - -A general purpose TCP class that can be used in either CLIENT or -SERVER mode. Note that this uses non-blocking sockets. - -The FD_* macros: - - FD_CLR(int fd, fd_set *set); // clear a single FD - FD_ISSET(int fd, fd_set *set); // check whether a single FD is set - FD_SET(int fd, fd_set *set); // set a single FD - FD_ZERO(fd_set * set); // clear the entire set - -NOTE: The fd_set returned by 'Wait' is static, don't call delete -on it! - - -If you are writing a CLIENT: - The last argument to many functions is an integer whichFD, this is used -only by SERVER mode, so you can omit this argument. Sample Code: - -fd_set *fdSet; -uint8 *buff=new uint8[1024]; -int retval; -TCP tcp(CLIENT); - -tcp.Bind((uint32)0,(uint16)0); // let system pick local IP and a Port for you -tcp.Connect("tango",13); // can connect by name or "10.1.1.10" - // or the integer in host byte order - -fdSet=tcp.Wait(10,0); // wait for UP TO 10 sec and 0 microseconds -if (FD_ISSET(tcp.GetFD(),fdSet)) // Is there something to read? -{ - retval=tcp.Read(buff,1024); // Read something - // Retval will contain the number of - // bytes read, or... - // 0 = remote end closed connection - // -1 = nothing to read - fprintf(stderr,"%s",buff); -} -else - fprintf(stderr,"Nothing was read!\n"); - - -If you are writing a SERVER: - - The structure called 'clientList' contains all the File Descriptors -that have connected to the server. Make sure you look at the FD_* -functions so you can use this sort of structure. When you are writing -a server, you need to specify the 'whichFD' arguments to all the -functions. Sample Code: - -fd_set *fdSet; -uint8 *buff=new uint8[1024]; -int retval; -TCP tcp(SERVER); - -tcp.Bind((uint32)0,(uint16)2121); // You need to bind to a well defined - // port number or nobody will know where - // to connect to. - -while (1) -{ - fdSet=tcp.Wait(-1,-1); // Wait until there is something on the socket - if (FD_ISSET(tcp.GetFD(),fdSet)) // somebody must want a connection - { - retval=tcp.GetConnection(); // Get a connection if somebody's trying - if (retval!=-1) - { - tcp.Write("Hello World!\n",strlen("Hello World!\n"),retval); - tcp.Close(retval); - } - } -} - - -\****************************************************************************/ - - -#include "tcp.h" -#include - -#ifndef _WINDOWS -#include -#define closesocket close -#endif - -// newMode should be either CLIENT or SERVER -TCP::TCP(int new_mode) -{ - mode=CLIENT; - maxFD=0; - fd = -1; - clientCount=0; - if ((new_mode==CLIENT)||(new_mode==SERVER)) - mode=new_mode; - FD_ZERO(&clientList); - connectionState=CLOSED; - inputDelay=5; - outputDelay=5; -} - -// Create a TCP object on a pre-existing socket -TCP::TCP(int new_mode,sint16 socket) -{ - sint32 retval; - - mode=CLIENT; - maxFD= socket; - fd = socket; - clientCount=0; - if ((new_mode==CLIENT)||(new_mode==SERVER)) - mode=new_mode; - FD_ZERO(&clientList); - - inputDelay=5; - outputDelay=5; - - - retval=SetBlocking(FALSE,socket); // set to NB mode - //DBGMSG("Setblocking: "<0)&&(c!=0)) - { - string[i]=c; - if (c=='\n') - return(string); - i++; - } - else if ((retval==0)&&(i==0)) - { - DBGMSG("Remote endpoint closed (1)"); - return(NULL); - } - else if (retval==0) - return(string); - } - return(string); -} - - -// only specify whichFD if this is a server -sint32 TCP::Read(uint8 *msg,uint32 len,sint32 whichFD) -{ - sint32 retval; - //DBGMSG("In read, mode: "<0) - bytes_read+=retval; - // otherwise some error - } - return(bytes_read); -} - - - -// only specify whichFD if this is a server -// Peek at data in system buffer -sint32 TCP::Peek(uint8 *msg,uint32 len,sint32 whichFD) -{ - sint32 retval; - if (mode==CLIENT) - { - retval=recv(fd,(char *)msg,len,MSG_PEEK); - if (retval==0) - Close(); - return(retval); - } - else if (mode==SERVER) - { - if ((whichFD<=maxFD) && (FD_ISSET(whichFD,&clientList))) - { - retval=recv(whichFD,(char *)msg,len,MSG_PEEK); - if (retval==0) - Close(whichFD); - return(retval); - } - else - return(0); // closed - } - return(-1); -} - - -// only specify whichFD if this is a server -// (this is used for non-8 bit clean pipes, you probably don't -// want to use it!) -sint32 TCP::EncapsulatedRead(uint8 *msg,uint32 len,sint32 whichFD) -{ - sint32 retval,bytesRead=0; - uint32 i; - char data; - - if (mode==CLIENT) - whichFD=fd; - else if (mode==SERVER) - { - if ((whichFD>maxFD) || (!FD_ISSET(whichFD,&clientList))) - return(0); - } - else - return(-1); - - for (i=0; i=0; i--) - if (FD_ISSET(i,&clientList)) - { - maxFD=i; - break; - } - } - FD_CLR((uint32)whichFD,&clientList); - clientCount--; - return(closesocket(whichFD)); - } - } - return(-1); -} - - - -// if 'sec' AND 'usec' are -1 then this will sleep until -// there is socket activity - -int TCP::Wait(sint32 sec,sint32 usec,fd_set &returnSet,sint32 whichFD) -{ - fd_set inputSet; - - FD_ZERO(&inputSet); - - if (mode==SERVER) - { - if (whichFD==0) - { - inputSet=clientList; - if (fd > 0) - FD_SET(fd,&inputSet); - } - else if (whichFD > 0) - FD_SET(whichFD,&inputSet); - } - else if (mode==CLIENT) - { - if (whichFD==0) - whichFD=fd; - if (whichFD > 0) - FD_SET(whichFD,&inputSet); - } - - return(Wait(sec,usec,inputSet,returnSet)); -} - -int TCP::Wait(sint32 sec,sint32 usec,fd_set &givenSet,fd_set &returnSet) -{ - Wtime timeout; - Wtime timenow; - Wtime timethen; - fd_set backupSet; - int retval=0,done,givenMax; - bit8 noTimeout=FALSE; - timeval tv; - - returnSet=givenSet; - backupSet=returnSet; - - if ((sec==-1)&&(usec==-1)) - noTimeout=TRUE; - - timeout.SetSec(sec); - timeout.SetUsec(usec); - timethen+=timeout; - - givenMax=maxFD; - for (uint32 i=0; i<(sizeof(fd_set)*8); i++) // i=maxFD+1 - { - if (FD_ISSET(i,&givenSet)) - givenMax=i; - } - - done=0; - while( ! done) - { - if (noTimeout) - retval=select(givenMax+1,&returnSet,0,0,NULL); - else - { - timeout.GetTimevalMT(tv); - retval=select(givenMax+1,&returnSet,0,0,&tv); - } - - if (retval>=0) - done=1; - - else if ((retval==-1)&&(errno==EINTR)) // in case of signal - { - if (noTimeout==FALSE) - { - timenow.Update(); - timeout=timethen-timenow; - } - if ((noTimeout==FALSE)&&(timenow.GetSec()==0)&&(timenow.GetUsec()==0)) - done=1; - else - returnSet=backupSet; - } - else // maybe out of memory? - { - done=1; - } - } - return(retval); -} - - -void TCP::WaitWrite(sint32 whichFD) -{ - fd_set backupSet; - int retval=0,done; - fd_set outputSet; - - if (whichFD==0) - whichFD=fd; - - if (whichFD==-1) - return; - - FD_ZERO(&outputSet); - FD_SET(whichFD,&outputSet); - backupSet=outputSet; - - done=0; - while( ! done) - { - retval=select(maxFD+1,0,&outputSet,0,NULL); - - if (retval>=0) - done=1; - - else if ((retval==-1)&&(errno==EINTR)) // in case of signal - outputSet=backupSet; - else // maybe out of memory? - done=1; - } -} - -// Can a FD be written to? -bit8 TCP::CanWrite(sint32 whichFD) -{ - int retval=0; - fd_set outputSet; - Wtime timeout; - timeval tv; - - timeout.SetSec(0); - timeout.SetUsec(0); - - if (whichFD==0) - whichFD=fd; - - FD_ZERO(&outputSet); - FD_SET(whichFD,&outputSet); - - timeout.GetTimevalMT(tv); - retval=select(whichFD+1,0,&outputSet,0,&tv); - if (retval>0) - return(TRUE); - else - return(FALSE); -} - - -bit8 TCP::Bind(char *Host,uint16 port,bit8 reuseAddr) -{ - char hostName[100]; - struct hostent *hostStruct; - struct in_addr *hostNode; - - if (isdigit(Host[0])) - return ( Bind( ntohl(inet_addr(Host)), port,reuseAddr) ); - - strcpy(hostName, Host); - - hostStruct = gethostbyname(Host); - if (hostStruct == NULL) - return (0); - hostNode = (struct in_addr *) hostStruct->h_addr; - return ( Bind(ntohl(hostNode->s_addr),port,reuseAddr) ); -} - - -// You must call bind, implicit binding is for sissies -// Well... you can get implicit binding if you pass 0 for either arg - -bit8 TCP::Bind(uint32 IP,uint16 Port,bit8 reuseAddr) -{ - int retval; - int status; - - IP=htonl(IP); - Port=htons(Port); - - addr.sin_family=AF_INET; - addr.sin_port=Port; - addr.sin_addr.s_addr=IP; - fd=socket(AF_INET,SOCK_STREAM,DEFAULT_PROTOCOL); - if (fd==-1) - return(FALSE); - - retval=SetBlocking(FALSE,fd); - if (retval==-1) - ERRMSG("Couldn't set nonblocking mode!"); - - if (reuseAddr==TRUE) - { - uint32 opval; - - #ifdef SO_REUSEPORT -/****************** this may make the socket get garbage data?? - opval=1; - retval=setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&opval,sizeof(opval)); - if (retval!=0) - fprintf(stderr,"Could not set socket to SO_REUSEPORT\n"); -**********************/ - #endif - #ifdef SO_REUSEADDR - opval=1; - retval=setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&opval,sizeof(opval)); - if (retval!=0) - fprintf(stderr,"Could not set socket to SO_REUSEADDR\n"); - #endif - } - - retval=bind(fd,(struct sockaddr *)&addr,sizeof(addr)); - #ifdef _WINDOWS - if (retval==SOCKET_ERROR) - retval=-1; - #endif - - if (retval==-1) - { - status=GetStatus(); - DBGMSG("Bind failure (" << status << ") IP "<< IP <<" PORT "<< ntohs(Port)); - return(FALSE); - } - myIP=IP; - myPort=Port; - maxFD=fd; - - if (mode==SERVER) - listen(fd,64); //Solaris needs lots of listen slots for some reason - - return(TRUE); -} - - -// This is only for clients - -bit8 TCP::Connect(char *Host,uint16 port) -{ - char hostName[100]; - struct hostent *hostStruct; - struct in_addr *hostNode; - - if (isdigit(Host[0])) - return ( Connect( ntohl(inet_addr(Host)), port) ); - - strcpy(hostName, Host); - - hostStruct = gethostbyname(Host); - if (hostStruct == NULL) - {ERRMSG("Can't resolve host");return (0);} - hostNode = (struct in_addr *) hostStruct->h_addr; - return ( Connect(ntohl(hostNode->s_addr),port) ); -} - -bit8 TCP::Connect(uint32 IP,uint16 Port) -{ - int tries,result; - struct timeval sleep_time; - struct sockaddr_in serverAddr; - int status; - - IP=htonl(IP); - Port=htons(Port); - - serverAddr.sin_family=AF_INET; - serverAddr.sin_port=Port; - serverAddr.sin_addr.s_addr=IP; - - if (mode!=CLIENT) - {ERRMSG("Can't connect in server mode");return(FALSE);} - - tries=0; - result=-1; - - - // try 10 connects with a greater and greater sleep time after each one - // this can go on for upto 5.4 seconds - while ((tries < 10) && (result == -1)) - { - ClearStatus(); - result = connect(fd,(struct sockaddr *)&serverAddr, sizeof(serverAddr)); - status=GetStatus(); - - #ifdef _WINDOWS - if (result==SOCKET_ERROR) - result=-1; - #endif - - if ((status == ISCONN) && (result == -1)) - { - result = 0; - } - if (result == -1) - { - if ((status!=INPROGRESS)&&(status!=ALREADY)&&(status!=AGAIN)&& - (status!=WOULDBLOCK)) - { - Close(); - Bind(myIP,myPort); - } - tries++; - sleep_time.tv_sec = 0; - sleep_time.tv_usec = (100000*(tries+1)); - #ifdef WIN32 - Sleep((sleep_time.tv_usec)/1000); - #else - select(0, 0, 0, 0, &sleep_time); - #endif - } - } - - if (result == -1) - { - return(FALSE); - } - connectionState=CONNECTED; - return (TRUE); -} - - - -// Asynchronous Connection -bit8 TCP::ConnectAsync(char *Host,uint16 port) -{ - char hostName[100]; - struct hostent *hostStruct; - struct in_addr *hostNode; - - if (isdigit(Host[0])) - return ( ConnectAsync( ntohl(inet_addr(Host)), port) ); - - strcpy(hostName, Host); - - hostStruct = gethostbyname(Host); - if (hostStruct == NULL) - return (0); - hostNode = (struct in_addr *) hostStruct->h_addr; - return ( ConnectAsync(ntohl(hostNode->s_addr),port) ); -} - -// Asynchronous Connection -bit8 TCP::ConnectAsync(uint32 IP,uint16 Port) -{ - int result; - struct sockaddr_in serverAddr; - int status,connectErrno; - int retval; - - IP=htonl(IP); - Port=htons(Port); - - serverAddr.sin_family=AF_INET; - serverAddr.sin_port=Port; - serverAddr.sin_addr.s_addr=IP; - - if (mode!=CLIENT) - return(FALSE); - - result=-1; - - if (connectionState==CONNECTING) - { - if (IsConnected(fd)) - { - DBGMSG("CONNECTION COMPLETE at point 1"); - connectionState=CONNECTED; - return(TRUE); - } - else - return(TRUE); // Still trying - } - - ClearStatus(); - result = connect(fd,(struct sockaddr *)&serverAddr, sizeof(serverAddr)); - connectErrno=errno; - status=GetStatus(); - - #ifdef _WINDOWS - if (result==SOCKET_ERROR) - { - DBGMSG("Socket error 1 " << status); - result=-1; - } - #endif - - // If we have a bogus FD, try again after closing and re-binding - if ((result==-1)&&((status==BADF)||(status==NOTSOCK)||(status==INVAL))) - { - Close(); - retval=Bind(myIP,myPort); - DBGMSG("BIND = "<maxFD) - maxFD=clientFD; - FD_SET(clientFD,&clientList); - clientCount++; - } - return(clientFD); -} - -sint32 TCP::GetConnection(struct sockaddr *clientAddr) -{ - if (mode!=SERVER) - return(-1); - - sint32 clientFD; - int addrlen=sizeof(struct sockaddr); - - clientFD=accept(fd,(struct sockaddr *)clientAddr,&addrlen); - if (clientFD!=-1) - { - if (clientFD>maxFD) - maxFD=clientFD; - FD_SET(clientFD,&clientList); - clientCount++; - } - return(clientFD); -} - diff --git a/Generals/Code/Tools/mangler/wnet/tcp.h b/Generals/Code/Tools/mangler/wnet/tcp.h deleted file mode 100644 index 3f63e4e9d36..00000000000 --- a/Generals/Code/Tools/mangler/wnet/tcp.h +++ /dev/null @@ -1,199 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/****************************************************************************\ -TCP Neal Kettler neal@westwood.com - -\****************************************************************************/ - -#ifndef TCP_HEADER -#define TCP_HEADER - -#include -#include -#include -#include -#include -#include - -#ifdef _WINDOWS - -#include -#include -#define close _close -#define read _read -#define write _write - -#else //UNIX -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef signed int SOCKET; - -#endif - - -#ifdef AIX -#include -#endif - -#define DEFAULT_PROTOCOL 0 - -#include "wlib/wstypes.h" -#include "wlib/wdebug.h" -#include "wlib/wtime.h" - -class TCP -{ - -// DATA --------------- - -private: - int mode; // client or server - sint32 fd; // the primary FD - - uint32 myIP; // after bind myIP & myPort will be - uint16 myPort; // whatever we bound to - - struct sockaddr_in addr; - int maxFD; // value of the biggest FD - int clientCount; // how many clients open - - - sint32 inputDelay; // default delay for semi-blocking reads - sint32 outputDelay; // default delay for semi-blocking writes - - enum ConnectionState - { - CLOSED, - CONNECTING, - CONNECTED - } connectionState; // What state is client FD in - -public: - - enum - { - CLIENT = 1, - SERVER = 2 - }; - - // These defines specify a system independent way to - // get error codes for socket services. - enum - { - OK, // Everything's cool - UNKNOWN, // There was an error of unknown type - ISCONN, // The socket is already connected - INPROGRESS, // The socket is non-blocking and the operation - // isn't done yet - ALREADY, // The socket is already attempting a connection - // but isn't done yet - AGAIN, // Try again. - ADDRINUSE, // Address already in use - ADDRNOTAVAIL, // That address is not available on the remote host - BADF, // Not a valid FD - CONNREFUSED, // Connection was refused - INTR, // Operation was interrupted - NOTSOCK, // FD wasn't a socket - PIPE, // That operation just made a SIGPIPE - WOULDBLOCK, // That operation would block - INVAL, // Invalid - TIMEDOUT // Timeout - }; - - // for client list (if this is a server) - fd_set clientList; - - -// CODE ---------------- - -public: - TCP(int newMode); - TCP(int newMode,sint16 socket); - ~TCP(); - bit8 Bind(uint32 IP,uint16 port,bit8 reuseAddr=FALSE); - bit8 Bind(char *Host,uint16 port,bit8 reuseAddr=FALSE); - - sint32 GetMaxFD(void); - - bit8 Connect(uint32 IP,uint16 port); - bit8 Connect(char *Host,uint16 port); - bit8 ConnectAsync(uint32 IP,uint16 port); - bit8 ConnectAsync(char *Host,uint16 port); - - bit8 IsConnected(sint32 whichFD=0); - - sint32 GetFD(void); - sint32 GetClientCount(void) { return(clientCount); } - - // Get IP or Port of a connected endpoint - uint32 GetRemoteIP(sint32 whichFD=0); - uint16 GetRemotePort(sint32 whichFD=0); - - sint32 GetConnection(void); - sint32 GetConnection(struct sockaddr *clientAddr); - void WaitWrite(sint32 whichFD=0); - bit8 CanWrite(sint32 whichFD=0); - sint32 Write(const uint8 *msg,uint32 len,sint32 whichFD=0); - sint32 WriteNB(uint8 *msg,uint32 len,sint32 whichFD=0); - sint32 EncapsulatedWrite(uint8 *msg,uint32 len,sint32 whichFD=0); - sint32 WriteString(char *msg,sint32 whichFD=0); - sint32 Printf(sint32 whichFD,const char *format,...); - sint32 Read(uint8 *msg,uint32 len,sint32 whichFD=0); - sint32 TimedRead(uint8 *msg,uint32 len,int seconds,sint32 whichFD=0); - sint32 Peek(uint8 *msg,uint32 len,sint32 whichFD=0); - sint32 EncapsulatedRead(uint8 *msg,uint32 len,sint32 whichFD=0); - - char *Gets(char *string,int n,int whichFD=0); - - // Wait on all sockets (or a specified one) - // return when ready for reading (or timeout occurs) - int Wait(sint32 sec,sint32 usec,fd_set &returnSet,sint32 whichFD=0); - int Wait(sint32 sec,sint32 usec,fd_set &inputSet,fd_set &returnSet); - - int GetStatus(void); - void ClearStatus(void); - - //sint32 GetSockStatus(sint32 whichFD=0); - - // give up ownership of the socket without closing it - void DisownSocket(void); - - sint32 Close(sint32 whichFD=0); - sint32 CloseAll(void); // close all sockets (same as close for client) - - sint32 SetBlocking(bit8 block,sint32 whichFD=0); - - // Set default delays for semi-blocking reads & writes - // default input = 5, output = 5 - // this is new and not used everywhere - // - bit8 SetInputDelay(sint32 delay) { inputDelay=delay; return(TRUE); }; - bit8 SetOutputDelay(sint32 delay) { outputDelay=delay; return(TRUE); }; - -}; - -#endif diff --git a/Generals/Code/Tools/mangler/wnet/udp.cpp b/Generals/Code/Tools/mangler/wnet/udp.cpp deleted file mode 100644 index afa6d16150f..00000000000 --- a/Generals/Code/Tools/mangler/wnet/udp.cpp +++ /dev/null @@ -1,372 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#include "udp.h" -#include "wlib/wdebug.h" - -UDP::UDP() -{ - fd=0; -} - -UDP::~UDP() -{ -} - -sint32 UDP::Bind(char *Host,uint16 port) -{ - char hostName[100]; - struct hostent *hostStruct; - struct in_addr *hostNode; - - if (isdigit(Host[0])) - return ( Bind( ntohl(inet_addr(Host)), port) ); - - strcpy(hostName, Host); - - hostStruct = gethostbyname(Host); - if (hostStruct == NULL) - return (0); - hostNode = (struct in_addr *) hostStruct->h_addr; - return ( Bind(ntohl(hostNode->s_addr),port) ); -} - -// You must call bind, implicit binding is for sissies -// Well... you can get implicit binding if you pass 0 for either arg -sint32 UDP::Bind(uint32 IP,uint16 Port) -{ - int retval; - int status; - - IP=htonl(IP); - Port=htons(Port); - - addr.sin_family=AF_INET; - addr.sin_port=Port; - addr.sin_addr.s_addr=IP; - fd=socket(AF_INET,SOCK_DGRAM,DEFAULT_PROTOCOL); - #ifdef _WINDOWS - if (fd==SOCKET_ERROR) - fd=-1; - #endif - if (fd==-1) - return(UNKNOWN); - - retval=bind(fd,(struct sockaddr *)&addr,sizeof(addr)); - - #ifdef _WINDOWS - if (retval==SOCKET_ERROR) - retval=-1; - #endif - if (retval==-1) - { - status=GetStatus(); - //CERR("Bind failure (" << status << ") IP " << IP << " PORT " << Port ) - return(status); - } - - int namelen=sizeof(addr); - getsockname(fd, (struct sockaddr *)&addr, &namelen); - - myIP=ntohl(addr.sin_addr.s_addr); - myPort=ntohs(addr.sin_port); - - retval=SetBlocking(FALSE); - if (retval==-1) - fprintf(stderr,"Couldn't set nonblocking mode!\n"); - - return(OK); -} - -bit8 UDP::getLocalAddr(uint32 &ip, uint16 &port) -{ - ip=myIP; - port=myPort; - return(OK); -} - - -// private function -sint32 UDP::SetBlocking(bit8 block) -{ - #ifdef _WINDOWS - unsigned long flag=1; - if (block) - flag=0; - int retval; - retval=ioctlsocket(fd,FIONBIO,&flag); - if (retval==SOCKET_ERROR) - return(UNKNOWN); - else - return(OK); - #else // UNIX - int flags = fcntl(fd, F_GETFL, 0); - if (block==FALSE) // set nonblocking - flags |= O_NONBLOCK; - else // set blocking - flags &= ~(O_NONBLOCK); - - if (fcntl(fd, F_SETFL, flags) < 0) - { - return(UNKNOWN); - } - return(OK); - #endif -} - - -sint32 UDP::Write(uint8 *msg,uint32 len,uint32 IP,uint16 port) -{ - sint32 retval; - struct sockaddr_in to; - - // This happens frequently - if ((IP==0)||(port==0)) return(ADDRNOTAVAIL); - - errno=0; - to.sin_port=htons(port); - to.sin_addr.s_addr=htonl(IP); - to.sin_family=AF_INET; - - ClearStatus(); - retval=sendto(fd,(char *)msg,len,0,(struct sockaddr *)&to,sizeof(to)); - #ifdef _WINDOWS - if (retval==SOCKET_ERROR) - retval=-1; - #endif - - return(retval); -} - -sint32 UDP::Read(uint8 *msg,uint32 len,sockaddr_in *from) -{ - sint32 retval; - int alen=sizeof(sockaddr_in); - - if (from!=NULL) - { - retval=recvfrom(fd,(char *)msg,len,0,(struct sockaddr *)from,&alen); - #ifdef _WINDOWS - if (retval==SOCKET_ERROR) - retval=-1; - #endif - } - else - { - retval=recvfrom(fd,(char *)msg,len,0,NULL,NULL); - #ifdef _WINDOWS - if (retval==SOCKET_ERROR) - retval=-1; - #endif - } - return(retval); -} - - -void UDP::ClearStatus(void) -{ - #ifndef _WINDOWS - errno=0; - #endif -} - -UDP::sockStat UDP::GetStatus(void) -{ - #ifdef _WINDOWS - int status=WSAGetLastError(); - if (status==0) return(OK); - else if (status==WSAEINTR) return(INTR); - else if (status==WSAEINPROGRESS) return(INPROGRESS); - else if (status==WSAECONNREFUSED) return(CONNREFUSED); - else if (status==WSAEINVAL) return(INVAL); - else if (status==WSAEISCONN) return(ISCONN); - else if (status==WSAENOTSOCK) return(NOTSOCK); - else if (status==WSAETIMEDOUT) return(TIMEDOUT); - else if (status==WSAEALREADY) return(ALREADY); - else if (status==WSAEWOULDBLOCK) return(WOULDBLOCK); - else if (status==WSAEBADF) return(BADF); - else return(UNKNOWN); - #else - int status=errno; - if (status==0) return(OK); - else if (status==EINTR) return(INTR); - else if (status==EINPROGRESS) return(INPROGRESS); - else if (status==ECONNREFUSED) return(CONNREFUSED); - else if (status==EINVAL) return(INVAL); - else if (status==EISCONN) return(ISCONN); - else if (status==ENOTSOCK) return(NOTSOCK); - else if (status==ETIMEDOUT) return(TIMEDOUT); - else if (status==EALREADY) return(ALREADY); - else if (status==EAGAIN) return(AGAIN); - else if (status==EWOULDBLOCK) return(WOULDBLOCK); - else if (status==EBADF) return(BADF); - else return(UNKNOWN); - #endif -} - - - -// -// Wait for net activity on this socket -// -int UDP::Wait(sint32 sec,sint32 usec,fd_set &returnSet) -{ - fd_set inputSet; - - FD_ZERO(&inputSet); - FD_SET(fd,&inputSet); - - return(Wait(sec,usec,inputSet,returnSet)); -} - -// -// Wait for net activity on a list of sockets -// -int UDP::Wait(sint32 sec,sint32 usec,fd_set &givenSet,fd_set &returnSet) -{ - Wtime timeout,timenow,timethen; - fd_set backupSet; - int retval=0,done,givenMax; - bit8 noTimeout=FALSE; - timeval tv; - - returnSet=givenSet; - backupSet=returnSet; - - if ((sec==-1)&&(usec==-1)) - noTimeout=TRUE; - - timeout.SetSec(sec); - timeout.SetUsec(usec); - timethen+=timeout; - - givenMax=fd; - for (uint32 i=0; i<(sizeof(fd_set)*8); i++) // i=maxFD+1 - { - if (FD_ISSET(i,&givenSet)) - givenMax=i; - } - ///DBGMSG("WAIT fd="<. -*/ - -#ifndef UDP_HEADER -#define UDP_HEADER - -#include -#include -#include -#include -#include - -#ifdef _WINDOWS -#include -#include -#define close _close -#define read _read -#define write _write - -#else //UNIX -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -#ifdef AIX -#include -#endif - -#define DEFAULT_PROTOCOL 0 - -#include -#include - -class UDP -{ - // DATA - private: - sint32 fd; - uint32 myIP; - uint16 myPort; - struct sockaddr_in addr; - - // These defines specify a system independent way to - // get error codes for socket services. - enum sockStat - { - OK = 0, // Everything's cool - UNKNOWN = -1, // There was an error of unknown type - ISCONN = -2, // The socket is already connected - INPROGRESS = -3, // The socket is non-blocking and the operation - // isn't done yet - ALREADY = -4, // The socket is already attempting a connection - // but isn't done yet - AGAIN = -5, // Try again. - ADDRINUSE = -6, // Address already in use - ADDRNOTAVAIL = -7, // That address is not available on the remote host - BADF = -8, // Not a valid FD - CONNREFUSED = -9, // Connection was refused - INTR =-10, // Operation was interrupted - NOTSOCK =-11, // FD wasn't a socket - PIPE =-12, // That operation just made a SIGPIPE - WOULDBLOCK =-13, // That operation would block - INVAL =-14, // Invalid - TIMEDOUT =-15 // Timeout - }; - -// CODE - private: - sint32 SetBlocking(bit8 block); - - public: - UDP(); - ~UDP(); - sint32 Bind(uint32 IP,uint16 port); - sint32 Bind(char *Host,uint16 port); - sint32 Write(uint8 *msg,uint32 len,uint32 IP,uint16 port); - sint32 Read(uint8 *msg,uint32 len,sockaddr_in *from); - sockStat GetStatus(void); - void ClearStatus(void); - int Wait(sint32 sec,sint32 usec,fd_set &returnSet); - int Wait(sint32 sec,sint32 usec,fd_set &givenSet,fd_set &returnSet); - - bit8 getLocalAddr(uint32 &ip, uint16 &port); - sint32 getFD(void) { return(fd); } - - bit8 SetInputBuffer(uint32 bytes); - bit8 SetOutputBuffer(uint32 bytes); - int GetInputBuffer(void); - int GetOutputBuffer(void); -}; - -#endif diff --git a/Generals/Code/Tools/wolSetup/CMakeLists.txt b/Generals/Code/Tools/wolSetup/CMakeLists.txt deleted file mode 100644 index f3f9d8cdf81..00000000000 --- a/Generals/Code/Tools/wolSetup/CMakeLists.txt +++ /dev/null @@ -1,32 +0,0 @@ -set(WOLSETUP_SRC - "resource.h" - "StdAfx.cpp" - "StdAfx.h" - "verchk.cpp" - "verchk.h" - "wolInit.cpp" - "wolSetup.cpp" - "wolSetup.h" - "WOLAPI/chatdefs.h" - "WOLAPI/downloaddefs.h" - "WOLAPI/ftpdefs.h" - "WOLAPI/netutildefs.h" - "WOLAPI/wolapi.h" - "WOLAPI/wolapi_i.c" -) - -add_executable(g_wolsetup WIN32) -set_target_properties(g_wolsetup PROPERTIES OUTPUT_NAME wolsetup) - -target_sources(g_wolsetup PRIVATE ${WOLSETUP_SRC}) - -target_link_libraries(g_wolsetup PRIVATE - core_config - Version -) - -if(WIN32 OR "${CMAKE_SYSTEM}" MATCHES "Windows") - target_sources(g_wolsetup PRIVATE wolSetup.rc) -endif() - -# TODO: Copy the dll's that reside in the WOLAPI folder. diff --git a/Generals/Code/Tools/wolSetup/StdAfx.cpp b/Generals/Code/Tools/wolSetup/StdAfx.cpp deleted file mode 100644 index f6eca7fc989..00000000000 --- a/Generals/Code/Tools/wolSetup/StdAfx.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -// stdafx.cpp : source file that includes just the standard includes -// wolSetup.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "StdAfx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/Generals/Code/Tools/wolSetup/StdAfx.h b/Generals/Code/Tools/wolSetup/StdAfx.h deleted file mode 100644 index fa2af0f513a..00000000000 --- a/Generals/Code/Tools/wolSetup/StdAfx.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) -#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -#include - - -// TODO: reference additional headers your program requires here - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) diff --git a/Generals/Code/Tools/wolSetup/WOLAPI/chatdefs.h b/Generals/Code/Tools/wolSetup/WOLAPI/chatdefs.h deleted file mode 100644 index f5395c83261..00000000000 --- a/Generals/Code/Tools/wolSetup/WOLAPI/chatdefs.h +++ /dev/null @@ -1,173 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef CHATDEFS_HEADER -#define CHATDEFS_HEADER - -// gks 11/3/1999: version numbers for SetClientVersion -// GMU 01/12/01 : bumped CHAT_VERSION_MINOR to 15 -// BGC 6/7/01: now version 16 -#define CHAT_VERSION_MAJOR 1 -#define CHAT_VERSION_MINOR 16 - -#define CHAT_VERSION ( ( CHAT_VERSION_MAJOR << 16 ) | ( CHAT_VERSION_MINOR ) ) - -// -// Response errors (Sent as arguments to the OnFoo calls) -// - -// Your nick is still logged into chat -#define CHAT_E_NICKINUSE MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 100) -// Your password is incorrect during login -#define CHAT_E_BADPASS MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 101) -// Reference made to non-existant user or channel -#define CHAT_E_NONESUCH MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 102) -// The network layer is down or cannot be initialized for some reason -#define CHAT_E_CON_NETDOWN MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 103) -// Name lookup (e.g DNS) failed for some reason -#define CHAT_E_CON_LOOKUP_FAILED MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 104) -// Some fatal error occured with the net connection -#define CHAT_E_CON_ERROR MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 105) -// General request timeout for a request -#define CHAT_E_TIMEOUT MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 106) -// Must patch before continuing -#define CHAT_E_MUSTPATCH MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 107) -// Miscellaneous internal status error -#define CHAT_E_STATUSERROR MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 108) -// Server has returned something we don't recognise -#define CHAT_E_UNKNOWNRESPONSE MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 109) -// Tried to join a channel that has enough players already -#define CHAT_E_CHANNELFULL MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 110) -// Tried to create a channel that already exists -#define CHAT_E_CHANNELEXISTS MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 111) -// Tried to join a channel that does not exist -#define CHAT_E_CHANNELDOESNOTEXIST MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 112) -// Tried to join a channel with the wrong password -#define CHAT_E_BADCHANNELPASSWORD MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 113) -// You've been banned from the server / channel -#define CHAT_E_BANNED MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 114) -// You tried to do something that required operator status -#define CHAT_E_NOT_OPER MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 115) -// Your account is disabled -#define CHAT_E_DISABLED MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 116) -// Your serial# has been banned -#define CHAT_E_SERIALBANNED MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 117) -// Somebody else is using your serial# -#define CHAT_E_SERIALDUP MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 118) - -// New error codes -- gks 1/10/2000 -// Serial number does not exist in the database -#define CHAT_E_SERIALUNKNOWN MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 119) -// Serial number is for a different product -#define CHAT_E_SKUSERIALMISMATCH MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 120) - -// -// Response success codes (non-error arguments passed to the OnFoo callbacks) -// Note: S_OK is the usual success code - -// A network connection is underway -#define CHAT_S_CON_CONNECTING MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 300) -// A network connection is complete -#define CHAT_S_CON_CONNECTED MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 301) -// A network connection is going down -#define CHAT_S_CON_DISCONNECTING MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 302) -// A network connection is closed -#define CHAT_S_CON_DISCONNECTED MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 303) - - -// Find - Nick not in system -#define CHAT_S_FIND_NOTHERE MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 304) -// Find - Not in any channels -#define CHAT_S_FIND_NOCHAN MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 305) -// Find - user has find turned off -#define CHAT_S_FIND_OFF MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 306) - - -// Page - Nick not in system -#define CHAT_S_PAGE_NOTHERE MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 307) -// Page - user has page turned off -#define CHAT_S_PAGE_OFF MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 308) - -// This channel list is only a ping update -#define CHAT_S_PINGLIST MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 315) - - - - - - - -// -// Request errors (returned from the RequestFoo calls) -// - -// You are not connected to the chat server -#define CHAT_E_NOTCONNECTED MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 500) -// You are not in a channel -#define CHAT_E_NOCHANNEL MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 501) -// Feature is not implemented -#define CHAT_E_NOTIMPLEMENTED MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 502) -// The request was made while while a conflicting request was still pending -#define CHAT_E_PENDINGREQUEST MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 503) -// Invalid parameter passed - usually a NULL pointer -#define CHAT_E_PARAMERROR MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 504) -// Tried to create or join a channel before leaving the previous one -#define CHAT_E_LEAVECHANNEL MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 508) -// Tried to send something to a channel when not a member of any channel -#define CHAT_E_JOINCHANNEL MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 509) -// Tried to join a non-existant channel -#define CHAT_E_UNKNOWNCHANNEL MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 510) - - -// -// Request success codes -// Notes: S_OK is the usual success code - -// -// Channel list filter values -// - -#define CHAT_CHANNEL_LIST_ALL -99999 - -// -// User flags (bit field) -// -// The owner of the current channel -#define CHAT_USER_CHANNELOWNER 0x0001 -// The person with voice (conch shell...) -#define CHAT_USER_VOICE 0x0002 -// Squelched? -#define CHAT_USER_SQUELCHED 0x0004 -// The local user -#define CHAT_USER_MYSELF 0x8000 - -// -// Channel flags (bit field) -// -#define CHAN_MODE_PRIVATE 0x0004 -#define CHAN_MODE_SECRET 0x0008 -#define CHAN_MODE_MODERATED 0x0010 -#define CHAN_MODE_TOPICLIMIT 0x0020 -#define CHAN_MODE_INVITEONLY 0x0040 -#define CHAN_MODE_NOPRIVMSGS 0x0080 -#define CHAN_MODE_KEY 0x0100 -#define CHAN_MODE_BAN 0x0200 -#define CHAN_MODE_LIMIT 0x0400 - - -#endif diff --git a/Generals/Code/Tools/wolSetup/WOLAPI/downloaddefs.h b/Generals/Code/Tools/wolSetup/WOLAPI/downloaddefs.h deleted file mode 100644 index 726dd71e5ff..00000000000 --- a/Generals/Code/Tools/wolSetup/WOLAPI/downloaddefs.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef _DOWNLOADDEFS_H -#define _DOWNLOADDEFS_H - -// CDownload statuses - -#define DOWNLOADSTATUS_NONE 0 -#define DOWNLOADSTATUS_GO 1 -#define DOWNLOADSTATUS_CONNECTING 2 -#define DOWNLOADSTATUS_LOGGINGIN 3 -#define DOWNLOADSTATUS_FINDINGFILE 4 -#define DOWNLOADSTATUS_QUERYINGRESUME 5 -#define DOWNLOADSTATUS_DOWNLOADING 6 -#define DOWNLOADSTATUS_DISCONNECTING 7 -#define DOWNLOADSTATUS_DONE 0 - -// CDownload return codes - -#define DOWNLOAD_SUCCEEDED S_OK -#define DOWNLOAD_PARAMERROR MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 1 ) -#define DOWNLOAD_STATUSERROR MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 2 ) -#define DOWNLOAD_NETWORKERROR MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 3 ) -#define DOWNLOAD_FILEERROR MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 4 ) -#define DOWNLOAD_REENTERERROR MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 4 ) - -// CDownloadEvent return codes. - -#define DOWNLOADEVENT_SUCCEEDED S_OK -#define DOWNLOADEVENT_FAILED MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 5 ) -#define DOWNLOADEVENT_RESUME S_OK -#define DOWNLOADEVENT_DONOTRESUME MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 6 ) - -// CDownloadEvent error codes for OnError() - -#define DOWNLOADEVENT_NOSUCHSERVER 1 -#define DOWNLOADEVENT_COULDNOTCONNECT 2 -#define DOWNLOADEVENT_LOGINFAILED 3 -#define DOWNLOADEVENT_NOSUCHFILE 4 -#define DOWNLOADEVENT_LOCALFILEOPENFAILED 5 -#define DOWNLOADEVENT_TCPERROR 6 -#define DOWNLOADEVENT_DISCONNECTERROR 7 - -#endif diff --git a/Generals/Code/Tools/wolSetup/WOLAPI/ftpdefs.h b/Generals/Code/Tools/wolSetup/WOLAPI/ftpdefs.h deleted file mode 100644 index 01ee47d67cc..00000000000 --- a/Generals/Code/Tools/wolSetup/WOLAPI/ftpdefs.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef __FTPDEFS_H_INCLUDED__ -#define __FTPDEFS_H_INCLUDED__ - - -// CFtp return codes. - -#define FTP_SUCCEEDED S_OK -#define FTP_FAILED MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 1 ) -#define FTP_TRYING MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 2 ) - - -#endif diff --git a/Generals/Code/Tools/wolSetup/WOLAPI/netutildefs.h b/Generals/Code/Tools/wolSetup/WOLAPI/netutildefs.h deleted file mode 100644 index b8239dfbc67..00000000000 --- a/Generals/Code/Tools/wolSetup/WOLAPI/netutildefs.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef NETUTILDEFS_HEADER -#define NETUTILDEFS_HEADER - - -#define NETUTIL_E_ERROR MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 100) -#define NETUTIL_E_BUSY MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 101) -#define NETUTIL_E_TIMEOUT MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 102) - -#define NETUTIL_E_INVALIDFIELD MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 256) -#define NETUTIL_E_CANTVERIFY MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 257) - -#define NETUTIL_S_FINISHED MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_ITF, 500) - -#endif diff --git a/Generals/Code/Tools/wolSetup/WOLAPI/wolapi.h b/Generals/Code/Tools/wolSetup/WOLAPI/wolapi.h deleted file mode 100644 index e3f253ff1eb..00000000000 --- a/Generals/Code/Tools/wolSetup/WOLAPI/wolapi.h +++ /dev/null @@ -1,5492 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - -/* File created by MIDL compiler version 5.01.0164 */ -/* at Mon Nov 05 10:28:33 2001 - */ -/* Compiler settings for .\WOLAPI.idl: - Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext - error checks: allocation ref bounds_check enum stub_data -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 440 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __WOLAPI_h__ -#define __WOLAPI_h__ - -#ifdef __cplusplus -extern "C"{ -#endif - -/* Forward Declarations */ - -#ifndef __IRTPatcher_FWD_DEFINED__ -#define __IRTPatcher_FWD_DEFINED__ -typedef interface IRTPatcher IRTPatcher; -#endif /* __IRTPatcher_FWD_DEFINED__ */ - - -#ifndef __IRTPatcherEvent_FWD_DEFINED__ -#define __IRTPatcherEvent_FWD_DEFINED__ -typedef interface IRTPatcherEvent IRTPatcherEvent; -#endif /* __IRTPatcherEvent_FWD_DEFINED__ */ - - -#ifndef __IChat_FWD_DEFINED__ -#define __IChat_FWD_DEFINED__ -typedef interface IChat IChat; -#endif /* __IChat_FWD_DEFINED__ */ - - -#ifndef __IChatEvent_FWD_DEFINED__ -#define __IChatEvent_FWD_DEFINED__ -typedef interface IChatEvent IChatEvent; -#endif /* __IChatEvent_FWD_DEFINED__ */ - - -#ifndef __IDownload_FWD_DEFINED__ -#define __IDownload_FWD_DEFINED__ -typedef interface IDownload IDownload; -#endif /* __IDownload_FWD_DEFINED__ */ - - -#ifndef __IDownloadEvent_FWD_DEFINED__ -#define __IDownloadEvent_FWD_DEFINED__ -typedef interface IDownloadEvent IDownloadEvent; -#endif /* __IDownloadEvent_FWD_DEFINED__ */ - - -#ifndef __INetUtil_FWD_DEFINED__ -#define __INetUtil_FWD_DEFINED__ -typedef interface INetUtil INetUtil; -#endif /* __INetUtil_FWD_DEFINED__ */ - - -#ifndef __INetUtilEvent_FWD_DEFINED__ -#define __INetUtilEvent_FWD_DEFINED__ -typedef interface INetUtilEvent INetUtilEvent; -#endif /* __INetUtilEvent_FWD_DEFINED__ */ - - -#ifndef __IChat2_FWD_DEFINED__ -#define __IChat2_FWD_DEFINED__ -typedef interface IChat2 IChat2; -#endif /* __IChat2_FWD_DEFINED__ */ - - -#ifndef __IChat2Event_FWD_DEFINED__ -#define __IChat2Event_FWD_DEFINED__ -typedef interface IChat2Event IChat2Event; -#endif /* __IChat2Event_FWD_DEFINED__ */ - - -#ifndef __IIGROptions_FWD_DEFINED__ -#define __IIGROptions_FWD_DEFINED__ -typedef interface IIGROptions IIGROptions; -#endif /* __IIGROptions_FWD_DEFINED__ */ - - -#ifndef __RTPatcher_FWD_DEFINED__ -#define __RTPatcher_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class RTPatcher RTPatcher; -#else -typedef struct RTPatcher RTPatcher; -#endif /* __cplusplus */ - -#endif /* __RTPatcher_FWD_DEFINED__ */ - - -#ifndef __Chat_FWD_DEFINED__ -#define __Chat_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class Chat Chat; -#else -typedef struct Chat Chat; -#endif /* __cplusplus */ - -#endif /* __Chat_FWD_DEFINED__ */ - - -#ifndef __Download_FWD_DEFINED__ -#define __Download_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class Download Download; -#else -typedef struct Download Download; -#endif /* __cplusplus */ - -#endif /* __Download_FWD_DEFINED__ */ - - -#ifndef __IGROptions_FWD_DEFINED__ -#define __IGROptions_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class IGROptions IGROptions; -#else -typedef struct IGROptions IGROptions; -#endif /* __cplusplus */ - -#endif /* __IGROptions_FWD_DEFINED__ */ - - -#ifndef __NetUtil_FWD_DEFINED__ -#define __NetUtil_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class NetUtil NetUtil; -#else -typedef struct NetUtil NetUtil; -#endif /* __cplusplus */ - -#endif /* __NetUtil_FWD_DEFINED__ */ - - -#ifndef __Chat2_FWD_DEFINED__ -#define __Chat2_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class Chat2 Chat2; -#else -typedef struct Chat2 Chat2; -#endif /* __cplusplus */ - -#endif /* __Chat2_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "oaidl.h" -#include "ocidl.h" - -void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); -void __RPC_USER MIDL_user_free( void __RPC_FAR * ); - -#ifndef __IRTPatcher_INTERFACE_DEFINED__ -#define __IRTPatcher_INTERFACE_DEFINED__ - -/* interface IRTPatcher */ -/* [object][unique][helpstring][uuid] */ - - -EXTERN_C const IID IID_IRTPatcher; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("925CDEDE-71B9-11D1-B1C5-006097176556") - IRTPatcher : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ApplyPatch( - /* [string][in] */ LPCSTR destpath, - /* [string][in] */ LPCSTR filename) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE PumpMessages( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IRTPatcherVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IRTPatcher __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IRTPatcher __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IRTPatcher __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ApplyPatch )( - IRTPatcher __RPC_FAR * This, - /* [string][in] */ LPCSTR destpath, - /* [string][in] */ LPCSTR filename); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PumpMessages )( - IRTPatcher __RPC_FAR * This); - - END_INTERFACE - } IRTPatcherVtbl; - - interface IRTPatcher - { - CONST_VTBL struct IRTPatcherVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IRTPatcher_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IRTPatcher_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IRTPatcher_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IRTPatcher_ApplyPatch(This,destpath,filename) \ - (This)->lpVtbl -> ApplyPatch(This,destpath,filename) - -#define IRTPatcher_PumpMessages(This) \ - (This)->lpVtbl -> PumpMessages(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IRTPatcher_ApplyPatch_Proxy( - IRTPatcher __RPC_FAR * This, - /* [string][in] */ LPCSTR destpath, - /* [string][in] */ LPCSTR filename); - - -void __RPC_STUB IRTPatcher_ApplyPatch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IRTPatcher_PumpMessages_Proxy( - IRTPatcher __RPC_FAR * This); - - -void __RPC_STUB IRTPatcher_PumpMessages_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IRTPatcher_INTERFACE_DEFINED__ */ - - -#ifndef __IRTPatcherEvent_INTERFACE_DEFINED__ -#define __IRTPatcherEvent_INTERFACE_DEFINED__ - -/* interface IRTPatcherEvent */ -/* [object][unique][helpstring][uuid] */ - - -EXTERN_C const IID IID_IRTPatcherEvent; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("925CDEE3-71B9-11D1-B1C5-006097176556") - IRTPatcherEvent : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnProgress( - /* [in] */ LPCSTR filename, - /* [in] */ int progress) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnTermination( - /* [in] */ BOOL success) = 0; - - }; - -#else /* C style interface */ - - typedef struct IRTPatcherEventVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IRTPatcherEvent __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IRTPatcherEvent __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IRTPatcherEvent __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnProgress )( - IRTPatcherEvent __RPC_FAR * This, - /* [in] */ LPCSTR filename, - /* [in] */ int progress); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnTermination )( - IRTPatcherEvent __RPC_FAR * This, - /* [in] */ BOOL success); - - END_INTERFACE - } IRTPatcherEventVtbl; - - interface IRTPatcherEvent - { - CONST_VTBL struct IRTPatcherEventVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IRTPatcherEvent_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IRTPatcherEvent_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IRTPatcherEvent_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IRTPatcherEvent_OnProgress(This,filename,progress) \ - (This)->lpVtbl -> OnProgress(This,filename,progress) - -#define IRTPatcherEvent_OnTermination(This,success) \ - (This)->lpVtbl -> OnTermination(This,success) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IRTPatcherEvent_OnProgress_Proxy( - IRTPatcherEvent __RPC_FAR * This, - /* [in] */ LPCSTR filename, - /* [in] */ int progress); - - -void __RPC_STUB IRTPatcherEvent_OnProgress_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IRTPatcherEvent_OnTermination_Proxy( - IRTPatcherEvent __RPC_FAR * This, - /* [in] */ BOOL success); - - -void __RPC_STUB IRTPatcherEvent_OnTermination_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IRTPatcherEvent_INTERFACE_DEFINED__ */ - - -#ifndef __IChat_INTERFACE_DEFINED__ -#define __IChat_INTERFACE_DEFINED__ - -/* interface IChat */ -/* [object][unique][helpstring][uuid] */ - -#if defined(_MSC_VER) && _MSC_VER < 1300 -typedef long time_t; -#endif - -typedef -enum Locale - { LOC_UNKNOWN = 0, - LOC_OTHER = LOC_UNKNOWN + 1, - LOC_USA = LOC_OTHER + 1, - LOC_CANADA = LOC_USA + 1, - LOC_UK = LOC_CANADA + 1, - LOC_GERMANY = LOC_UK + 1, - LOC_FRANCE = LOC_GERMANY + 1, - LOC_SPAIN = LOC_FRANCE + 1, - LOC_NETHERLANDS = LOC_SPAIN + 1, - LOC_BELGIUM = LOC_NETHERLANDS + 1, - LOC_AUSTRIA = LOC_BELGIUM + 1, - LOC_SWITZERLAND = LOC_AUSTRIA + 1, - LOC_ITALY = LOC_SWITZERLAND + 1, - LOC_DENMARK = LOC_ITALY + 1, - LOC_SWEDEN = LOC_DENMARK + 1, - LOC_NORWAY = LOC_SWEDEN + 1, - LOC_FINLAND = LOC_NORWAY + 1, - LOC_ISRAEL = LOC_FINLAND + 1, - LOC_SOUTH_AFRICA = LOC_ISRAEL + 1, - LOC_JAPAN = LOC_SOUTH_AFRICA + 1, - LOC_SOUTH_KOREA = LOC_JAPAN + 1, - LOC_CHINA = LOC_SOUTH_KOREA + 1, - LOC_SINGAPORE = LOC_CHINA + 1, - LOC_TAIWAN = LOC_SINGAPORE + 1, - LOC_MALAYSIA = LOC_TAIWAN + 1, - LOC_AUSTRALIA = LOC_MALAYSIA + 1, - LOC_NEW_ZEALAND = LOC_AUSTRALIA + 1, - LOC_BRAZIL = LOC_NEW_ZEALAND + 1, - LOC_THAILAND = LOC_BRAZIL + 1, - LOC_ARGENTINA = LOC_THAILAND + 1, - LOC_PHILIPPINES = LOC_ARGENTINA + 1, - LOC_GREECE = LOC_PHILIPPINES + 1, - LOC_IRELAND = LOC_GREECE + 1, - LOC_POLAND = LOC_IRELAND + 1, - LOC_PORTUGAL = LOC_POLAND + 1, - LOC_MEXICO = LOC_PORTUGAL + 1, - LOC_RUSSIA = LOC_MEXICO + 1, - LOC_TURKEY = LOC_RUSSIA + 1 - } Locale; - -struct Highscore - { - unsigned int sku; - unsigned int wins; - unsigned int losses; - unsigned int points; - unsigned int rank; - unsigned int accomplishments; - struct Highscore __RPC_FAR *next; - unsigned char login_name[ 40 ]; - }; -struct Ladder - { - unsigned int sku; - unsigned int team_no; - unsigned int wins; - unsigned int losses; - unsigned int points; - unsigned int kills; - unsigned int rank; - unsigned int rung; - unsigned int disconnects; - unsigned int team_rung; - unsigned int provisional; - unsigned int last_game_date; - unsigned int win_streak; - unsigned int reserved1; - unsigned int reserved2; - struct Ladder __RPC_FAR *next; - unsigned char login_name[ 40 ]; - Locale locale; - }; -typedef int GroupID; - -struct Server - { - int gametype; - int chattype; - int timezone; - float longitude; - float lattitude; - struct Server __RPC_FAR *next; - unsigned char name[ 71 ]; - unsigned char connlabel[ 5 ]; - unsigned char conndata[ 128 ]; - unsigned char login[ 10 ]; - unsigned char password[ 10 ]; - }; -struct Channel - { - int type; - unsigned int minUsers; - unsigned int maxUsers; - unsigned int currentUsers; - unsigned int official; - unsigned int tournament; - unsigned int ingame; - unsigned int flags; - unsigned long reserved; - unsigned long ipaddr; - int latency; - int hidden; - struct Channel __RPC_FAR *next; - unsigned char name[ 17 ]; - unsigned char topic[ 81 ]; - unsigned char location[ 65 ]; - unsigned char key[ 9 ]; - unsigned char exInfo[ 41 ]; - }; -struct User - { - unsigned int flags; - GroupID group; - unsigned long reserved; - unsigned long reserved2; - unsigned long reserved3; - unsigned long squadID; - unsigned long ipaddr; - unsigned long squad_icon; - struct User __RPC_FAR *next; - unsigned char name[ 10 ]; - unsigned char squadname[ 41 ]; - unsigned char squadabbrev[ 10 ]; - Locale locale; - int team; - }; -struct Group - { - GroupID ident; - int type; - unsigned int members; - struct Group __RPC_FAR *next; - unsigned char name[ 65 ]; - }; -struct Squad - { - unsigned long id; - int sku; - int members; - int color1; - int color2; - int color3; - int icon1; - int icon2; - int icon3; - struct Squad __RPC_FAR *next; - int rank; - int team; - int status; - unsigned char email[ 81 ]; - unsigned char icq[ 17 ]; - unsigned char motto[ 81 ]; - unsigned char url[ 129 ]; - unsigned char name[ 41 ]; - unsigned char abbreviation[ 41 ]; - }; -struct Update - { - unsigned long SKU; - unsigned long version; - int required; - struct Update __RPC_FAR *next; - unsigned char server[ 65 ]; - unsigned char patchpath[ 256 ]; - unsigned char patchfile[ 33 ]; - unsigned char login[ 33 ]; - unsigned char password[ 65 ]; - unsigned char localpath[ 256 ]; - }; -typedef struct Server Server; - -typedef struct Channel Channel; - -typedef struct User User; - -typedef struct Group Group; - -typedef struct Update Update; - -typedef struct Ladder Ladder; - -typedef struct Highscore Highscore; - -typedef struct Squad Squad; - - -EXTERN_C const IID IID_IChat; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("4DD3BAF4-7579-11D1-B1C6-006097176556") - IChat : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE PumpMessages( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestServerList( - /* [in] */ unsigned long SKU, - /* [in] */ unsigned long current_version, - /* [in] */ LPCSTR loginname, - /* [in] */ LPCSTR password, - /* [in] */ int timeout) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestConnection( - /* [in] */ Server __RPC_FAR *server, - /* [in] */ int timeout, - int domangle) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestChannelList( - /* [in] */ int channelType, - /* [in] */ int autoping) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestChannelCreate( - /* [in] */ Channel __RPC_FAR *channel) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestChannelJoin( - /* [in] */ Channel __RPC_FAR *channel) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestChannelLeave( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestUserList( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPublicMessage( - /* [in] */ LPCSTR message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPrivateMessage( - /* [in] */ User __RPC_FAR *users, - /* [in] */ LPCSTR message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestLogout( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPrivateGameOptions( - /* [in] */ User __RPC_FAR *users, - /* [in] */ LPCSTR options) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPublicGameOptions( - /* [in] */ LPCSTR options) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPublicAction( - /* [in] */ LPCSTR action) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPrivateAction( - /* [in] */ User __RPC_FAR *users, - /* [in] */ LPCSTR action) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestGameStart( - /* [in] */ User __RPC_FAR *users) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestChannelTopic( - /* [in] */ LPCSTR topic) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetVersion( - /* [in] */ unsigned long __RPC_FAR *version) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestUserKick( - /* [in] */ User __RPC_FAR *user) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestUserIP( - /* [in] */ User __RPC_FAR *user) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetGametypeInfo( - unsigned int gtype, - int icon_size, - unsigned char __RPC_FAR *__RPC_FAR *bitmap, - int __RPC_FAR *bmp_bytes, - LPCSTR __RPC_FAR *name, - LPCSTR __RPC_FAR *URL) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestFind( - User __RPC_FAR *user) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPage( - User __RPC_FAR *user, - LPCSTR message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetFindPage( - int findOn, - int pageOn) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetSquelch( - User __RPC_FAR *user, - int squelch) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSquelch( - User __RPC_FAR *user) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetChannelFilter( - int channelType) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestGameEnd( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetLangFilter( - int onoff) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestChannelBan( - LPCSTR name, - int ban) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetGametypeList( - LPCSTR __RPC_FAR *list) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetHelpURL( - LPCSTR __RPC_FAR *url) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetProductSKU( - unsigned long SKU) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetNick( - int num, - LPCSTR __RPC_FAR *nick, - LPCSTR __RPC_FAR *pass) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetNick( - int num, - LPCSTR nick, - LPCSTR pass, - int domangle) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetLobbyCount( - int __RPC_FAR *count) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestRawMessage( - LPCSTR ircmsg) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetAttributeValue( - LPCSTR attrib, - LPCSTR __RPC_FAR *value) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetAttributeValue( - LPCSTR attrib, - LPCSTR value) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetChannelExInfo( - LPCSTR info) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE StopAutoping( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestSquadInfo( - unsigned long id) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestSetTeam( - int team) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestSetLocale( - Locale locale) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestUserLocale( - User __RPC_FAR *users) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestUserTeam( - User __RPC_FAR *users) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetNickLocale( - int nicknum, - Locale __RPC_FAR *locale) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetNickLocale( - int nicknum, - Locale locale) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetLocaleString( - LPCSTR __RPC_FAR *loc_string, - Locale locale) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetLocaleCount( - int __RPC_FAR *num) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetClientVersion( - unsigned long version) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetCodepageFilter( - int filter) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestBuddyList( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestBuddyAdd( - User __RPC_FAR *newbuddy) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestBuddyDelete( - User __RPC_FAR *buddy) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPublicUnicodeMessage( - /* [in] */ const unsigned short __RPC_FAR *message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPrivateUnicodeMessage( - /* [in] */ User __RPC_FAR *users, - /* [in] */ const unsigned short __RPC_FAR *message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPublicUnicodeAction( - /* [in] */ const unsigned short __RPC_FAR *action) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestPrivateUnicodeAction( - /* [in] */ User __RPC_FAR *users, - /* [in] */ const unsigned short __RPC_FAR *action) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestUnicodePage( - User __RPC_FAR *user, - const unsigned short __RPC_FAR *message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestSetPlayerCount( - unsigned int currentPlayers, - unsigned int maxPlayers) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestServerTime( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestInsiderStatus( - User __RPC_FAR *users) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestSetLocalIP( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestSquadByName( - LPCSTR name) = 0; - - }; - -#else /* C style interface */ - - typedef struct IChatVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IChat __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IChat __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IChat __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PumpMessages )( - IChat __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestServerList )( - IChat __RPC_FAR * This, - /* [in] */ unsigned long SKU, - /* [in] */ unsigned long current_version, - /* [in] */ LPCSTR loginname, - /* [in] */ LPCSTR password, - /* [in] */ int timeout); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestConnection )( - IChat __RPC_FAR * This, - /* [in] */ Server __RPC_FAR *server, - /* [in] */ int timeout, - int domangle); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestChannelList )( - IChat __RPC_FAR * This, - /* [in] */ int channelType, - /* [in] */ int autoping); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestChannelCreate )( - IChat __RPC_FAR * This, - /* [in] */ Channel __RPC_FAR *channel); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestChannelJoin )( - IChat __RPC_FAR * This, - /* [in] */ Channel __RPC_FAR *channel); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestChannelLeave )( - IChat __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestUserList )( - IChat __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPublicMessage )( - IChat __RPC_FAR * This, - /* [in] */ LPCSTR message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPrivateMessage )( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users, - /* [in] */ LPCSTR message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestLogout )( - IChat __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPrivateGameOptions )( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users, - /* [in] */ LPCSTR options); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPublicGameOptions )( - IChat __RPC_FAR * This, - /* [in] */ LPCSTR options); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPublicAction )( - IChat __RPC_FAR * This, - /* [in] */ LPCSTR action); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPrivateAction )( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users, - /* [in] */ LPCSTR action); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestGameStart )( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestChannelTopic )( - IChat __RPC_FAR * This, - /* [in] */ LPCSTR topic); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetVersion )( - IChat __RPC_FAR * This, - /* [in] */ unsigned long __RPC_FAR *version); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestUserKick )( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *user); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestUserIP )( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *user); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetGametypeInfo )( - IChat __RPC_FAR * This, - unsigned int gtype, - int icon_size, - unsigned char __RPC_FAR *__RPC_FAR *bitmap, - int __RPC_FAR *bmp_bytes, - LPCSTR __RPC_FAR *name, - LPCSTR __RPC_FAR *URL); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestFind )( - IChat __RPC_FAR * This, - User __RPC_FAR *user); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPage )( - IChat __RPC_FAR * This, - User __RPC_FAR *user, - LPCSTR message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetFindPage )( - IChat __RPC_FAR * This, - int findOn, - int pageOn); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetSquelch )( - IChat __RPC_FAR * This, - User __RPC_FAR *user, - int squelch); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSquelch )( - IChat __RPC_FAR * This, - User __RPC_FAR *user); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetChannelFilter )( - IChat __RPC_FAR * This, - int channelType); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestGameEnd )( - IChat __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetLangFilter )( - IChat __RPC_FAR * This, - int onoff); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestChannelBan )( - IChat __RPC_FAR * This, - LPCSTR name, - int ban); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetGametypeList )( - IChat __RPC_FAR * This, - LPCSTR __RPC_FAR *list); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetHelpURL )( - IChat __RPC_FAR * This, - LPCSTR __RPC_FAR *url); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetProductSKU )( - IChat __RPC_FAR * This, - unsigned long SKU); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetNick )( - IChat __RPC_FAR * This, - int num, - LPCSTR __RPC_FAR *nick, - LPCSTR __RPC_FAR *pass); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetNick )( - IChat __RPC_FAR * This, - int num, - LPCSTR nick, - LPCSTR pass, - int domangle); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLobbyCount )( - IChat __RPC_FAR * This, - int __RPC_FAR *count); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestRawMessage )( - IChat __RPC_FAR * This, - LPCSTR ircmsg); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetAttributeValue )( - IChat __RPC_FAR * This, - LPCSTR attrib, - LPCSTR __RPC_FAR *value); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetAttributeValue )( - IChat __RPC_FAR * This, - LPCSTR attrib, - LPCSTR value); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetChannelExInfo )( - IChat __RPC_FAR * This, - LPCSTR info); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *StopAutoping )( - IChat __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestSquadInfo )( - IChat __RPC_FAR * This, - unsigned long id); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestSetTeam )( - IChat __RPC_FAR * This, - int team); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestSetLocale )( - IChat __RPC_FAR * This, - Locale locale); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestUserLocale )( - IChat __RPC_FAR * This, - User __RPC_FAR *users); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestUserTeam )( - IChat __RPC_FAR * This, - User __RPC_FAR *users); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetNickLocale )( - IChat __RPC_FAR * This, - int nicknum, - Locale __RPC_FAR *locale); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetNickLocale )( - IChat __RPC_FAR * This, - int nicknum, - Locale locale); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLocaleString )( - IChat __RPC_FAR * This, - LPCSTR __RPC_FAR *loc_string, - Locale locale); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetLocaleCount )( - IChat __RPC_FAR * This, - int __RPC_FAR *num); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetClientVersion )( - IChat __RPC_FAR * This, - unsigned long version); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetCodepageFilter )( - IChat __RPC_FAR * This, - int filter); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestBuddyList )( - IChat __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestBuddyAdd )( - IChat __RPC_FAR * This, - User __RPC_FAR *newbuddy); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestBuddyDelete )( - IChat __RPC_FAR * This, - User __RPC_FAR *buddy); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPublicUnicodeMessage )( - IChat __RPC_FAR * This, - /* [in] */ const unsigned short __RPC_FAR *message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPrivateUnicodeMessage )( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users, - /* [in] */ const unsigned short __RPC_FAR *message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPublicUnicodeAction )( - IChat __RPC_FAR * This, - /* [in] */ const unsigned short __RPC_FAR *action); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPrivateUnicodeAction )( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users, - /* [in] */ const unsigned short __RPC_FAR *action); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestUnicodePage )( - IChat __RPC_FAR * This, - User __RPC_FAR *user, - const unsigned short __RPC_FAR *message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestSetPlayerCount )( - IChat __RPC_FAR * This, - unsigned int currentPlayers, - unsigned int maxPlayers); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestServerTime )( - IChat __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestInsiderStatus )( - IChat __RPC_FAR * This, - User __RPC_FAR *users); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestSetLocalIP )( - IChat __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestSquadByName )( - IChat __RPC_FAR * This, - LPCSTR name); - - END_INTERFACE - } IChatVtbl; - - interface IChat - { - CONST_VTBL struct IChatVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IChat_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IChat_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IChat_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IChat_PumpMessages(This) \ - (This)->lpVtbl -> PumpMessages(This) - -#define IChat_RequestServerList(This,SKU,current_version,loginname,password,timeout) \ - (This)->lpVtbl -> RequestServerList(This,SKU,current_version,loginname,password,timeout) - -#define IChat_RequestConnection(This,server,timeout,domangle) \ - (This)->lpVtbl -> RequestConnection(This,server,timeout,domangle) - -#define IChat_RequestChannelList(This,channelType,autoping) \ - (This)->lpVtbl -> RequestChannelList(This,channelType,autoping) - -#define IChat_RequestChannelCreate(This,channel) \ - (This)->lpVtbl -> RequestChannelCreate(This,channel) - -#define IChat_RequestChannelJoin(This,channel) \ - (This)->lpVtbl -> RequestChannelJoin(This,channel) - -#define IChat_RequestChannelLeave(This) \ - (This)->lpVtbl -> RequestChannelLeave(This) - -#define IChat_RequestUserList(This) \ - (This)->lpVtbl -> RequestUserList(This) - -#define IChat_RequestPublicMessage(This,message) \ - (This)->lpVtbl -> RequestPublicMessage(This,message) - -#define IChat_RequestPrivateMessage(This,users,message) \ - (This)->lpVtbl -> RequestPrivateMessage(This,users,message) - -#define IChat_RequestLogout(This) \ - (This)->lpVtbl -> RequestLogout(This) - -#define IChat_RequestPrivateGameOptions(This,users,options) \ - (This)->lpVtbl -> RequestPrivateGameOptions(This,users,options) - -#define IChat_RequestPublicGameOptions(This,options) \ - (This)->lpVtbl -> RequestPublicGameOptions(This,options) - -#define IChat_RequestPublicAction(This,action) \ - (This)->lpVtbl -> RequestPublicAction(This,action) - -#define IChat_RequestPrivateAction(This,users,action) \ - (This)->lpVtbl -> RequestPrivateAction(This,users,action) - -#define IChat_RequestGameStart(This,users) \ - (This)->lpVtbl -> RequestGameStart(This,users) - -#define IChat_RequestChannelTopic(This,topic) \ - (This)->lpVtbl -> RequestChannelTopic(This,topic) - -#define IChat_GetVersion(This,version) \ - (This)->lpVtbl -> GetVersion(This,version) - -#define IChat_RequestUserKick(This,user) \ - (This)->lpVtbl -> RequestUserKick(This,user) - -#define IChat_RequestUserIP(This,user) \ - (This)->lpVtbl -> RequestUserIP(This,user) - -#define IChat_GetGametypeInfo(This,gtype,icon_size,bitmap,bmp_bytes,name,URL) \ - (This)->lpVtbl -> GetGametypeInfo(This,gtype,icon_size,bitmap,bmp_bytes,name,URL) - -#define IChat_RequestFind(This,user) \ - (This)->lpVtbl -> RequestFind(This,user) - -#define IChat_RequestPage(This,user,message) \ - (This)->lpVtbl -> RequestPage(This,user,message) - -#define IChat_SetFindPage(This,findOn,pageOn) \ - (This)->lpVtbl -> SetFindPage(This,findOn,pageOn) - -#define IChat_SetSquelch(This,user,squelch) \ - (This)->lpVtbl -> SetSquelch(This,user,squelch) - -#define IChat_GetSquelch(This,user) \ - (This)->lpVtbl -> GetSquelch(This,user) - -#define IChat_SetChannelFilter(This,channelType) \ - (This)->lpVtbl -> SetChannelFilter(This,channelType) - -#define IChat_RequestGameEnd(This) \ - (This)->lpVtbl -> RequestGameEnd(This) - -#define IChat_SetLangFilter(This,onoff) \ - (This)->lpVtbl -> SetLangFilter(This,onoff) - -#define IChat_RequestChannelBan(This,name,ban) \ - (This)->lpVtbl -> RequestChannelBan(This,name,ban) - -#define IChat_GetGametypeList(This,list) \ - (This)->lpVtbl -> GetGametypeList(This,list) - -#define IChat_GetHelpURL(This,url) \ - (This)->lpVtbl -> GetHelpURL(This,url) - -#define IChat_SetProductSKU(This,SKU) \ - (This)->lpVtbl -> SetProductSKU(This,SKU) - -#define IChat_GetNick(This,num,nick,pass) \ - (This)->lpVtbl -> GetNick(This,num,nick,pass) - -#define IChat_SetNick(This,num,nick,pass,domangle) \ - (This)->lpVtbl -> SetNick(This,num,nick,pass,domangle) - -#define IChat_GetLobbyCount(This,count) \ - (This)->lpVtbl -> GetLobbyCount(This,count) - -#define IChat_RequestRawMessage(This,ircmsg) \ - (This)->lpVtbl -> RequestRawMessage(This,ircmsg) - -#define IChat_GetAttributeValue(This,attrib,value) \ - (This)->lpVtbl -> GetAttributeValue(This,attrib,value) - -#define IChat_SetAttributeValue(This,attrib,value) \ - (This)->lpVtbl -> SetAttributeValue(This,attrib,value) - -#define IChat_SetChannelExInfo(This,info) \ - (This)->lpVtbl -> SetChannelExInfo(This,info) - -#define IChat_StopAutoping(This) \ - (This)->lpVtbl -> StopAutoping(This) - -#define IChat_RequestSquadInfo(This,id) \ - (This)->lpVtbl -> RequestSquadInfo(This,id) - -#define IChat_RequestSetTeam(This,team) \ - (This)->lpVtbl -> RequestSetTeam(This,team) - -#define IChat_RequestSetLocale(This,locale) \ - (This)->lpVtbl -> RequestSetLocale(This,locale) - -#define IChat_RequestUserLocale(This,users) \ - (This)->lpVtbl -> RequestUserLocale(This,users) - -#define IChat_RequestUserTeam(This,users) \ - (This)->lpVtbl -> RequestUserTeam(This,users) - -#define IChat_GetNickLocale(This,nicknum,locale) \ - (This)->lpVtbl -> GetNickLocale(This,nicknum,locale) - -#define IChat_SetNickLocale(This,nicknum,locale) \ - (This)->lpVtbl -> SetNickLocale(This,nicknum,locale) - -#define IChat_GetLocaleString(This,loc_string,locale) \ - (This)->lpVtbl -> GetLocaleString(This,loc_string,locale) - -#define IChat_GetLocaleCount(This,num) \ - (This)->lpVtbl -> GetLocaleCount(This,num) - -#define IChat_SetClientVersion(This,version) \ - (This)->lpVtbl -> SetClientVersion(This,version) - -#define IChat_SetCodepageFilter(This,filter) \ - (This)->lpVtbl -> SetCodepageFilter(This,filter) - -#define IChat_RequestBuddyList(This) \ - (This)->lpVtbl -> RequestBuddyList(This) - -#define IChat_RequestBuddyAdd(This,newbuddy) \ - (This)->lpVtbl -> RequestBuddyAdd(This,newbuddy) - -#define IChat_RequestBuddyDelete(This,buddy) \ - (This)->lpVtbl -> RequestBuddyDelete(This,buddy) - -#define IChat_RequestPublicUnicodeMessage(This,message) \ - (This)->lpVtbl -> RequestPublicUnicodeMessage(This,message) - -#define IChat_RequestPrivateUnicodeMessage(This,users,message) \ - (This)->lpVtbl -> RequestPrivateUnicodeMessage(This,users,message) - -#define IChat_RequestPublicUnicodeAction(This,action) \ - (This)->lpVtbl -> RequestPublicUnicodeAction(This,action) - -#define IChat_RequestPrivateUnicodeAction(This,users,action) \ - (This)->lpVtbl -> RequestPrivateUnicodeAction(This,users,action) - -#define IChat_RequestUnicodePage(This,user,message) \ - (This)->lpVtbl -> RequestUnicodePage(This,user,message) - -#define IChat_RequestSetPlayerCount(This,currentPlayers,maxPlayers) \ - (This)->lpVtbl -> RequestSetPlayerCount(This,currentPlayers,maxPlayers) - -#define IChat_RequestServerTime(This) \ - (This)->lpVtbl -> RequestServerTime(This) - -#define IChat_RequestInsiderStatus(This,users) \ - (This)->lpVtbl -> RequestInsiderStatus(This,users) - -#define IChat_RequestSetLocalIP(This) \ - (This)->lpVtbl -> RequestSetLocalIP(This) - -#define IChat_RequestSquadByName(This,name) \ - (This)->lpVtbl -> RequestSquadByName(This,name) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_PumpMessages_Proxy( - IChat __RPC_FAR * This); - - -void __RPC_STUB IChat_PumpMessages_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestServerList_Proxy( - IChat __RPC_FAR * This, - /* [in] */ unsigned long SKU, - /* [in] */ unsigned long current_version, - /* [in] */ LPCSTR loginname, - /* [in] */ LPCSTR password, - /* [in] */ int timeout); - - -void __RPC_STUB IChat_RequestServerList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestConnection_Proxy( - IChat __RPC_FAR * This, - /* [in] */ Server __RPC_FAR *server, - /* [in] */ int timeout, - int domangle); - - -void __RPC_STUB IChat_RequestConnection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestChannelList_Proxy( - IChat __RPC_FAR * This, - /* [in] */ int channelType, - /* [in] */ int autoping); - - -void __RPC_STUB IChat_RequestChannelList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestChannelCreate_Proxy( - IChat __RPC_FAR * This, - /* [in] */ Channel __RPC_FAR *channel); - - -void __RPC_STUB IChat_RequestChannelCreate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestChannelJoin_Proxy( - IChat __RPC_FAR * This, - /* [in] */ Channel __RPC_FAR *channel); - - -void __RPC_STUB IChat_RequestChannelJoin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestChannelLeave_Proxy( - IChat __RPC_FAR * This); - - -void __RPC_STUB IChat_RequestChannelLeave_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestUserList_Proxy( - IChat __RPC_FAR * This); - - -void __RPC_STUB IChat_RequestUserList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPublicMessage_Proxy( - IChat __RPC_FAR * This, - /* [in] */ LPCSTR message); - - -void __RPC_STUB IChat_RequestPublicMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPrivateMessage_Proxy( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users, - /* [in] */ LPCSTR message); - - -void __RPC_STUB IChat_RequestPrivateMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestLogout_Proxy( - IChat __RPC_FAR * This); - - -void __RPC_STUB IChat_RequestLogout_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPrivateGameOptions_Proxy( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users, - /* [in] */ LPCSTR options); - - -void __RPC_STUB IChat_RequestPrivateGameOptions_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPublicGameOptions_Proxy( - IChat __RPC_FAR * This, - /* [in] */ LPCSTR options); - - -void __RPC_STUB IChat_RequestPublicGameOptions_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPublicAction_Proxy( - IChat __RPC_FAR * This, - /* [in] */ LPCSTR action); - - -void __RPC_STUB IChat_RequestPublicAction_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPrivateAction_Proxy( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users, - /* [in] */ LPCSTR action); - - -void __RPC_STUB IChat_RequestPrivateAction_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestGameStart_Proxy( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users); - - -void __RPC_STUB IChat_RequestGameStart_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestChannelTopic_Proxy( - IChat __RPC_FAR * This, - /* [in] */ LPCSTR topic); - - -void __RPC_STUB IChat_RequestChannelTopic_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetVersion_Proxy( - IChat __RPC_FAR * This, - /* [in] */ unsigned long __RPC_FAR *version); - - -void __RPC_STUB IChat_GetVersion_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestUserKick_Proxy( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *user); - - -void __RPC_STUB IChat_RequestUserKick_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestUserIP_Proxy( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *user); - - -void __RPC_STUB IChat_RequestUserIP_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetGametypeInfo_Proxy( - IChat __RPC_FAR * This, - unsigned int gtype, - int icon_size, - unsigned char __RPC_FAR *__RPC_FAR *bitmap, - int __RPC_FAR *bmp_bytes, - LPCSTR __RPC_FAR *name, - LPCSTR __RPC_FAR *URL); - - -void __RPC_STUB IChat_GetGametypeInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestFind_Proxy( - IChat __RPC_FAR * This, - User __RPC_FAR *user); - - -void __RPC_STUB IChat_RequestFind_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPage_Proxy( - IChat __RPC_FAR * This, - User __RPC_FAR *user, - LPCSTR message); - - -void __RPC_STUB IChat_RequestPage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetFindPage_Proxy( - IChat __RPC_FAR * This, - int findOn, - int pageOn); - - -void __RPC_STUB IChat_SetFindPage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetSquelch_Proxy( - IChat __RPC_FAR * This, - User __RPC_FAR *user, - int squelch); - - -void __RPC_STUB IChat_SetSquelch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetSquelch_Proxy( - IChat __RPC_FAR * This, - User __RPC_FAR *user); - - -void __RPC_STUB IChat_GetSquelch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetChannelFilter_Proxy( - IChat __RPC_FAR * This, - int channelType); - - -void __RPC_STUB IChat_SetChannelFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestGameEnd_Proxy( - IChat __RPC_FAR * This); - - -void __RPC_STUB IChat_RequestGameEnd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetLangFilter_Proxy( - IChat __RPC_FAR * This, - int onoff); - - -void __RPC_STUB IChat_SetLangFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestChannelBan_Proxy( - IChat __RPC_FAR * This, - LPCSTR name, - int ban); - - -void __RPC_STUB IChat_RequestChannelBan_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetGametypeList_Proxy( - IChat __RPC_FAR * This, - LPCSTR __RPC_FAR *list); - - -void __RPC_STUB IChat_GetGametypeList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetHelpURL_Proxy( - IChat __RPC_FAR * This, - LPCSTR __RPC_FAR *url); - - -void __RPC_STUB IChat_GetHelpURL_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetProductSKU_Proxy( - IChat __RPC_FAR * This, - unsigned long SKU); - - -void __RPC_STUB IChat_SetProductSKU_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetNick_Proxy( - IChat __RPC_FAR * This, - int num, - LPCSTR __RPC_FAR *nick, - LPCSTR __RPC_FAR *pass); - - -void __RPC_STUB IChat_GetNick_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetNick_Proxy( - IChat __RPC_FAR * This, - int num, - LPCSTR nick, - LPCSTR pass, - int domangle); - - -void __RPC_STUB IChat_SetNick_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetLobbyCount_Proxy( - IChat __RPC_FAR * This, - int __RPC_FAR *count); - - -void __RPC_STUB IChat_GetLobbyCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestRawMessage_Proxy( - IChat __RPC_FAR * This, - LPCSTR ircmsg); - - -void __RPC_STUB IChat_RequestRawMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetAttributeValue_Proxy( - IChat __RPC_FAR * This, - LPCSTR attrib, - LPCSTR __RPC_FAR *value); - - -void __RPC_STUB IChat_GetAttributeValue_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetAttributeValue_Proxy( - IChat __RPC_FAR * This, - LPCSTR attrib, - LPCSTR value); - - -void __RPC_STUB IChat_SetAttributeValue_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetChannelExInfo_Proxy( - IChat __RPC_FAR * This, - LPCSTR info); - - -void __RPC_STUB IChat_SetChannelExInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_StopAutoping_Proxy( - IChat __RPC_FAR * This); - - -void __RPC_STUB IChat_StopAutoping_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestSquadInfo_Proxy( - IChat __RPC_FAR * This, - unsigned long id); - - -void __RPC_STUB IChat_RequestSquadInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestSetTeam_Proxy( - IChat __RPC_FAR * This, - int team); - - -void __RPC_STUB IChat_RequestSetTeam_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestSetLocale_Proxy( - IChat __RPC_FAR * This, - Locale locale); - - -void __RPC_STUB IChat_RequestSetLocale_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestUserLocale_Proxy( - IChat __RPC_FAR * This, - User __RPC_FAR *users); - - -void __RPC_STUB IChat_RequestUserLocale_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestUserTeam_Proxy( - IChat __RPC_FAR * This, - User __RPC_FAR *users); - - -void __RPC_STUB IChat_RequestUserTeam_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetNickLocale_Proxy( - IChat __RPC_FAR * This, - int nicknum, - Locale __RPC_FAR *locale); - - -void __RPC_STUB IChat_GetNickLocale_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetNickLocale_Proxy( - IChat __RPC_FAR * This, - int nicknum, - Locale locale); - - -void __RPC_STUB IChat_SetNickLocale_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetLocaleString_Proxy( - IChat __RPC_FAR * This, - LPCSTR __RPC_FAR *loc_string, - Locale locale); - - -void __RPC_STUB IChat_GetLocaleString_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_GetLocaleCount_Proxy( - IChat __RPC_FAR * This, - int __RPC_FAR *num); - - -void __RPC_STUB IChat_GetLocaleCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetClientVersion_Proxy( - IChat __RPC_FAR * This, - unsigned long version); - - -void __RPC_STUB IChat_SetClientVersion_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_SetCodepageFilter_Proxy( - IChat __RPC_FAR * This, - int filter); - - -void __RPC_STUB IChat_SetCodepageFilter_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestBuddyList_Proxy( - IChat __RPC_FAR * This); - - -void __RPC_STUB IChat_RequestBuddyList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestBuddyAdd_Proxy( - IChat __RPC_FAR * This, - User __RPC_FAR *newbuddy); - - -void __RPC_STUB IChat_RequestBuddyAdd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestBuddyDelete_Proxy( - IChat __RPC_FAR * This, - User __RPC_FAR *buddy); - - -void __RPC_STUB IChat_RequestBuddyDelete_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPublicUnicodeMessage_Proxy( - IChat __RPC_FAR * This, - /* [in] */ const unsigned short __RPC_FAR *message); - - -void __RPC_STUB IChat_RequestPublicUnicodeMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPrivateUnicodeMessage_Proxy( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users, - /* [in] */ const unsigned short __RPC_FAR *message); - - -void __RPC_STUB IChat_RequestPrivateUnicodeMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPublicUnicodeAction_Proxy( - IChat __RPC_FAR * This, - /* [in] */ const unsigned short __RPC_FAR *action); - - -void __RPC_STUB IChat_RequestPublicUnicodeAction_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestPrivateUnicodeAction_Proxy( - IChat __RPC_FAR * This, - /* [in] */ User __RPC_FAR *users, - /* [in] */ const unsigned short __RPC_FAR *action); - - -void __RPC_STUB IChat_RequestPrivateUnicodeAction_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestUnicodePage_Proxy( - IChat __RPC_FAR * This, - User __RPC_FAR *user, - const unsigned short __RPC_FAR *message); - - -void __RPC_STUB IChat_RequestUnicodePage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestSetPlayerCount_Proxy( - IChat __RPC_FAR * This, - unsigned int currentPlayers, - unsigned int maxPlayers); - - -void __RPC_STUB IChat_RequestSetPlayerCount_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestServerTime_Proxy( - IChat __RPC_FAR * This); - - -void __RPC_STUB IChat_RequestServerTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestInsiderStatus_Proxy( - IChat __RPC_FAR * This, - User __RPC_FAR *users); - - -void __RPC_STUB IChat_RequestInsiderStatus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestSetLocalIP_Proxy( - IChat __RPC_FAR * This); - - -void __RPC_STUB IChat_RequestSetLocalIP_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat_RequestSquadByName_Proxy( - IChat __RPC_FAR * This, - LPCSTR name); - - -void __RPC_STUB IChat_RequestSquadByName_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IChat_INTERFACE_DEFINED__ */ - - -#ifndef __IChatEvent_INTERFACE_DEFINED__ -#define __IChatEvent_INTERFACE_DEFINED__ - -/* interface IChatEvent */ -/* [object][unique][helpstring][uuid] */ - - -EXTERN_C const IID IID_IChatEvent; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("4DD3BAF6-7579-11D1-B1C6-006097176556") - IChatEvent : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnServerList( - /* [in] */ HRESULT res, - /* [in] */ Server __RPC_FAR *servers) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnUpdateList( - /* [in] */ HRESULT res, - /* [in] */ Update __RPC_FAR *updates) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnServerError( - /* [in] */ HRESULT res, - /* [in] */ LPCSTR ircmsg) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnConnection( - /* [in] */ HRESULT res, - /* [in] */ LPCSTR motd) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnMessageOfTheDay( - /* [in] */ HRESULT res, - /* [in] */ LPCSTR motd) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelList( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channels) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelCreate( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelJoin( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelLeave( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelTopic( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ LPCSTR topic) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPrivateAction( - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR action) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPublicAction( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - User __RPC_FAR *user, - /* [in] */ LPCSTR action) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnUserList( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *users) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPublicMessage( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPrivateMessage( - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnSystemMessage( - /* [in] */ HRESULT res, - /* [in] */ LPCSTR message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnNetStatus( - /* [in] */ HRESULT res) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnLogout( - /* [in] */ HRESULT status, - /* [in] */ User __RPC_FAR *user) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPrivateGameOptions( - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR options) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPublicGameOptions( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR options) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnGameStart( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *users, - /* [in] */ int gameid) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnUserKick( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *kicked, - /* [in] */ User __RPC_FAR *kicker) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnUserIP( - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnFind( - HRESULT res, - Channel __RPC_FAR *chan) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPageSend( - HRESULT res) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPaged( - HRESULT res, - User __RPC_FAR *user, - LPCSTR message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnServerBannedYou( - HRESULT res, - time_t bannedTill) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnUserFlags( - HRESULT res, - LPCSTR name, - unsigned int flags, - unsigned int mask) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelBan( - HRESULT res, - LPCSTR name, - int banned) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnSquadInfo( - HRESULT res, - unsigned long id, - Squad __RPC_FAR *squad) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnUserLocale( - HRESULT res, - User __RPC_FAR *users) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnUserTeam( - HRESULT res, - User __RPC_FAR *users) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnSetLocale( - HRESULT res, - Locale newlocale) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnSetTeam( - HRESULT res, - int newteam) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnBuddyList( - HRESULT res, - User __RPC_FAR *buddy_list) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnBuddyAdd( - HRESULT res, - User __RPC_FAR *buddy_added) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnBuddyDelete( - HRESULT res, - User __RPC_FAR *buddy_deleted) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPublicUnicodeMessage( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPrivateUnicodeMessage( - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPrivateUnicodeAction( - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *action) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPublicUnicodeAction( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *action) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnPagedUnicode( - HRESULT res, - User __RPC_FAR *user, - const unsigned short __RPC_FAR *message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnServerTime( - HRESULT res, - time_t stime) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnInsiderStatus( - HRESULT res, - User __RPC_FAR *users) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnSetLocalIP( - HRESULT res, - LPCSTR message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelListBegin( - /* [in] */ HRESULT res) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelListEntry( - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelListEnd( - /* [in] */ HRESULT res) = 0; - - }; - -#else /* C style interface */ - - typedef struct IChatEventVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IChatEvent __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IChatEvent __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IChatEvent __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnServerList )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Server __RPC_FAR *servers); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnUpdateList )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Update __RPC_FAR *updates); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnServerError )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ LPCSTR ircmsg); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnConnection )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ LPCSTR motd); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnMessageOfTheDay )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ LPCSTR motd); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelList )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channels); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelCreate )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelJoin )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelLeave )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelTopic )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ LPCSTR topic); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPrivateAction )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR action); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPublicAction )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - User __RPC_FAR *user, - /* [in] */ LPCSTR action); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnUserList )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *users); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPublicMessage )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPrivateMessage )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnSystemMessage )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ LPCSTR message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnNetStatus )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnLogout )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT status, - /* [in] */ User __RPC_FAR *user); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPrivateGameOptions )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR options); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPublicGameOptions )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR options); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnGameStart )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *users, - /* [in] */ int gameid); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnUserKick )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *kicked, - /* [in] */ User __RPC_FAR *kicker); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnUserIP )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnFind )( - IChatEvent __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *chan); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPageSend )( - IChatEvent __RPC_FAR * This, - HRESULT res); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPaged )( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *user, - LPCSTR message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnServerBannedYou )( - IChatEvent __RPC_FAR * This, - HRESULT res, - time_t bannedTill); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnUserFlags )( - IChatEvent __RPC_FAR * This, - HRESULT res, - LPCSTR name, - unsigned int flags, - unsigned int mask); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelBan )( - IChatEvent __RPC_FAR * This, - HRESULT res, - LPCSTR name, - int banned); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnSquadInfo )( - IChatEvent __RPC_FAR * This, - HRESULT res, - unsigned long id, - Squad __RPC_FAR *squad); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnUserLocale )( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *users); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnUserTeam )( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *users); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnSetLocale )( - IChatEvent __RPC_FAR * This, - HRESULT res, - Locale newlocale); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnSetTeam )( - IChatEvent __RPC_FAR * This, - HRESULT res, - int newteam); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnBuddyList )( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *buddy_list); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnBuddyAdd )( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *buddy_added); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnBuddyDelete )( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *buddy_deleted); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPublicUnicodeMessage )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPrivateUnicodeMessage )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPrivateUnicodeAction )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *action); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPublicUnicodeAction )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *action); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPagedUnicode )( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *user, - const unsigned short __RPC_FAR *message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnServerTime )( - IChatEvent __RPC_FAR * This, - HRESULT res, - time_t stime); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnInsiderStatus )( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *users); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnSetLocalIP )( - IChatEvent __RPC_FAR * This, - HRESULT res, - LPCSTR message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelListBegin )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelListEntry )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelListEnd )( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res); - - END_INTERFACE - } IChatEventVtbl; - - interface IChatEvent - { - CONST_VTBL struct IChatEventVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IChatEvent_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IChatEvent_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IChatEvent_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IChatEvent_OnServerList(This,res,servers) \ - (This)->lpVtbl -> OnServerList(This,res,servers) - -#define IChatEvent_OnUpdateList(This,res,updates) \ - (This)->lpVtbl -> OnUpdateList(This,res,updates) - -#define IChatEvent_OnServerError(This,res,ircmsg) \ - (This)->lpVtbl -> OnServerError(This,res,ircmsg) - -#define IChatEvent_OnConnection(This,res,motd) \ - (This)->lpVtbl -> OnConnection(This,res,motd) - -#define IChatEvent_OnMessageOfTheDay(This,res,motd) \ - (This)->lpVtbl -> OnMessageOfTheDay(This,res,motd) - -#define IChatEvent_OnChannelList(This,res,channels) \ - (This)->lpVtbl -> OnChannelList(This,res,channels) - -#define IChatEvent_OnChannelCreate(This,res,channel) \ - (This)->lpVtbl -> OnChannelCreate(This,res,channel) - -#define IChatEvent_OnChannelJoin(This,res,channel,user) \ - (This)->lpVtbl -> OnChannelJoin(This,res,channel,user) - -#define IChatEvent_OnChannelLeave(This,res,channel,user) \ - (This)->lpVtbl -> OnChannelLeave(This,res,channel,user) - -#define IChatEvent_OnChannelTopic(This,res,channel,topic) \ - (This)->lpVtbl -> OnChannelTopic(This,res,channel,topic) - -#define IChatEvent_OnPrivateAction(This,res,user,action) \ - (This)->lpVtbl -> OnPrivateAction(This,res,user,action) - -#define IChatEvent_OnPublicAction(This,res,channel,user,action) \ - (This)->lpVtbl -> OnPublicAction(This,res,channel,user,action) - -#define IChatEvent_OnUserList(This,res,channel,users) \ - (This)->lpVtbl -> OnUserList(This,res,channel,users) - -#define IChatEvent_OnPublicMessage(This,res,channel,user,message) \ - (This)->lpVtbl -> OnPublicMessage(This,res,channel,user,message) - -#define IChatEvent_OnPrivateMessage(This,res,user,message) \ - (This)->lpVtbl -> OnPrivateMessage(This,res,user,message) - -#define IChatEvent_OnSystemMessage(This,res,message) \ - (This)->lpVtbl -> OnSystemMessage(This,res,message) - -#define IChatEvent_OnNetStatus(This,res) \ - (This)->lpVtbl -> OnNetStatus(This,res) - -#define IChatEvent_OnLogout(This,status,user) \ - (This)->lpVtbl -> OnLogout(This,status,user) - -#define IChatEvent_OnPrivateGameOptions(This,res,user,options) \ - (This)->lpVtbl -> OnPrivateGameOptions(This,res,user,options) - -#define IChatEvent_OnPublicGameOptions(This,res,channel,user,options) \ - (This)->lpVtbl -> OnPublicGameOptions(This,res,channel,user,options) - -#define IChatEvent_OnGameStart(This,res,channel,users,gameid) \ - (This)->lpVtbl -> OnGameStart(This,res,channel,users,gameid) - -#define IChatEvent_OnUserKick(This,res,channel,kicked,kicker) \ - (This)->lpVtbl -> OnUserKick(This,res,channel,kicked,kicker) - -#define IChatEvent_OnUserIP(This,res,user) \ - (This)->lpVtbl -> OnUserIP(This,res,user) - -#define IChatEvent_OnFind(This,res,chan) \ - (This)->lpVtbl -> OnFind(This,res,chan) - -#define IChatEvent_OnPageSend(This,res) \ - (This)->lpVtbl -> OnPageSend(This,res) - -#define IChatEvent_OnPaged(This,res,user,message) \ - (This)->lpVtbl -> OnPaged(This,res,user,message) - -#define IChatEvent_OnServerBannedYou(This,res,bannedTill) \ - (This)->lpVtbl -> OnServerBannedYou(This,res,bannedTill) - -#define IChatEvent_OnUserFlags(This,res,name,flags,mask) \ - (This)->lpVtbl -> OnUserFlags(This,res,name,flags,mask) - -#define IChatEvent_OnChannelBan(This,res,name,banned) \ - (This)->lpVtbl -> OnChannelBan(This,res,name,banned) - -#define IChatEvent_OnSquadInfo(This,res,id,squad) \ - (This)->lpVtbl -> OnSquadInfo(This,res,id,squad) - -#define IChatEvent_OnUserLocale(This,res,users) \ - (This)->lpVtbl -> OnUserLocale(This,res,users) - -#define IChatEvent_OnUserTeam(This,res,users) \ - (This)->lpVtbl -> OnUserTeam(This,res,users) - -#define IChatEvent_OnSetLocale(This,res,newlocale) \ - (This)->lpVtbl -> OnSetLocale(This,res,newlocale) - -#define IChatEvent_OnSetTeam(This,res,newteam) \ - (This)->lpVtbl -> OnSetTeam(This,res,newteam) - -#define IChatEvent_OnBuddyList(This,res,buddy_list) \ - (This)->lpVtbl -> OnBuddyList(This,res,buddy_list) - -#define IChatEvent_OnBuddyAdd(This,res,buddy_added) \ - (This)->lpVtbl -> OnBuddyAdd(This,res,buddy_added) - -#define IChatEvent_OnBuddyDelete(This,res,buddy_deleted) \ - (This)->lpVtbl -> OnBuddyDelete(This,res,buddy_deleted) - -#define IChatEvent_OnPublicUnicodeMessage(This,res,channel,user,message) \ - (This)->lpVtbl -> OnPublicUnicodeMessage(This,res,channel,user,message) - -#define IChatEvent_OnPrivateUnicodeMessage(This,res,user,message) \ - (This)->lpVtbl -> OnPrivateUnicodeMessage(This,res,user,message) - -#define IChatEvent_OnPrivateUnicodeAction(This,res,user,action) \ - (This)->lpVtbl -> OnPrivateUnicodeAction(This,res,user,action) - -#define IChatEvent_OnPublicUnicodeAction(This,res,channel,user,action) \ - (This)->lpVtbl -> OnPublicUnicodeAction(This,res,channel,user,action) - -#define IChatEvent_OnPagedUnicode(This,res,user,message) \ - (This)->lpVtbl -> OnPagedUnicode(This,res,user,message) - -#define IChatEvent_OnServerTime(This,res,stime) \ - (This)->lpVtbl -> OnServerTime(This,res,stime) - -#define IChatEvent_OnInsiderStatus(This,res,users) \ - (This)->lpVtbl -> OnInsiderStatus(This,res,users) - -#define IChatEvent_OnSetLocalIP(This,res,message) \ - (This)->lpVtbl -> OnSetLocalIP(This,res,message) - -#define IChatEvent_OnChannelListBegin(This,res) \ - (This)->lpVtbl -> OnChannelListBegin(This,res) - -#define IChatEvent_OnChannelListEntry(This,res,channel) \ - (This)->lpVtbl -> OnChannelListEntry(This,res,channel) - -#define IChatEvent_OnChannelListEnd(This,res) \ - (This)->lpVtbl -> OnChannelListEnd(This,res) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnServerList_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Server __RPC_FAR *servers); - - -void __RPC_STUB IChatEvent_OnServerList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnUpdateList_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Update __RPC_FAR *updates); - - -void __RPC_STUB IChatEvent_OnUpdateList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnServerError_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ LPCSTR ircmsg); - - -void __RPC_STUB IChatEvent_OnServerError_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnConnection_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ LPCSTR motd); - - -void __RPC_STUB IChatEvent_OnConnection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnMessageOfTheDay_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ LPCSTR motd); - - -void __RPC_STUB IChatEvent_OnMessageOfTheDay_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnChannelList_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channels); - - -void __RPC_STUB IChatEvent_OnChannelList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnChannelCreate_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel); - - -void __RPC_STUB IChatEvent_OnChannelCreate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnChannelJoin_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user); - - -void __RPC_STUB IChatEvent_OnChannelJoin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnChannelLeave_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user); - - -void __RPC_STUB IChatEvent_OnChannelLeave_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnChannelTopic_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ LPCSTR topic); - - -void __RPC_STUB IChatEvent_OnChannelTopic_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPrivateAction_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR action); - - -void __RPC_STUB IChatEvent_OnPrivateAction_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPublicAction_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - User __RPC_FAR *user, - /* [in] */ LPCSTR action); - - -void __RPC_STUB IChatEvent_OnPublicAction_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnUserList_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *users); - - -void __RPC_STUB IChatEvent_OnUserList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPublicMessage_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR message); - - -void __RPC_STUB IChatEvent_OnPublicMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPrivateMessage_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR message); - - -void __RPC_STUB IChatEvent_OnPrivateMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnSystemMessage_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ LPCSTR message); - - -void __RPC_STUB IChatEvent_OnSystemMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnNetStatus_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res); - - -void __RPC_STUB IChatEvent_OnNetStatus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnLogout_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT status, - /* [in] */ User __RPC_FAR *user); - - -void __RPC_STUB IChatEvent_OnLogout_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPrivateGameOptions_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR options); - - -void __RPC_STUB IChatEvent_OnPrivateGameOptions_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPublicGameOptions_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user, - /* [in] */ LPCSTR options); - - -void __RPC_STUB IChatEvent_OnPublicGameOptions_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnGameStart_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *users, - /* [in] */ int gameid); - - -void __RPC_STUB IChatEvent_OnGameStart_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnUserKick_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *kicked, - /* [in] */ User __RPC_FAR *kicker); - - -void __RPC_STUB IChatEvent_OnUserKick_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnUserIP_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user); - - -void __RPC_STUB IChatEvent_OnUserIP_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnFind_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *chan); - - -void __RPC_STUB IChatEvent_OnFind_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPageSend_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res); - - -void __RPC_STUB IChatEvent_OnPageSend_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPaged_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *user, - LPCSTR message); - - -void __RPC_STUB IChatEvent_OnPaged_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnServerBannedYou_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - time_t bannedTill); - - -void __RPC_STUB IChatEvent_OnServerBannedYou_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnUserFlags_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - LPCSTR name, - unsigned int flags, - unsigned int mask); - - -void __RPC_STUB IChatEvent_OnUserFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnChannelBan_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - LPCSTR name, - int banned); - - -void __RPC_STUB IChatEvent_OnChannelBan_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnSquadInfo_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - unsigned long id, - Squad __RPC_FAR *squad); - - -void __RPC_STUB IChatEvent_OnSquadInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnUserLocale_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *users); - - -void __RPC_STUB IChatEvent_OnUserLocale_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnUserTeam_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *users); - - -void __RPC_STUB IChatEvent_OnUserTeam_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnSetLocale_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - Locale newlocale); - - -void __RPC_STUB IChatEvent_OnSetLocale_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnSetTeam_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - int newteam); - - -void __RPC_STUB IChatEvent_OnSetTeam_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnBuddyList_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *buddy_list); - - -void __RPC_STUB IChatEvent_OnBuddyList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnBuddyAdd_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *buddy_added); - - -void __RPC_STUB IChatEvent_OnBuddyAdd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnBuddyDelete_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *buddy_deleted); - - -void __RPC_STUB IChatEvent_OnBuddyDelete_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPublicUnicodeMessage_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - /* [in] */ User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *message); - - -void __RPC_STUB IChatEvent_OnPublicUnicodeMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPrivateUnicodeMessage_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *message); - - -void __RPC_STUB IChatEvent_OnPrivateUnicodeMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPrivateUnicodeAction_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *action); - - -void __RPC_STUB IChatEvent_OnPrivateUnicodeAction_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPublicUnicodeAction_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel, - User __RPC_FAR *user, - /* [in] */ const unsigned short __RPC_FAR *action); - - -void __RPC_STUB IChatEvent_OnPublicUnicodeAction_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnPagedUnicode_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *user, - const unsigned short __RPC_FAR *message); - - -void __RPC_STUB IChatEvent_OnPagedUnicode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnServerTime_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - time_t stime); - - -void __RPC_STUB IChatEvent_OnServerTime_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnInsiderStatus_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *users); - - -void __RPC_STUB IChatEvent_OnInsiderStatus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnSetLocalIP_Proxy( - IChatEvent __RPC_FAR * This, - HRESULT res, - LPCSTR message); - - -void __RPC_STUB IChatEvent_OnSetLocalIP_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnChannelListBegin_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res); - - -void __RPC_STUB IChatEvent_OnChannelListBegin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnChannelListEntry_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res, - /* [in] */ Channel __RPC_FAR *channel); - - -void __RPC_STUB IChatEvent_OnChannelListEntry_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChatEvent_OnChannelListEnd_Proxy( - IChatEvent __RPC_FAR * This, - /* [in] */ HRESULT res); - - -void __RPC_STUB IChatEvent_OnChannelListEnd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IChatEvent_INTERFACE_DEFINED__ */ - - -#ifndef __IDownload_INTERFACE_DEFINED__ -#define __IDownload_INTERFACE_DEFINED__ - -/* interface IDownload */ -/* [unique][helpstring][dual][uuid][object] */ - - -EXTERN_C const IID IID_IDownload; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("0BF5FCEB-9F03-11D1-9DC7-006097C54321") - IDownload : public IUnknown - { - public: - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE DownloadFile( - LPCSTR server, - LPCSTR login, - LPCSTR password, - LPCSTR file, - LPCSTR localfile, - LPCSTR regkey) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Abort( void) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE PumpMessages( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDownloadVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IDownload __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IDownload __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IDownload __RPC_FAR * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DownloadFile )( - IDownload __RPC_FAR * This, - LPCSTR server, - LPCSTR login, - LPCSTR password, - LPCSTR file, - LPCSTR localfile, - LPCSTR regkey); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Abort )( - IDownload __RPC_FAR * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PumpMessages )( - IDownload __RPC_FAR * This); - - END_INTERFACE - } IDownloadVtbl; - - interface IDownload - { - CONST_VTBL struct IDownloadVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDownload_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDownload_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDownload_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDownload_DownloadFile(This,server,login,password,file,localfile,regkey) \ - (This)->lpVtbl -> DownloadFile(This,server,login,password,file,localfile,regkey) - -#define IDownload_Abort(This) \ - (This)->lpVtbl -> Abort(This) - -#define IDownload_PumpMessages(This) \ - (This)->lpVtbl -> PumpMessages(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IDownload_DownloadFile_Proxy( - IDownload __RPC_FAR * This, - LPCSTR server, - LPCSTR login, - LPCSTR password, - LPCSTR file, - LPCSTR localfile, - LPCSTR regkey); - - -void __RPC_STUB IDownload_DownloadFile_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IDownload_Abort_Proxy( - IDownload __RPC_FAR * This); - - -void __RPC_STUB IDownload_Abort_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IDownload_PumpMessages_Proxy( - IDownload __RPC_FAR * This); - - -void __RPC_STUB IDownload_PumpMessages_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDownload_INTERFACE_DEFINED__ */ - - -#ifndef __IDownloadEvent_INTERFACE_DEFINED__ -#define __IDownloadEvent_INTERFACE_DEFINED__ - -/* interface IDownloadEvent */ -/* [object][unique][helpstring][uuid] */ - - -EXTERN_C const IID IID_IDownloadEvent; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("6869E99D-9FB4-11D1-9DC8-006097C54321") - IDownloadEvent : public IUnknown - { - public: - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnEnd( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnError( - int error) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnProgressUpdate( - int bytesread, - int totalsize, - int timetaken, - int timeleft) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnQueryResume( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnStatusUpdate( - int status) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDownloadEventVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IDownloadEvent __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IDownloadEvent __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IDownloadEvent __RPC_FAR * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnEnd )( - IDownloadEvent __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnError )( - IDownloadEvent __RPC_FAR * This, - int error); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnProgressUpdate )( - IDownloadEvent __RPC_FAR * This, - int bytesread, - int totalsize, - int timetaken, - int timeleft); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnQueryResume )( - IDownloadEvent __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnStatusUpdate )( - IDownloadEvent __RPC_FAR * This, - int status); - - END_INTERFACE - } IDownloadEventVtbl; - - interface IDownloadEvent - { - CONST_VTBL struct IDownloadEventVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDownloadEvent_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDownloadEvent_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDownloadEvent_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDownloadEvent_OnEnd(This) \ - (This)->lpVtbl -> OnEnd(This) - -#define IDownloadEvent_OnError(This,error) \ - (This)->lpVtbl -> OnError(This,error) - -#define IDownloadEvent_OnProgressUpdate(This,bytesread,totalsize,timetaken,timeleft) \ - (This)->lpVtbl -> OnProgressUpdate(This,bytesread,totalsize,timetaken,timeleft) - -#define IDownloadEvent_OnQueryResume(This) \ - (This)->lpVtbl -> OnQueryResume(This) - -#define IDownloadEvent_OnStatusUpdate(This,status) \ - (This)->lpVtbl -> OnStatusUpdate(This,status) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IDownloadEvent_OnEnd_Proxy( - IDownloadEvent __RPC_FAR * This); - - -void __RPC_STUB IDownloadEvent_OnEnd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IDownloadEvent_OnError_Proxy( - IDownloadEvent __RPC_FAR * This, - int error); - - -void __RPC_STUB IDownloadEvent_OnError_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IDownloadEvent_OnProgressUpdate_Proxy( - IDownloadEvent __RPC_FAR * This, - int bytesread, - int totalsize, - int timetaken, - int timeleft); - - -void __RPC_STUB IDownloadEvent_OnProgressUpdate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IDownloadEvent_OnQueryResume_Proxy( - IDownloadEvent __RPC_FAR * This); - - -void __RPC_STUB IDownloadEvent_OnQueryResume_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IDownloadEvent_OnStatusUpdate_Proxy( - IDownloadEvent __RPC_FAR * This, - int status); - - -void __RPC_STUB IDownloadEvent_OnStatusUpdate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDownloadEvent_INTERFACE_DEFINED__ */ - - -#ifndef __INetUtil_INTERFACE_DEFINED__ -#define __INetUtil_INTERFACE_DEFINED__ - -/* interface INetUtil */ -/* [object][unique][helpstring][uuid] */ - - -EXTERN_C const IID IID_INetUtil; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B832B0AA-A7D3-11D1-97C3-00609706FA0C") - INetUtil : public IUnknown - { - public: - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE RequestGameresSend( - LPCSTR host, - int port, - unsigned char __RPC_FAR *data, - int length) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE RequestLadderSearch( - LPCSTR host, - int port, - LPCSTR key, - unsigned long SKU, - int team, - int cond, - int sort, - int number, - int leading) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE RequestLadderList( - LPCSTR host, - int port, - LPCSTR keys, - unsigned long SKU, - int team, - int cond, - int sort) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE RequestPing( - LPCSTR host, - int timeout, - int __RPC_FAR *handle) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE PumpMessages( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetAvgPing( - unsigned long ip, - int __RPC_FAR *avg) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestNewNick( - LPCSTR nick, - LPCSTR pass, - LPCSTR email, - LPCSTR parentEmail, - int newsletter, - int shareinfo) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestAgeCheck( - int month, - int day, - int year, - LPCSTR email) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestWDTState( - LPCSTR host, - int port, - unsigned char request) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestLocaleLadderList( - LPCSTR host, - int port, - LPCSTR keys, - unsigned long SKU, - int team, - int cond, - int sort, - Locale locale) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestLocaleLadderSearch( - LPCSTR host, - int port, - LPCSTR key, - unsigned long sku, - int team, - int cond, - int sort, - int number, - int leading, - Locale locale) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestHighscore( - LPCSTR host, - int port, - LPCSTR keys, - unsigned long SKU) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetGameResMD5( - int flag) = 0; - - }; - -#else /* C style interface */ - - typedef struct INetUtilVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - INetUtil __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - INetUtil __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - INetUtil __RPC_FAR * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestGameresSend )( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - unsigned char __RPC_FAR *data, - int length); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestLadderSearch )( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - LPCSTR key, - unsigned long SKU, - int team, - int cond, - int sort, - int number, - int leading); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestLadderList )( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - LPCSTR keys, - unsigned long SKU, - int team, - int cond, - int sort); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestPing )( - INetUtil __RPC_FAR * This, - LPCSTR host, - int timeout, - int __RPC_FAR *handle); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PumpMessages )( - INetUtil __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetAvgPing )( - INetUtil __RPC_FAR * This, - unsigned long ip, - int __RPC_FAR *avg); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestNewNick )( - INetUtil __RPC_FAR * This, - LPCSTR nick, - LPCSTR pass, - LPCSTR email, - LPCSTR parentEmail, - int newsletter, - int shareinfo); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestAgeCheck )( - INetUtil __RPC_FAR * This, - int month, - int day, - int year, - LPCSTR email); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestWDTState )( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - unsigned char request); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestLocaleLadderList )( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - LPCSTR keys, - unsigned long SKU, - int team, - int cond, - int sort, - Locale locale); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestLocaleLadderSearch )( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - LPCSTR key, - unsigned long sku, - int team, - int cond, - int sort, - int number, - int leading, - Locale locale); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestHighscore )( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - LPCSTR keys, - unsigned long SKU); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetGameResMD5 )( - INetUtil __RPC_FAR * This, - int flag); - - END_INTERFACE - } INetUtilVtbl; - - interface INetUtil - { - CONST_VTBL struct INetUtilVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define INetUtil_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define INetUtil_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define INetUtil_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define INetUtil_RequestGameresSend(This,host,port,data,length) \ - (This)->lpVtbl -> RequestGameresSend(This,host,port,data,length) - -#define INetUtil_RequestLadderSearch(This,host,port,key,SKU,team,cond,sort,number,leading) \ - (This)->lpVtbl -> RequestLadderSearch(This,host,port,key,SKU,team,cond,sort,number,leading) - -#define INetUtil_RequestLadderList(This,host,port,keys,SKU,team,cond,sort) \ - (This)->lpVtbl -> RequestLadderList(This,host,port,keys,SKU,team,cond,sort) - -#define INetUtil_RequestPing(This,host,timeout,handle) \ - (This)->lpVtbl -> RequestPing(This,host,timeout,handle) - -#define INetUtil_PumpMessages(This) \ - (This)->lpVtbl -> PumpMessages(This) - -#define INetUtil_GetAvgPing(This,ip,avg) \ - (This)->lpVtbl -> GetAvgPing(This,ip,avg) - -#define INetUtil_RequestNewNick(This,nick,pass,email,parentEmail,newsletter,shareinfo) \ - (This)->lpVtbl -> RequestNewNick(This,nick,pass,email,parentEmail,newsletter,shareinfo) - -#define INetUtil_RequestAgeCheck(This,month,day,year,email) \ - (This)->lpVtbl -> RequestAgeCheck(This,month,day,year,email) - -#define INetUtil_RequestWDTState(This,host,port,request) \ - (This)->lpVtbl -> RequestWDTState(This,host,port,request) - -#define INetUtil_RequestLocaleLadderList(This,host,port,keys,SKU,team,cond,sort,locale) \ - (This)->lpVtbl -> RequestLocaleLadderList(This,host,port,keys,SKU,team,cond,sort,locale) - -#define INetUtil_RequestLocaleLadderSearch(This,host,port,key,sku,team,cond,sort,number,leading,locale) \ - (This)->lpVtbl -> RequestLocaleLadderSearch(This,host,port,key,sku,team,cond,sort,number,leading,locale) - -#define INetUtil_RequestHighscore(This,host,port,keys,SKU) \ - (This)->lpVtbl -> RequestHighscore(This,host,port,keys,SKU) - -#define INetUtil_SetGameResMD5(This,flag) \ - (This)->lpVtbl -> SetGameResMD5(This,flag) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE INetUtil_RequestGameresSend_Proxy( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - unsigned char __RPC_FAR *data, - int length); - - -void __RPC_STUB INetUtil_RequestGameresSend_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE INetUtil_RequestLadderSearch_Proxy( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - LPCSTR key, - unsigned long SKU, - int team, - int cond, - int sort, - int number, - int leading); - - -void __RPC_STUB INetUtil_RequestLadderSearch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE INetUtil_RequestLadderList_Proxy( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - LPCSTR keys, - unsigned long SKU, - int team, - int cond, - int sort); - - -void __RPC_STUB INetUtil_RequestLadderList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE INetUtil_RequestPing_Proxy( - INetUtil __RPC_FAR * This, - LPCSTR host, - int timeout, - int __RPC_FAR *handle); - - -void __RPC_STUB INetUtil_RequestPing_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE INetUtil_PumpMessages_Proxy( - INetUtil __RPC_FAR * This); - - -void __RPC_STUB INetUtil_PumpMessages_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtil_GetAvgPing_Proxy( - INetUtil __RPC_FAR * This, - unsigned long ip, - int __RPC_FAR *avg); - - -void __RPC_STUB INetUtil_GetAvgPing_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtil_RequestNewNick_Proxy( - INetUtil __RPC_FAR * This, - LPCSTR nick, - LPCSTR pass, - LPCSTR email, - LPCSTR parentEmail, - int newsletter, - int shareinfo); - - -void __RPC_STUB INetUtil_RequestNewNick_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtil_RequestAgeCheck_Proxy( - INetUtil __RPC_FAR * This, - int month, - int day, - int year, - LPCSTR email); - - -void __RPC_STUB INetUtil_RequestAgeCheck_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtil_RequestWDTState_Proxy( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - unsigned char request); - - -void __RPC_STUB INetUtil_RequestWDTState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtil_RequestLocaleLadderList_Proxy( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - LPCSTR keys, - unsigned long SKU, - int team, - int cond, - int sort, - Locale locale); - - -void __RPC_STUB INetUtil_RequestLocaleLadderList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtil_RequestLocaleLadderSearch_Proxy( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - LPCSTR key, - unsigned long sku, - int team, - int cond, - int sort, - int number, - int leading, - Locale locale); - - -void __RPC_STUB INetUtil_RequestLocaleLadderSearch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtil_RequestHighscore_Proxy( - INetUtil __RPC_FAR * This, - LPCSTR host, - int port, - LPCSTR keys, - unsigned long SKU); - - -void __RPC_STUB INetUtil_RequestHighscore_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtil_SetGameResMD5_Proxy( - INetUtil __RPC_FAR * This, - int flag); - - -void __RPC_STUB INetUtil_SetGameResMD5_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __INetUtil_INTERFACE_DEFINED__ */ - - -#ifndef __INetUtilEvent_INTERFACE_DEFINED__ -#define __INetUtilEvent_INTERFACE_DEFINED__ - -/* interface INetUtilEvent */ -/* [object][unique][helpstring][uuid] */ - - -EXTERN_C const IID IID_INetUtilEvent; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B832B0AC-A7D3-11D1-97C3-00609706FA0C") - INetUtilEvent : public IUnknown - { - public: - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnPing( - HRESULT res, - int time, - unsigned long ip, - int handle) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnLadderList( - HRESULT res, - /* [in] */ Ladder __RPC_FAR *list, - int totalCount, - long timeStamp, - int keyRung) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnGameresSent( - HRESULT res) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnNewNick( - HRESULT res, - LPCSTR message, - LPCSTR nick, - LPCSTR pass) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnAgeCheck( - HRESULT res, - int years, - int consent) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnWDTState( - HRESULT res, - unsigned char __RPC_FAR *state, - int length) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnHighscore( - HRESULT res, - /* [in] */ Highscore __RPC_FAR *list, - int totalCount, - long timeStamp, - int keyRung) = 0; - - }; - -#else /* C style interface */ - - typedef struct INetUtilEventVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - INetUtilEvent __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - INetUtilEvent __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - INetUtilEvent __RPC_FAR * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnPing )( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - int time, - unsigned long ip, - int handle); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnLadderList )( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - /* [in] */ Ladder __RPC_FAR *list, - int totalCount, - long timeStamp, - int keyRung); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnGameresSent )( - INetUtilEvent __RPC_FAR * This, - HRESULT res); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnNewNick )( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - LPCSTR message, - LPCSTR nick, - LPCSTR pass); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnAgeCheck )( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - int years, - int consent); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnWDTState )( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - unsigned char __RPC_FAR *state, - int length); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnHighscore )( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - /* [in] */ Highscore __RPC_FAR *list, - int totalCount, - long timeStamp, - int keyRung); - - END_INTERFACE - } INetUtilEventVtbl; - - interface INetUtilEvent - { - CONST_VTBL struct INetUtilEventVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define INetUtilEvent_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define INetUtilEvent_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define INetUtilEvent_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define INetUtilEvent_OnPing(This,res,time,ip,handle) \ - (This)->lpVtbl -> OnPing(This,res,time,ip,handle) - -#define INetUtilEvent_OnLadderList(This,res,list,totalCount,timeStamp,keyRung) \ - (This)->lpVtbl -> OnLadderList(This,res,list,totalCount,timeStamp,keyRung) - -#define INetUtilEvent_OnGameresSent(This,res) \ - (This)->lpVtbl -> OnGameresSent(This,res) - -#define INetUtilEvent_OnNewNick(This,res,message,nick,pass) \ - (This)->lpVtbl -> OnNewNick(This,res,message,nick,pass) - -#define INetUtilEvent_OnAgeCheck(This,res,years,consent) \ - (This)->lpVtbl -> OnAgeCheck(This,res,years,consent) - -#define INetUtilEvent_OnWDTState(This,res,state,length) \ - (This)->lpVtbl -> OnWDTState(This,res,state,length) - -#define INetUtilEvent_OnHighscore(This,res,list,totalCount,timeStamp,keyRung) \ - (This)->lpVtbl -> OnHighscore(This,res,list,totalCount,timeStamp,keyRung) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE INetUtilEvent_OnPing_Proxy( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - int time, - unsigned long ip, - int handle); - - -void __RPC_STUB INetUtilEvent_OnPing_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE INetUtilEvent_OnLadderList_Proxy( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - /* [in] */ Ladder __RPC_FAR *list, - int totalCount, - long timeStamp, - int keyRung); - - -void __RPC_STUB INetUtilEvent_OnLadderList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE INetUtilEvent_OnGameresSent_Proxy( - INetUtilEvent __RPC_FAR * This, - HRESULT res); - - -void __RPC_STUB INetUtilEvent_OnGameresSent_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtilEvent_OnNewNick_Proxy( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - LPCSTR message, - LPCSTR nick, - LPCSTR pass); - - -void __RPC_STUB INetUtilEvent_OnNewNick_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtilEvent_OnAgeCheck_Proxy( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - int years, - int consent); - - -void __RPC_STUB INetUtilEvent_OnAgeCheck_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtilEvent_OnWDTState_Proxy( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - unsigned char __RPC_FAR *state, - int length); - - -void __RPC_STUB INetUtilEvent_OnWDTState_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE INetUtilEvent_OnHighscore_Proxy( - INetUtilEvent __RPC_FAR * This, - HRESULT res, - /* [in] */ Highscore __RPC_FAR *list, - int totalCount, - long timeStamp, - int keyRung); - - -void __RPC_STUB INetUtilEvent_OnHighscore_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __INetUtilEvent_INTERFACE_DEFINED__ */ - - -#ifndef __IChat2_INTERFACE_DEFINED__ -#define __IChat2_INTERFACE_DEFINED__ - -/* interface IChat2 */ -/* [object][unique][helpstring][uuid] */ - -typedef unsigned long GID; - - -enum GTYPE_ - { SERVER = 0, - CHANNEL = 1, - CLIENT = 2 - }; -typedef enum GTYPE_ GTYPE; - - -enum CHAN_CTYPE_ - { ALLEXIT = 0, - CREATOREXIT = 1, - CLOSEC = 2 - }; -typedef enum CHAN_CTYPE_ CHAN_CTYPE; - - -EXTERN_C const IID IID_IChat2; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8B938190-EF3F-11D1-9808-00609706FA0C") - IChat2 : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE PumpMessages( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestConnection( - Server __RPC_FAR *server, - int timeout) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestMessage( - GID who, - LPCSTR message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetTypeFromGID( - GID id, - GTYPE __RPC_FAR *type) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestChannelList( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestChannelJoin( - LPCSTR name) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestChannelLeave( - Channel __RPC_FAR *chan) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestUserList( - Channel __RPC_FAR *chan) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestLogout( void) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestChannelCreate( - Channel __RPC_FAR *chan) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RequestRawCmd( - LPCSTR cmd) = 0; - - }; - -#else /* C style interface */ - - typedef struct IChat2Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IChat2 __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IChat2 __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IChat2 __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PumpMessages )( - IChat2 __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestConnection )( - IChat2 __RPC_FAR * This, - Server __RPC_FAR *server, - int timeout); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestMessage )( - IChat2 __RPC_FAR * This, - GID who, - LPCSTR message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeFromGID )( - IChat2 __RPC_FAR * This, - GID id, - GTYPE __RPC_FAR *type); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestChannelList )( - IChat2 __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestChannelJoin )( - IChat2 __RPC_FAR * This, - LPCSTR name); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestChannelLeave )( - IChat2 __RPC_FAR * This, - Channel __RPC_FAR *chan); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestUserList )( - IChat2 __RPC_FAR * This, - Channel __RPC_FAR *chan); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestLogout )( - IChat2 __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestChannelCreate )( - IChat2 __RPC_FAR * This, - Channel __RPC_FAR *chan); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RequestRawCmd )( - IChat2 __RPC_FAR * This, - LPCSTR cmd); - - END_INTERFACE - } IChat2Vtbl; - - interface IChat2 - { - CONST_VTBL struct IChat2Vtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IChat2_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IChat2_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IChat2_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IChat2_PumpMessages(This) \ - (This)->lpVtbl -> PumpMessages(This) - -#define IChat2_RequestConnection(This,server,timeout) \ - (This)->lpVtbl -> RequestConnection(This,server,timeout) - -#define IChat2_RequestMessage(This,who,message) \ - (This)->lpVtbl -> RequestMessage(This,who,message) - -#define IChat2_GetTypeFromGID(This,id,type) \ - (This)->lpVtbl -> GetTypeFromGID(This,id,type) - -#define IChat2_RequestChannelList(This) \ - (This)->lpVtbl -> RequestChannelList(This) - -#define IChat2_RequestChannelJoin(This,name) \ - (This)->lpVtbl -> RequestChannelJoin(This,name) - -#define IChat2_RequestChannelLeave(This,chan) \ - (This)->lpVtbl -> RequestChannelLeave(This,chan) - -#define IChat2_RequestUserList(This,chan) \ - (This)->lpVtbl -> RequestUserList(This,chan) - -#define IChat2_RequestLogout(This) \ - (This)->lpVtbl -> RequestLogout(This) - -#define IChat2_RequestChannelCreate(This,chan) \ - (This)->lpVtbl -> RequestChannelCreate(This,chan) - -#define IChat2_RequestRawCmd(This,cmd) \ - (This)->lpVtbl -> RequestRawCmd(This,cmd) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_PumpMessages_Proxy( - IChat2 __RPC_FAR * This); - - -void __RPC_STUB IChat2_PumpMessages_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_RequestConnection_Proxy( - IChat2 __RPC_FAR * This, - Server __RPC_FAR *server, - int timeout); - - -void __RPC_STUB IChat2_RequestConnection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_RequestMessage_Proxy( - IChat2 __RPC_FAR * This, - GID who, - LPCSTR message); - - -void __RPC_STUB IChat2_RequestMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_GetTypeFromGID_Proxy( - IChat2 __RPC_FAR * This, - GID id, - GTYPE __RPC_FAR *type); - - -void __RPC_STUB IChat2_GetTypeFromGID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_RequestChannelList_Proxy( - IChat2 __RPC_FAR * This); - - -void __RPC_STUB IChat2_RequestChannelList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_RequestChannelJoin_Proxy( - IChat2 __RPC_FAR * This, - LPCSTR name); - - -void __RPC_STUB IChat2_RequestChannelJoin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_RequestChannelLeave_Proxy( - IChat2 __RPC_FAR * This, - Channel __RPC_FAR *chan); - - -void __RPC_STUB IChat2_RequestChannelLeave_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_RequestUserList_Proxy( - IChat2 __RPC_FAR * This, - Channel __RPC_FAR *chan); - - -void __RPC_STUB IChat2_RequestUserList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_RequestLogout_Proxy( - IChat2 __RPC_FAR * This); - - -void __RPC_STUB IChat2_RequestLogout_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_RequestChannelCreate_Proxy( - IChat2 __RPC_FAR * This, - Channel __RPC_FAR *chan); - - -void __RPC_STUB IChat2_RequestChannelCreate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2_RequestRawCmd_Proxy( - IChat2 __RPC_FAR * This, - LPCSTR cmd); - - -void __RPC_STUB IChat2_RequestRawCmd_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IChat2_INTERFACE_DEFINED__ */ - - -#ifndef __IChat2Event_INTERFACE_DEFINED__ -#define __IChat2Event_INTERFACE_DEFINED__ - -/* interface IChat2Event */ -/* [object][unique][helpstring][uuid] */ - - -EXTERN_C const IID IID_IChat2Event; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("8B938192-EF3F-11D1-9808-00609706FA0C") - IChat2Event : public IUnknown - { - public: - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnNetStatus( - HRESULT res) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnMessage( - HRESULT res, - User __RPC_FAR *user, - LPCSTR message) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelList( - HRESULT res, - Channel __RPC_FAR *list) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelJoin( - HRESULT res, - Channel __RPC_FAR *chan, - User __RPC_FAR *user) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnLogin( - HRESULT res) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnUserList( - HRESULT res, - Channel __RPC_FAR *chan, - User __RPC_FAR *users) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelLeave( - HRESULT res, - Channel __RPC_FAR *chan, - User __RPC_FAR *user) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnChannelCreate( - HRESULT res, - Channel __RPC_FAR *chan) = 0; - - virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnUnknownLine( - HRESULT res, - LPCSTR line) = 0; - - }; - -#else /* C style interface */ - - typedef struct IChat2EventVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IChat2Event __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IChat2Event __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IChat2Event __RPC_FAR * This); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnNetStatus )( - IChat2Event __RPC_FAR * This, - HRESULT res); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnMessage )( - IChat2Event __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *user, - LPCSTR message); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelList )( - IChat2Event __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *list); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelJoin )( - IChat2Event __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *chan, - User __RPC_FAR *user); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnLogin )( - IChat2Event __RPC_FAR * This, - HRESULT res); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnUserList )( - IChat2Event __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *chan, - User __RPC_FAR *users); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelLeave )( - IChat2Event __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *chan, - User __RPC_FAR *user); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnChannelCreate )( - IChat2Event __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *chan); - - /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OnUnknownLine )( - IChat2Event __RPC_FAR * This, - HRESULT res, - LPCSTR line); - - END_INTERFACE - } IChat2EventVtbl; - - interface IChat2Event - { - CONST_VTBL struct IChat2EventVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IChat2Event_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IChat2Event_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IChat2Event_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IChat2Event_OnNetStatus(This,res) \ - (This)->lpVtbl -> OnNetStatus(This,res) - -#define IChat2Event_OnMessage(This,res,user,message) \ - (This)->lpVtbl -> OnMessage(This,res,user,message) - -#define IChat2Event_OnChannelList(This,res,list) \ - (This)->lpVtbl -> OnChannelList(This,res,list) - -#define IChat2Event_OnChannelJoin(This,res,chan,user) \ - (This)->lpVtbl -> OnChannelJoin(This,res,chan,user) - -#define IChat2Event_OnLogin(This,res) \ - (This)->lpVtbl -> OnLogin(This,res) - -#define IChat2Event_OnUserList(This,res,chan,users) \ - (This)->lpVtbl -> OnUserList(This,res,chan,users) - -#define IChat2Event_OnChannelLeave(This,res,chan,user) \ - (This)->lpVtbl -> OnChannelLeave(This,res,chan,user) - -#define IChat2Event_OnChannelCreate(This,res,chan) \ - (This)->lpVtbl -> OnChannelCreate(This,res,chan) - -#define IChat2Event_OnUnknownLine(This,res,line) \ - (This)->lpVtbl -> OnUnknownLine(This,res,line) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2Event_OnNetStatus_Proxy( - IChat2Event __RPC_FAR * This, - HRESULT res); - - -void __RPC_STUB IChat2Event_OnNetStatus_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2Event_OnMessage_Proxy( - IChat2Event __RPC_FAR * This, - HRESULT res, - User __RPC_FAR *user, - LPCSTR message); - - -void __RPC_STUB IChat2Event_OnMessage_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2Event_OnChannelList_Proxy( - IChat2Event __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *list); - - -void __RPC_STUB IChat2Event_OnChannelList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2Event_OnChannelJoin_Proxy( - IChat2Event __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *chan, - User __RPC_FAR *user); - - -void __RPC_STUB IChat2Event_OnChannelJoin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2Event_OnLogin_Proxy( - IChat2Event __RPC_FAR * This, - HRESULT res); - - -void __RPC_STUB IChat2Event_OnLogin_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2Event_OnUserList_Proxy( - IChat2Event __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *chan, - User __RPC_FAR *users); - - -void __RPC_STUB IChat2Event_OnUserList_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2Event_OnChannelLeave_Proxy( - IChat2Event __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *chan, - User __RPC_FAR *user); - - -void __RPC_STUB IChat2Event_OnChannelLeave_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2Event_OnChannelCreate_Proxy( - IChat2Event __RPC_FAR * This, - HRESULT res, - Channel __RPC_FAR *chan); - - -void __RPC_STUB IChat2Event_OnChannelCreate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring] */ HRESULT STDMETHODCALLTYPE IChat2Event_OnUnknownLine_Proxy( - IChat2Event __RPC_FAR * This, - HRESULT res, - LPCSTR line); - - -void __RPC_STUB IChat2Event_OnUnknownLine_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IChat2Event_INTERFACE_DEFINED__ */ - - -#ifndef __IIGROptions_INTERFACE_DEFINED__ -#define __IIGROptions_INTERFACE_DEFINED__ - -/* interface IIGROptions */ -/* [unique][helpstring][dual][uuid][object] */ - - -EXTERN_C const IID IID_IIGROptions; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("89DD1ECD-0DCA-49d8-8EF3-3375E6D6EE9D") - IIGROptions : public IUnknown - { - public: - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Init( void) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Is_Auto_Login_Allowed( void) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Is_Storing_Nicks_Allowed( void) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Is_Running_Reg_App_Allowed( void) = 0; - - virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Set_Options( - unsigned int options) = 0; - - }; - -#else /* C style interface */ - - typedef struct IIGROptionsVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( - IIGROptions __RPC_FAR * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( - IIGROptions __RPC_FAR * This); - - ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( - IIGROptions __RPC_FAR * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Init )( - IIGROptions __RPC_FAR * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Is_Auto_Login_Allowed )( - IIGROptions __RPC_FAR * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Is_Storing_Nicks_Allowed )( - IIGROptions __RPC_FAR * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Is_Running_Reg_App_Allowed )( - IIGROptions __RPC_FAR * This); - - /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Set_Options )( - IIGROptions __RPC_FAR * This, - unsigned int options); - - END_INTERFACE - } IIGROptionsVtbl; - - interface IIGROptions - { - CONST_VTBL struct IIGROptionsVtbl __RPC_FAR *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IIGROptions_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IIGROptions_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IIGROptions_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IIGROptions_Init(This) \ - (This)->lpVtbl -> Init(This) - -#define IIGROptions_Is_Auto_Login_Allowed(This) \ - (This)->lpVtbl -> Is_Auto_Login_Allowed(This) - -#define IIGROptions_Is_Storing_Nicks_Allowed(This) \ - (This)->lpVtbl -> Is_Storing_Nicks_Allowed(This) - -#define IIGROptions_Is_Running_Reg_App_Allowed(This) \ - (This)->lpVtbl -> Is_Running_Reg_App_Allowed(This) - -#define IIGROptions_Set_Options(This,options) \ - (This)->lpVtbl -> Set_Options(This,options) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IIGROptions_Init_Proxy( - IIGROptions __RPC_FAR * This); - - -void __RPC_STUB IIGROptions_Init_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IIGROptions_Is_Auto_Login_Allowed_Proxy( - IIGROptions __RPC_FAR * This); - - -void __RPC_STUB IIGROptions_Is_Auto_Login_Allowed_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IIGROptions_Is_Storing_Nicks_Allowed_Proxy( - IIGROptions __RPC_FAR * This); - - -void __RPC_STUB IIGROptions_Is_Storing_Nicks_Allowed_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IIGROptions_Is_Running_Reg_App_Allowed_Proxy( - IIGROptions __RPC_FAR * This); - - -void __RPC_STUB IIGROptions_Is_Running_Reg_App_Allowed_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IIGROptions_Set_Options_Proxy( - IIGROptions __RPC_FAR * This, - unsigned int options); - - -void __RPC_STUB IIGROptions_Set_Options_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IIGROptions_INTERFACE_DEFINED__ */ - - - -#ifndef __WOLAPILib_LIBRARY_DEFINED__ -#define __WOLAPILib_LIBRARY_DEFINED__ - -/* library WOLAPILib */ -/* [helpstring][version][uuid] */ - - -EXTERN_C const IID LIBID_WOLAPILib; - -EXTERN_C const CLSID CLSID_RTPatcher; - -#ifdef __cplusplus - -class DECLSPEC_UUID("925CDEDF-71B9-11D1-B1C5-006097176556") -RTPatcher; -#endif - -EXTERN_C const CLSID CLSID_Chat; - -#ifdef __cplusplus - -class DECLSPEC_UUID("4DD3BAF5-7579-11D1-B1C6-006097176556") -Chat; -#endif - -EXTERN_C const CLSID CLSID_Download; - -#ifdef __cplusplus - -class DECLSPEC_UUID("BF6EA206-9E55-11D1-9DC6-006097C54321") -Download; -#endif - -EXTERN_C const CLSID CLSID_IGROptions; - -#ifdef __cplusplus - -class DECLSPEC_UUID("ABF6FC8F-1344-46de-84C9-8371118DC3FF") -IGROptions; -#endif - -EXTERN_C const CLSID CLSID_NetUtil; - -#ifdef __cplusplus - -class DECLSPEC_UUID("B832B0AB-A7D3-11D1-97C3-00609706FA0C") -NetUtil; -#endif - -EXTERN_C const CLSID CLSID_Chat2; - -#ifdef __cplusplus - -class DECLSPEC_UUID("8B938191-EF3F-11D1-9808-00609706FA0C") -Chat2; -#endif -#endif /* __WOLAPILib_LIBRARY_DEFINED__ */ - -/* Additional Prototypes for ALL interfaces */ - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/Generals/Code/Tools/wolSetup/WOLAPI/wolapi_i.c b/Generals/Code/Tools/wolSetup/WOLAPI/wolapi_i.c deleted file mode 100644 index 691b31aca2f..00000000000 --- a/Generals/Code/Tools/wolSetup/WOLAPI/wolapi_i.c +++ /dev/null @@ -1,113 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -/* this file contains the actual definitions of */ -/* the IIDs and CLSIDs */ - -/* link this file in with the server and any clients */ - - -/* File created by MIDL compiler version 5.01.0164 */ -/* at Mon Nov 05 10:28:33 2001 - */ -/* Compiler settings for .\WOLAPI.idl: - Oicf (OptLev=i2), W1, Zp8, env=Win32, ms_ext, c_ext - error checks: allocation ref bounds_check enum stub_data -*/ -//@@MIDL_FILE_HEADING( ) -#ifdef __cplusplus -extern "C"{ -#endif - - -#ifndef __IID_DEFINED__ -#define __IID_DEFINED__ - -typedef struct _IID -{ - unsigned long x; - unsigned short s1; - unsigned short s2; - unsigned char c[8]; -} IID; - -#endif // __IID_DEFINED__ - -#ifndef CLSID_DEFINED -#define CLSID_DEFINED -typedef IID CLSID; -#endif // CLSID_DEFINED - -const IID IID_IRTPatcher = {0x925CDEDE,0x71B9,0x11D1,{0xB1,0xC5,0x00,0x60,0x97,0x17,0x65,0x56}}; - - -const IID IID_IRTPatcherEvent = {0x925CDEE3,0x71B9,0x11D1,{0xB1,0xC5,0x00,0x60,0x97,0x17,0x65,0x56}}; - - -const IID IID_IChat = {0x4DD3BAF4,0x7579,0x11D1,{0xB1,0xC6,0x00,0x60,0x97,0x17,0x65,0x56}}; - - -const IID IID_IChatEvent = {0x4DD3BAF6,0x7579,0x11D1,{0xB1,0xC6,0x00,0x60,0x97,0x17,0x65,0x56}}; - - -const IID IID_IDownload = {0x0BF5FCEB,0x9F03,0x11D1,{0x9D,0xC7,0x00,0x60,0x97,0xC5,0x43,0x21}}; - - -const IID IID_IDownloadEvent = {0x6869E99D,0x9FB4,0x11D1,{0x9D,0xC8,0x00,0x60,0x97,0xC5,0x43,0x21}}; - - -const IID IID_INetUtil = {0xB832B0AA,0xA7D3,0x11D1,{0x97,0xC3,0x00,0x60,0x97,0x06,0xFA,0x0C}}; - - -const IID IID_INetUtilEvent = {0xB832B0AC,0xA7D3,0x11D1,{0x97,0xC3,0x00,0x60,0x97,0x06,0xFA,0x0C}}; - - -const IID IID_IChat2 = {0x8B938190,0xEF3F,0x11D1,{0x98,0x08,0x00,0x60,0x97,0x06,0xFA,0x0C}}; - - -const IID IID_IChat2Event = {0x8B938192,0xEF3F,0x11D1,{0x98,0x08,0x00,0x60,0x97,0x06,0xFA,0x0C}}; - - -const IID IID_IIGROptions = {0x89DD1ECD,0x0DCA,0x49d8,{0x8E,0xF3,0x33,0x75,0xE6,0xD6,0xEE,0x9D}}; - - -const IID LIBID_WOLAPILib = {0x925CDED1,0x71B9,0x11D1,{0xB1,0xC5,0x00,0x60,0x97,0x17,0x65,0x56}}; - - -const CLSID CLSID_RTPatcher = {0x925CDEDF,0x71B9,0x11D1,{0xB1,0xC5,0x00,0x60,0x97,0x17,0x65,0x56}}; - - -const CLSID CLSID_Chat = {0x4DD3BAF5,0x7579,0x11D1,{0xB1,0xC6,0x00,0x60,0x97,0x17,0x65,0x56}}; - - -const CLSID CLSID_Download = {0xBF6EA206,0x9E55,0x11D1,{0x9D,0xC6,0x00,0x60,0x97,0xC5,0x43,0x21}}; - - -const CLSID CLSID_IGROptions = {0xABF6FC8F,0x1344,0x46de,{0x84,0xC9,0x83,0x71,0x11,0x8D,0xC3,0xFF}}; - - -const CLSID CLSID_NetUtil = {0xB832B0AB,0xA7D3,0x11D1,{0x97,0xC3,0x00,0x60,0x97,0x06,0xFA,0x0C}}; - - -const CLSID CLSID_Chat2 = {0x8B938191,0xEF3F,0x11D1,{0x98,0x08,0x00,0x60,0x97,0x06,0xFA,0x0C}}; - - -#ifdef __cplusplus -} -#endif - diff --git a/Generals/Code/Tools/wolSetup/resource.h b/Generals/Code/Tools/wolSetup/resource.h deleted file mode 100644 index e805651207a..00000000000 --- a/Generals/Code/Tools/wolSetup/resource.h +++ /dev/null @@ -1,33 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by wolSetup.rc -// -#define IDC_MYICON 2 -#define IDI_ICON1 101 -#define IDI_ICON2 102 -#define IDS_APP_TITLE 103 -#define IDD_MAINBOX 103 -#define IDD_GENERALSSETUPBOX 104 -#define IDS_HELLO 106 -#define IDC_WOLSETUP 109 -#define IDC_DEBUG_WOLAPI 1000 -#define IDC_RELEASE_WOLAPI 1001 -#define IDC_UNINSTALL_WOLAPI 1002 -#define IDC_SETUP_GENERALS 1003 -#define IDC_UNINSTALL_GENERALS 1004 -#define IDC_TEXT_WOLDIR 1006 -#define IDC_TEXT_GENERALSDIR 1007 -#define IDC_TEXT_WOLVER 1008 -#define IDC_EDIT_PATH 1009 -#define IDC_EDIT_SERIAL 1011 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 103 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1010 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/Generals/Code/Tools/wolSetup/verchk.cpp b/Generals/Code/Tools/wolSetup/verchk.cpp deleted file mode 100644 index fe428a34120..00000000000 --- a/Generals/Code/Tools/wolSetup/verchk.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#include "verchk.h" -#include "wolSetup.h" -#include -#include -#include - -/** - * Retrieve version information from files version resource. - * - * INPUTS - * Filename - Name of file to retrieve version information for. - * FileInfo - Pointer to VS_FIXEDFILEINFO structure to be filled in. - * - * RESULT - * Success - True if successful in obtaining version information. - */ -bool GetVersionInfo(char* filename, VS_FIXEDFILEINFO* fileInfo) -{ - if (filename == NULL || fileInfo == NULL) - { - return false; - } - - // Get version information from the application - DWORD verHandle; - DWORD verInfoSize = GetFileVersionInfoSize(filename, &verHandle); - - if (verInfoSize) - { - // If we were able to get the information, process it: - HANDLE memHandle = GlobalAlloc(GMEM_MOVEABLE, verInfoSize); - - if (memHandle) - { - LPVOID buffer = GlobalLock(memHandle); - - if (buffer) - { - BOOL success = GetFileVersionInfo(filename, verHandle, verInfoSize, buffer); - - if (success) - { - VS_FIXEDFILEINFO* data; - UINT dataSize = 0; - success = VerQueryValue(buffer, "\\", (LPVOID*) & data, &dataSize); - - if (success && (dataSize == sizeof(VS_FIXEDFILEINFO))) - { - memcpy(fileInfo, data, sizeof(VS_FIXEDFILEINFO)); - return true; - } - } - - GlobalUnlock(memHandle); - } - - GlobalFree(memHandle); - } - } - - return false; -} - -bool loadWolapi( char *filename ) -{ - VS_FIXEDFILEINFO fileInfo; - if (GetVersionInfo(filename, &fileInfo)) - g_wolapiInstalled = false; - - return g_wolapiInstalled; -} diff --git a/Generals/Code/Tools/wolSetup/verchk.h b/Generals/Code/Tools/wolSetup/verchk.h deleted file mode 100644 index fe7e6d68d6d..00000000000 --- a/Generals/Code/Tools/wolSetup/verchk.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -#ifndef __VERCHK_H__ -#define __VERCHK_H__ - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include - -// Obtain version information from the specified file. -bool GetVersionInfo(char* filename, VS_FIXEDFILEINFO* fileInfo); -bool loadWolapi( char *filename ); - -#endif // __VERCHK_H__ - diff --git a/Generals/Code/Tools/wolSetup/wolInit.cpp b/Generals/Code/Tools/wolSetup/wolInit.cpp deleted file mode 100644 index fa0b8acf69b..00000000000 --- a/Generals/Code/Tools/wolSetup/wolInit.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -// FILE: WOLinit.cpp ////////////////////////////////////////////////////// -// Westwood Online DLL/COM/ initialization/teardown -// Author: Matthew D. Campbell, December 2001 - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#include - -#include -extern CComModule _Module; // Required for COM - must be between atlbase.h and atlcom.h. Funky, no? -#include - -#include -#include - -#include "wolSetup.h" -#include "WOLAPI/wolapi.h" - -unsigned long g_wolapiRegistryVersion = 0; -unsigned long g_wolapiRealVersion = 0; -bool g_wolapiInstalled = false; -char g_wolapiRegFilename[MAX_PATH]; -char g_wolapiRealFilename[MAX_PATH]; -char g_generalsFilename[MAX_PATH]; -char g_generalsSerial[1024]; - -#define GENERALS_REG_KEY_TOP "HKEY_LOCAL_MACHINE" ///< Registry base -#define GENERALS_REG_KEY_PATH "SOFTWARE\\Westwood\\Generals" ///< Generals registry key -#define GENERALS_REG_KEY_BOTTOM GENERALS_REG_KEY_PATH "\\" ///< Generals registry key with trailing backslashes -#define GENERALS_REG_KEY_VERSION "Version" ///< Version registry key -#define GENERALS_REG_KEY_SKU "SKU" ///< SKU registry key -#define GENERALS_REG_KEY_NAME "Name" ///< Product name registry key -#define GENERALS_REG_KEY_INSTALLPATH "InstallPath" ///< Install path registry key -#define GENERALS_REG_KEY_SERIAL "Serial" ///< Serial # registry key -#define GENERALS_REG_KEY GENERALS_REG_KEY_TOP "\\" GENERALS_REG_KEY_BOTTOM ///< Full Generals registry path - -#define WOLAPI_REG_KEY_TOP "HKEY_LOCAL_MACHINE" ///< Registry base -#define WOLAPI_REG_KEY_PATH "SOFTWARE\\Westwood\\WOLAPI" ///< WOLAPI registry key -#define WOLAPI_REG_KEY_BOTTOM WOLAPI_REG_KEY_PATH "\\" ///< WOLAPI registry key with trailing backslashes -#define WOLAPI_REG_KEY_VERSION "Version" ///< Version registry key -#define WOLAPI_REG_KEY_INSTALLPATH "InstallPath" ///< Install path registry key -#define WOLAPI_REG_KEY WOLAPI_REG_KEY_TOP "\\" WOLAPI_REG_KEY_BOTTOM ///< Full WOLAPI registry path - -#define DLL_REG_KEY_TOP "HKEY_CLASSES_ROOT" ///< Registry base -#define DLL_REG_KEY_PATH "CLSID\\{18FD6763-F5EA-4fa5-B2A9-668554152FAE}\\InprocServer32" ///< WOLAPI registry key -#define DLL_REG_KEY_BOTTOM DLL_REG_KEY_PATH "\\" ///< WOLAPI registry key with trailing backslashes -#define DLL_REG_KEY_LOCATION "" ///< Version registry key - -void getPathsFromRegistry( void ) -{ - HKEY handle; - unsigned long type; - unsigned long size; - int returnValue; - - size = sizeof(g_generalsFilename); - strcpy(g_generalsFilename, "No install path in registry"); - - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, GENERALS_REG_KEY_PATH, 0, KEY_ALL_ACCESS, &handle ) == ERROR_SUCCESS) { - - returnValue = RegQueryValueEx(handle, GENERALS_REG_KEY_INSTALLPATH, NULL, &type, (unsigned char *) &g_generalsFilename, &size); - - if (returnValue != ERROR_SUCCESS) - { - strcpy(g_generalsFilename, "No install path in registry"); - } - - RegCloseKey( handle ); - } - - size = sizeof(g_generalsSerial); - strcpy(g_generalsSerial, "0"); - - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, GENERALS_REG_KEY_PATH, 0, KEY_ALL_ACCESS, &handle ) == ERROR_SUCCESS) { - - returnValue = RegQueryValueEx(handle, GENERALS_REG_KEY_SERIAL, NULL, &type, (unsigned char *) &g_generalsSerial, &size); - - if (returnValue != ERROR_SUCCESS) - { - strcpy(g_generalsSerial, "0"); - } - - RegCloseKey( handle ); - } - - size = sizeof(g_wolapiRegFilename); - strcpy(g_wolapiRegFilename, "No install path in registry"); - g_wolapiInstalled = true; - - if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, WOLAPI_REG_KEY_PATH, 0, KEY_ALL_ACCESS, &handle ) == ERROR_SUCCESS) { - - returnValue = RegQueryValueEx(handle, WOLAPI_REG_KEY_INSTALLPATH, NULL, &type, (unsigned char *) &g_wolapiRegFilename, &size); - - if (returnValue != ERROR_SUCCESS) - { - strcpy(g_wolapiRegFilename, "No install path in registry"); - g_wolapiInstalled = false; - } - - RegCloseKey( handle ); - } - - size = sizeof(g_wolapiRealFilename); - strcpy(g_wolapiRealFilename, "No wolapi.dll installed"); - - if (RegOpenKeyEx( HKEY_CLASSES_ROOT, DLL_REG_KEY_PATH, 0, KEY_ALL_ACCESS, &handle ) == ERROR_SUCCESS) { - - returnValue = RegQueryValueEx(handle, DLL_REG_KEY_LOCATION, NULL, &type, (unsigned char *) &g_wolapiRealFilename, &size); - - if (returnValue != ERROR_SUCCESS) - { - strcpy(g_wolapiRealFilename, "No wolapi.dll installed"); - g_wolapiInstalled = false; - } - - RegCloseKey( handle ); - } -} - -void setupGenerals( const char *genPath, const char *genSerial ) -{ - HKEY handle; - unsigned long type; - unsigned long returnValue; - int size; - char lpClass[] = "REG_NONE"; - - if (RegCreateKeyEx( HKEY_LOCAL_MACHINE, GENERALS_REG_KEY_PATH, 0, lpClass, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &handle, NULL ) == ERROR_SUCCESS) { - - type = REG_SZ; - size = strlen(genPath)+1; - returnValue = RegSetValueEx(handle, GENERALS_REG_KEY_INSTALLPATH, 0, type, (unsigned char *) genPath, size); - - size = strlen(genSerial)+1; - returnValue = RegSetValueEx(handle, GENERALS_REG_KEY_SERIAL, 0, type, (unsigned char *) genSerial, size); - - size = strlen("Generals")+1; - returnValue = RegSetValueEx(handle, GENERALS_REG_KEY_NAME, 0, type, (unsigned char *) "Generals", size); - - type = REG_DWORD; - size = sizeof(DWORD); - unsigned long value = 65536; - returnValue = RegSetValueEx(handle, GENERALS_REG_KEY_VERSION, 0, type, (unsigned char *) &value, size); - value = 12544; - returnValue = RegSetValueEx(handle, GENERALS_REG_KEY_SKU, 0, type, (unsigned char *) &value, size); - - RegCloseKey( handle ); - } - -} - - -/** - * OLEInitializer class - Init and shutdown OLE & COM as a global - * object. Scary, nasty stuff, COM. /me shivers. - */ -class OLEInitializer -{ - public: - OLEInitializer() { OleInitialize(NULL); } - ~OLEInitializer() { OleUninitialize(); } -}; -OLEInitializer g_OLEInitializer; -CComModule _Module; - -IChat *g_pChat = NULL; - -/** - * checkInstalledWolapiVersion inits WOLAPI if possible and gets its version - * number. It also saves off its install path from the registry. - */ -void checkInstalledWolapiVersion( void ) -{ - // Initialize this instance - _Module.Init(NULL, g_hInst); - - // Create the WOLAPI instance - CoCreateInstance(CLSID_Chat, NULL, CLSCTX_INPROC_SERVER, \ - IID_IChat, (void**)&g_pChat); - - if (g_pChat) - { - // Grab versions - g_pChat->GetVersion(&g_wolapiRealVersion); - - // Release everything - g_pChat->Release(); - - g_wolapiInstalled = true; - } - - _Module.Term(); - - // Grab path info from registry - getPathsFromRegistry(); - - return; -} - diff --git a/Generals/Code/Tools/wolSetup/wolSetup.cpp b/Generals/Code/Tools/wolSetup/wolSetup.cpp deleted file mode 100644 index 644d39cfc4e..00000000000 --- a/Generals/Code/Tools/wolSetup/wolSetup.cpp +++ /dev/null @@ -1,211 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -// FILE: wolSetup.cpp ////////////////////////////////////////////////////// -// Defines the entry point for the application. -// Author: Matthew D. Campbell, December 2001 - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#include -#include - -#include "resource.h" -#include "wolSetup.h" -#include "verchk.h" - -void registerDLL(const char *dllName) -{ - HINSTANCE hLib = LoadLibrary(dllName); - FARPROC lpDllEntryPoint; - - if (hLib < (HINSTANCE)HINSTANCE_ERROR) - { - return; - } - - // Find the entry point. - (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, - "DllRegisterServer"); - if (lpDllEntryPoint != NULL) - (*lpDllEntryPoint)(); - else - ;//unable to locate entry point -} - - - -HINSTANCE g_hInst = NULL; - -LRESULT CALLBACK MainDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); - -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - g_hInst = hInstance; - - checkInstalledWolapiVersion(); - - DialogBox(g_hInst, (LPCTSTR)IDD_MAINBOX, NULL, (DLGPROC)MainDialogProc); - - return 0; -} - - -// Mesage handler for generals setup box. -LRESULT CALLBACK GeneralsSetupDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_INITDIALOG: - { - SetDlgItemText(hDlg, IDC_EDIT_PATH, g_generalsFilename); - SetDlgItemText(hDlg, IDC_EDIT_SERIAL, g_generalsSerial); - return TRUE; - } - - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case IDOK: - { - char genPath[_MAX_PATH], genSerial[1024]; - GetDlgItemText(hDlg, IDC_EDIT_PATH, genPath, _MAX_PATH); - GetDlgItemText(hDlg, IDC_EDIT_SERIAL, genSerial, 1024); - setupGenerals( genPath, genSerial ); - EndDialog(hDlg, LOWORD(wParam)); - return TRUE; - } - - case IDCANCEL: - { - EndDialog(hDlg, LOWORD(wParam)); - return TRUE; - } - } - break; - } - return FALSE; -} - -void updateDisplay(HWND hDlg) -{ - checkInstalledWolapiVersion(); - if (g_wolapiInstalled) - { - char buf[200]; - sprintf(buf, "%d.%d (%s)", MAJOR(g_wolapiRealVersion), MINOR(g_wolapiRealVersion), g_wolapiRealFilename); - SetDlgItemText(hDlg, IDC_TEXT_WOLVER, buf); - } - else - { - SetDlgItemText(hDlg, IDC_TEXT_WOLVER, "Not installed"); - } - SetDlgItemText(hDlg, IDC_TEXT_WOLDIR, g_wolapiRegFilename); - SetDlgItemText(hDlg, IDC_TEXT_GENERALSDIR, g_generalsFilename); -} - -// Mesage handler for main dialog box. -LRESULT CALLBACK MainDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_INITDIALOG: - { - updateDisplay(hDlg); - return TRUE; - } - - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case IDOK: - case IDCANCEL: - { - EndDialog(hDlg, LOWORD(wParam)); - return TRUE; - } - case IDC_SETUP_GENERALS: - { - DialogBox(g_hInst, (LPCTSTR)IDD_GENERALSSETUPBOX, hDlg, (DLGPROC)GeneralsSetupDialogProc); - updateDisplay(hDlg); - break; - } - case IDC_UNINSTALL_GENERALS: - { - if (MessageBox(hDlg, "Are you sure you want to delete Generals registry entries?", "Warning!", MB_OKCANCEL) == IDOK) - { - MessageBox(hDlg, "Oops! Can't do that yet!", "Unimplemented", MB_OK); - updateDisplay(hDlg); - } - break; - } - case IDC_DEBUG_WOLAPI: - { - if (g_wolapiInstalled) - { - if (MessageBox(hDlg, "Are you sure you want to overwrite installed WOLAPI?", "Warning!", MB_OKCANCEL) == IDOK) - { - registerDLL("woldbg.dll"); - updateDisplay(hDlg); - } - } - else - { - DialogBox(g_hInst, (LPCTSTR)IDD_GENERALSSETUPBOX, hDlg, (DLGPROC)MainDialogProc); - } - break; - } - case IDC_RELEASE_WOLAPI: - { - if (g_wolapiInstalled) - { - if (MessageBox(hDlg, "Are you sure you want to overwrite installed WOLAPI?", "Warning!", MB_OKCANCEL) == IDOK) - { - registerDLL("wolapi.dll"); - updateDisplay(hDlg); - } - } - else - { - DialogBox(g_hInst, (LPCTSTR)IDD_GENERALSSETUPBOX, hDlg, (DLGPROC)MainDialogProc); - updateDisplay(hDlg); - } - break; - } - case IDC_UNINSTALL_WOLAPI: - { - if (g_wolapiInstalled) - { - MessageBox(hDlg, "Oops! Can't do that yet!", "Unimplemented", MB_OK); - updateDisplay(hDlg); - } - break; - } - } - break; - } - return FALSE; -} - - - diff --git a/Generals/Code/Tools/wolSetup/wolSetup.h b/Generals/Code/Tools/wolSetup/wolSetup.h deleted file mode 100644 index e66901bc5e8..00000000000 --- a/Generals/Code/Tools/wolSetup/wolSetup.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -** Command & Conquer Generals(tm) -** Copyright 2025 Electronic Arts Inc. -** -** This program is free software: you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program. If not, see . -*/ - -// FILE: wolSetup.h ////////////////////////////////////////////////////// -// Author: Matthew D. Campbell, December 2001 - -#ifndef __WOLSETUP_H__ -#define __WOLSETUP_H__ - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include - -void checkInstalledWolapiVersion( void ); -void setupGenerals( const char *genPath, const char *genSerial ); - -extern HINSTANCE g_hInst; -extern unsigned long g_wolapiRegistryVersion; -extern unsigned long g_wolapiRealVersion; -extern bool g_wolapiInstalled; -extern char g_wolapiRegFilename[MAX_PATH]; -extern char g_wolapiRealFilename[MAX_PATH]; -extern char g_generalsFilename[MAX_PATH]; -extern char g_generalsSerial[]; - -// TheSuperHackers @todo Check if this should be returning unsigned long. -static int MAJOR(unsigned long x) { return (((x) & 0xffff0000) >> 16); } -static int MINOR(unsigned long x) { return ((x) & 0xffff); } - -#endif // __WOLSETUP_H__ diff --git a/GeneralsMD/Code/Tools/CMakeLists.txt b/GeneralsMD/Code/Tools/CMakeLists.txt index e39ebf89e6f..8f63dc40c00 100644 --- a/GeneralsMD/Code/Tools/CMakeLists.txt +++ b/GeneralsMD/Code/Tools/CMakeLists.txt @@ -14,10 +14,7 @@ endif() # Build less useful tool/test binaries. if(RTS_BUILD_ZEROHOUR_EXTRAS) - add_subdirectory(assetcull) add_subdirectory(Autorun) add_subdirectory(Launcher) - add_subdirectory(mangler) add_subdirectory(PATCHGET) - add_subdirectory(wolSetup) endif() diff --git a/GeneralsMD/Code/Tools/assetcull/CMakeLists.txt b/GeneralsMD/Code/Tools/assetcull/CMakeLists.txt deleted file mode 100644 index 3ee3a49fe96..00000000000 --- a/GeneralsMD/Code/Tools/assetcull/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -set(ASSETCULL_SRC - "assetcull.cpp" -) - -add_executable(z_assetcull WIN32) -set_target_properties(z_assetcull PROPERTIES OUTPUT_NAME assetcull) - -target_sources(z_assetcull PRIVATE ${ASSETCULL_SRC}) - -target_link_libraries(z_assetcull PRIVATE - core_config -) - -if(WIN32 OR "${CMAKE_SYSTEM}" MATCHES "Windows") - target_link_options(z_assetcull PRIVATE /subsystem:console) -endif() diff --git a/GeneralsMD/Code/Tools/mangler/CMakeLists.txt b/GeneralsMD/Code/Tools/mangler/CMakeLists.txt deleted file mode 100644 index ca6811c0793..00000000000 --- a/GeneralsMD/Code/Tools/mangler/CMakeLists.txt +++ /dev/null @@ -1,95 +0,0 @@ -set(MANGLERLIB_SRC - "crc.cpp" - "crc.h" - "endian.h" - "wlib/arraylist.h" - "wlib/configfile.cpp" - "wlib/configfile.h" - "wlib/critsec.cpp" - "wlib/critsec.h" - "wlib/dictionary.h" - "wlib/filed.h" - "wlib/linkedlist.h" - "wlib/mboxd.h" - "wlib/monod.cpp" - "wlib/monod.h" - "wlib/odevice.h" - "wlib/sem4.cpp" - "wlib/sem4.h" - "wlib/stderrd.h" - "wlib/stdoutd.h" - "wlib/streamer.cpp" - "wlib/streamer.h" - "wlib/syslogd.cpp" - "wlib/syslogd.h" - "wlib/threadfac.cpp" - "wlib/threadfac.h" - "wlib/threadsafe.h" - "wlib/timezone.cpp" - "wlib/timezone.h" - "wlib/ustring.h" - "wlib/wdebug.cpp" - "wlib/wdebug.h" - "wlib/wstring.cpp" - "wlib/wstring.h" - "wlib/wstypes.h" - "wlib/wtime.cpp" - "wlib/wtime.h" - "wlib/xtime.cpp" - "wlib/xtime.h" - "wnet/field.cpp" - "wnet/field.h" - "wnet/packet.cpp" - "wnet/packet.h" - "wnet/tcp.cpp" - "wnet/tcp.h" - "wnet/udp.cpp" - "wnet/udp.h" -) - -set(MANGLER_SRC - "mangler.cpp" - "mangler.h" -) - -set(MANGLERTEST_SRC - "manglertest.cpp" -) - -add_library(z_manglerlib STATIC) -set_target_properties(z_manglerlib PROPERTIES OUTPUT_NAME manglerlib) - -target_sources(z_manglerlib PUBLIC ${MANGLERLIB_SRC}) -target_include_directories(z_manglerlib PRIVATE . wlib wnet) -target_link_libraries(z_manglerlib PRIVATE wsock32) -target_link_libraries(z_manglerlib PUBLIC - core_config - core_utility -) - -# mangler app - -add_executable(z_mangler WIN32) -set_target_properties(z_mangler PROPERTIES OUTPUT_NAME mangler) - -target_sources(z_mangler PRIVATE ${MANGLER_SRC}) -target_include_directories(z_mangler PRIVATE . wlib wnet) -target_link_libraries(z_mangler PRIVATE z_manglerlib) - -if(WIN32 OR "${CMAKE_SYSTEM}" MATCHES "Windows") - target_link_options(z_mangler PRIVATE /subsystem:console) -endif() - - -# manglertest app - -add_executable(z_manglertest WIN32) -set_target_properties(z_manglertest PROPERTIES OUTPUT_NAME manglertest) - -target_sources(z_manglertest PRIVATE ${MANGLERTEST_SRC}) -target_include_directories(z_manglertest PRIVATE . wlib wnet) -target_link_libraries(z_manglertest PRIVATE z_manglerlib) - -if(WIN32 OR "${CMAKE_SYSTEM}" MATCHES "Windows") - target_link_options(z_manglertest PRIVATE /subsystem:console) -endif() diff --git a/GeneralsMD/Code/Tools/mangler/Makefile b/GeneralsMD/Code/Tools/mangler/Makefile deleted file mode 100644 index d1176c2b043..00000000000 --- a/GeneralsMD/Code/Tools/mangler/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -all = mangler - -TARGET=mangler -TESTTARGET=manglertest - -OBJECTS=mangler.o crc.o -TESTOBJECTS=manglertest.o crc.o - - -LINKFLAGS= -LINKDIRS=-L. -Lwlib -Lwnet -############################################################################ -### -lpthread ### MUST MUST MUST be the last library! -############################################################################ -LINKLIBS = -lwnet -lwlib -lsocket -lnsl -lposix4 -lpthread - -INCDIR=-I. -Iwlib -Iwnet - -CPPFLAGS=$(INCDIR) -c -gstabs+ -DDEBUG -D_UNIX -#CPPFLAGS=$(INCDIR) -c -gstabs+ -D_UNIX - -CPPFILES=${OBJECTS:.o=.cpp} -CFILES=${OBJECTS:.o=.c} -.SUFFIXES : .c .cpp - - -$(TARGET) : $(OBJECTS) - g++ $(LINKFLAGS) $(OBJECTS) $(LINKDIRS) $(LINKLIBS) -o $(TARGET) - -$(TESTTARGET) : $(TESTOBJECTS) $(TARGET) - g++ $(LINKFLAGS) $(TESTOBJECTS) $(LINKDIRS) $(LINKLIBS) -o $(TESTTARGET) - -.cpp.o: - g++ $(CPPFLAGS) $< - -.c.o: - g++ $(CPPFLAGS) $< - - -depend: - g++ -M $(INCDIR) ${CFILES} $(CPPFILES) > dependencies - - -clean: - -rm *.o $(TARGET) $(TESTTARGET) core *.dat - -rebuild: - make clean; make - -run: - make; $(TARGET) - -debug: - gdb -s noxc noxc - -dist: - make clean; make; cp wdtd gavin; cp START gavin; cp STOP gavin; cp world.wdt gavin; - -#include dependencies diff --git a/GeneralsMD/Code/Tools/mangler/wlib/Makefile b/GeneralsMD/Code/Tools/mangler/wlib/Makefile deleted file mode 100644 index 1163a2ba61d..00000000000 --- a/GeneralsMD/Code/Tools/mangler/wlib/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -########################################################################### -# WLIB library makefile -########################################################################## - -#Define cc to be your C compiler -CC = g++ - -#This tells make how to go from a .cpp to a .o -.SUFFIXES: .cpp -.cpp.o: - ${CC} ${CFLAGS} -c $< - -INCLUDE = -I. -I.. - -CFLAGS = ${INCLUDE} -D_REENTRANT -DDEBUG -D_UNIX - -AR = ar -r -#CC is dumb and won't include templates in a library uness you define -#CC -xar as your replacement for 'ar' -#AR = CC -xar - -RM = rm -f -RANLIB = ranlib - -############################################################################ -#Dont mess with any of this stuff -OBJECTS = wtime.o monod.o wdebug.o sem4.o streamer.o syslogd.o wstring.o \ - configfile.o threadfac.o critsec.o xtime.o timezone.o - -LIBRARY = libwlib.a - -all: $(LIBRARY) - -$(LIBRARY): $(OBJECTS) - ${RM} libwlib.a - ${AR} libwlib.a $(OBJECTS) - #${AR} $(OBJECTS) -o libwlib.a - $(RANLIB) libwlib.a - -clean: - - rm -f $(LIBRARY) *.o core diff --git a/GeneralsMD/Code/Tools/mangler/wnet/Makefile b/GeneralsMD/Code/Tools/mangler/wnet/Makefile deleted file mode 100644 index e5321ff0a3b..00000000000 --- a/GeneralsMD/Code/Tools/mangler/wnet/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -########################################################################### -# TCP library makefile -########################################################################## - -#Define cc to be your C compiler -CC = g++ -CFLAGS = -gstabs ${INCLUDE} -D_REENTRANT #-DDEBUG - -#This tells make how to go from a .cpp to a .o -.SUFFIXES: .cpp -.cpp.o: - ${CC} ${CFLAGS} -c $< - -INCLUDE = -I.. -I. - -AR = ar -r -RM = rm -f -RANLIB = ranlib - -############################################################################ -#Dont mess with any of this stuff -OBJECTS = tcp.o udp.o packet.o field.o -LIBRARY = libwnet.a - -all: $(LIBRARY) - -$(LIBRARY): $(OBJECTS) - $(RM) $(LIBRARY) - $(AR) $(LIBRARY) $(OBJECTS) - $(RANLIB) $(LIBRARY) - -clean: - - rm -f $(LIBRARY) $(OBJECTS) core diff --git a/GeneralsMD/Code/Tools/wolSetup/WOLAPI/wolapi.dll b/GeneralsMD/Code/Tools/wolSetup/WOLAPI/wolapi.dll deleted file mode 100644 index 026a11bf089103ec87b64a69d3b18146dc1c9114..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286782 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⋙!%0Z&=dbTycTu^_WaOiLciLs{W=pjS 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 )JU_B#TYx;!Zw8 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

l=CHD0pyQYA^7aV*eY> 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


+)}KAIbkc=bEND*n1-^?N(yJG3`gbl4!E-p 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

Pj~>FP^VMT`;+bW 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 diff --git a/GeneralsMD/Code/Tools/wolSetup/wolSetup.rc b/GeneralsMD/Code/Tools/wolSetup/wolSetup.rc deleted file mode 100644 index 557d25a9ed5..00000000000 --- a/GeneralsMD/Code/Tools/wolSetup/wolSetup.rc +++ /dev/null @@ -1,158 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_ICON1 ICON DISCARDABLE "wolSetup.ico" -IDI_ICON2 ICON DISCARDABLE "small.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_MAINBOX DIALOG DISCARDABLE 22, 17, 234, 115 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "Generals WOLSetup" -FONT 8, "System" -BEGIN - ICON IDI_ICON1,IDC_MYICON,14,9,20,20 - LTEXT "WOLSetup Version 1.0",IDC_STATIC,49,10,119,8, - SS_NOPREFIX - LTEXT "Copyright (C) 2001 EA Pacific",IDC_STATIC,45,20,119,8 - DEFPUSHBUTTON "Done",IDOK,200,40,30,35,WS_GROUP - PUSHBUTTON "Debug",IDC_DEBUG_WOLAPI,50,90,35,15 - PUSHBUTTON "Release",IDC_RELEASE_WOLAPI,10,90,35,15 - PUSHBUTTON "Uninstall",IDC_UNINSTALL_WOLAPI,90,90,35,15 - GROUPBOX "WOLAPI",IDC_STATIC,5,80,125,30 - GROUPBOX "Generals Registry",IDC_STATIC,135,80,95,30 - PUSHBUTTON "Setup",IDC_SETUP_GENERALS,140,90,40,15 - PUSHBUTTON "Remove",IDC_UNINSTALL_GENERALS,185,90,40,15 - GROUPBOX "Current Setup",IDC_STATIC,5,35,190,40 - GROUPBOX "",IDC_STATIC,5,0,225,35 - LTEXT "WOLAPI dir:",IDC_STATIC,10,45,60,8,SS_NOPREFIX - LTEXT "Generals dir:",IDC_STATIC,10,55,60,8,SS_NOPREFIX - LTEXT "WOLAPI version:",IDC_STATIC,10,65,60,8,SS_NOPREFIX - LTEXT "No registry entry",IDC_TEXT_WOLDIR,70,45,120,8, - SS_NOPREFIX - LTEXT "No registry entry",IDC_TEXT_GENERALSDIR,70,55,120,8, - SS_NOPREFIX - CONTROL "(Uninstalled)",IDC_TEXT_WOLVER,"Static", - SS_LEFTNOWORDWRAP | SS_NOPREFIX | WS_GROUP,70,65,120,8 -END - -IDD_GENERALSSETUPBOX DIALOG DISCARDABLE 22, 17, 194, 70 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "Setup Generals Registry" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "OK",IDOK,155,40,30,20,WS_GROUP - DEFPUSHBUTTON "Cancel",IDCANCEL,5,40,35,20,WS_GROUP - EDITTEXT IDC_EDIT_PATH,50,10,135,10,ES_AUTOHSCROLL - EDITTEXT IDC_EDIT_SERIAL,50,25,135,10,ES_AUTOHSCROLL - LTEXT "Install path:",IDC_STATIC,10,10,40,8 - LTEXT "Serial:",IDC_STATIC,10,25,25,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_MAINBOX, DIALOG - BEGIN - RIGHTMARGIN, 230 - BOTTOMMARGIN, 75 - END - - IDD_GENERALSSETUPBOX, DIALOG - BEGIN - RIGHTMARGIN, 190 - BOTTOMMARGIN, 30 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "wolSetup" - IDS_HELLO "Hello World!" - IDC_WOLSETUP "WOLSETUP" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED -